1
00:00:00,000 --> 00:00:04,000
Nếu bạn muốn tìm hiểu về khoa học máy tính và nghệ thuật\n

2
00:00:04,000 --> 00:00:09,300
CS50 được nhiều người coi là một trong những\n

3
00:00:09,300 --> 00:00:13,000
Đây là khóa học của Đại học Harvard\do Tiến sĩ David Malan giảng dạy

4
00:00:13,000 --> 00:00:17,000
và chúng tôi tự hào mang nó đến\n

5
00:00:17,000 --> 00:00:23,000
Xuyên suốt chuỗi bài giảng, Tiến sĩ Malan sẽ dạy bạn \n

6
00:00:23,000 --> 00:00:27,300
Và hãy nhớ kiểm tra phần mô tả để biết nhiều\n

7
00:01:45,801 --> 00:01:50,281
DAVID Malan: Được rồi, đây là CS50,\n

8
00:01:50,281 --> 00:01:52,591
tới các doanh nghiệp trí tuệ của khoa học máy tính

9
00:01:52,590 --> 00:01:56,340
và nghệ thuật lập trình, quay lại đây\n

10
00:01:56,340 --> 00:01:58,410
lần đầu tiên sau một thời gian khá dài.

11
00:02:13,311 --> 00:02:16,911
Và tôi đã tự mình tham gia lớp học này\ncách đây một thời gian nhưng gần như không tham gia.

12
00:02:16,911 --> 00:02:20,121
Đó là mùa thu năm thứ hai và tôi đang ngồi trong lớp.

13
00:02:20,121 --> 00:02:22,431
Và tôi hơi tò mò\nnhưng, ờ, thực ra không phải vậy

14
00:02:24,508 --> 00:02:26,841
Tôi chắc chắn là một người\nmáy tính, nhưng khoa học máy tính

15
00:02:26,841 --> 00:02:28,314
cảm thấy như một cái gì đó hoàn toàn

16
00:02:28,313 --> 00:02:30,230
Và tôi chỉ có can đảm để tham gia lớp học

17
00:02:30,230 --> 00:02:32,870
cuối cùng, bởi vì giáo sư\na lúc đó, Brian Kernighan

18
00:02:32,871 --> 00:02:35,600
ban đầu đã cho phép tôi đạt\nlớp đạt/không đạt.

19
00:02:35,600 --> 00:02:37,490
Và đó chính là điều đã tạo nên sự khác biệt.

20
00:02:37,491 --> 00:02:39,981
Tôi nhanh chóng nhận ra rằng\nkhoa học máy tính không chỉ

21
00:02:39,980 --> 00:02:42,800
về lập trình và cách ly\nlàm việc trên máy tính của bạn.

22
00:02:42,800 --> 00:02:45,390
Nó thực sự là về việc giải quyết vấn đề một cách tổng quát hơn.

23
00:02:45,390 --> 00:02:48,080
Và có điều gì đó\nvề bài tập về nhà, thật lòng mà nói

24
00:02:48,080 --> 00:02:51,470
có lẽ điều đó thực sự thú vị\n

25
00:02:51,471 --> 00:02:53,996
Và có điều gì đó\nvề khả năng này

26
00:02:53,996 --> 00:02:56,121
mà tôi đã khám phá ra, cùng\nvới tất cả bạn cùng lớp của tôi

27
00:02:56,121 --> 00:03:00,373
để thực sự tạo ra thứ gì đó và mang lại\n

28
00:03:00,372 --> 00:03:03,080
và mang theo thứ gì đó\n

29
00:03:03,080 --> 00:03:06,260
nhưng thực sự không biết cách khai thác,\n

30
00:03:06,260 --> 00:03:08,150
và chắc chắn là đầy thử thách\nvà bực bội.

31
00:03:08,151 --> 00:03:10,753
Giống như, cho đến ngày nay,\ntất cả những năm sau đó

32
00:03:10,752 --> 00:03:13,460
bạn sắp phải đối mặt với\n

33
00:03:13,461 --> 00:03:15,111
trong lập trình, điều đó\nsẽ khiến bạn phát điên.

34
00:03:15,110 --> 00:03:16,610
Và bạn cảm thấy như mình đã va phải một bức tường.

35
00:03:16,610 --> 00:03:18,950
Nhưng mẹo thực sự là\ncho nó đủ thời gian

36
00:03:18,950 --> 00:03:21,180
lùi lại một bước, nghỉ ngơi khi bạn cần.

37
00:03:21,181 --> 00:03:24,441
Và không có gì tốt hơn, tôi dám chắc,\n

38
00:03:24,441 --> 00:03:26,169
và niềm tự hào, thực sự,\nkhi bạn nhận được thứ gì đó

39
00:03:26,169 --> 00:03:28,461
để làm việc và trong một lớp học như\nthế này, hiện diện, cuối cùng

40
00:03:28,461 --> 00:03:32,091
vào cuối học kỳ, một cái gì đó giống như\ndự án cuối cùng của chính bạn.

41
00:03:32,091 --> 00:03:35,551
Điều này không có nghĩa là\ntôi đã thực hiện nó một cách hoàn hảo 100%.

42
00:03:35,550 --> 00:03:40,760
Trên thực tế, chỉ trong tuần vừa qua, tôi đã xem\n

43
00:03:40,760 --> 00:03:43,281
có từ khoảng 25 năm trước\na và đã chụp một bức ảnh

44
00:03:43,281 --> 00:03:47,961
về những gì dường như là lần đầu tiên\n

45
00:03:47,961 --> 00:03:50,271
và nhanh chóng bị trừ 2 điểm.

46
00:03:50,270 --> 00:03:53,450
Nhưng đây là một chương trình mà chúng tôi sẽ\n

47
00:03:53,450 --> 00:03:57,740
làm điều gì đó khá đơn giản như\n

48
00:03:58,408 --> 00:04:00,200
Và công bằng mà nói,\nvề mặt kỹ thuật tôi chưa thực sự

49
00:04:00,200 --> 00:04:02,480
đã làm theo hướng dẫn\n

50
00:04:02,480 --> 00:04:05,802
Nhưng nếu bạn chỉ nhìn vào điều này, đặc biệt\n

51
00:04:05,802 --> 00:04:07,760
bạn có thể đã nghe\nvề ngôn ngữ lập trình

52
00:04:07,760 --> 00:04:09,718
nhưng bạn chưa bao giờ gõ\nthứ gì đó như thế này ra

53
00:04:09,718 --> 00:04:11,480
chắc chắn nó sẽ trông khó hiểu.

54
00:04:11,480 --> 00:04:13,520
Nhưng thành thực mà nói, không giống như ngôn ngữ của con người,

55
00:04:13,520 --> 00:04:17,480
phức tạp hơn nhiều,\nnhiều từ vựng hơn, nhiều hơn nữa

56
00:04:17,480 --> 00:04:21,620
quy tắc ngữ pháp, lập trình, một lần\n

57
00:04:21,620 --> 00:04:24,733
nó là gì và nó hoạt động như thế nào và những thứ này là gì\n

58
00:04:24,733 --> 00:04:26,900
bạn sẽ thấy, sau vài\ntháng học một lớp học như thế này

59
00:04:26,901 --> 00:04:29,001
để bắt đầu dạy\nchính mình, sau đó

60
00:04:29,000 --> 00:04:32,730
các ngôn ngữ khác, nếu chúng\ncó thể xuất hiện, trong những năm tới.

61
00:04:32,730 --> 00:04:36,050
Vậy điều quan trọng cuối cùng\trong khóa học cụ thể này

62
00:04:36,050 --> 00:04:38,690
không phải là nơi bạn kết thúc\n so với các bạn cùng lớp của bạn

63
00:04:38,690 --> 00:04:41,900
nhưng cuối cùng bạn lại có quan hệ với chính mình\n ở đâu khi bạn bắt đầu.

64
00:04:41,901 --> 00:04:43,381
Và thực sự, bạn sẽ bắt đầu ngay hôm nay.

65
00:04:43,380 --> 00:04:46,910
Và trải nghiệm duy nhất quan trọng\n

66
00:04:46,911 --> 00:04:49,040
Và vì vậy, hãy xem xét bạn đang ở đâu ngày hôm nay.

67
00:04:49,040 --> 00:04:51,531
Có lẽ hãy xem xét điều gì đó như thế\nkhó hiểu như thế nào

68
00:04:52,850 --> 00:04:56,180
Và hãy thoải mái khi biết\n

69
00:04:56,180 --> 00:04:58,408
sẽ nằm trong tầm tay của bạn.

70
00:04:58,408 --> 00:05:01,700
Và nếu bạn đang nghĩ vậy thì chắc chắn rồi\n

71
00:05:01,701 --> 00:05:05,421
ở bên phải, phía sau tôi, biết nhiều hơn\n

72
00:05:05,420 --> 00:05:10,100
2/3 sinh viên CS50 chưa từng thi\n

73
00:05:10,100 --> 00:05:14,730
bạn đang làm việc rất tốt\ntrong suốt học kỳ này.

74
00:05:14,730 --> 00:05:16,820
Vậy khoa học máy tính là gì?

75
00:05:16,821 --> 00:05:18,441
Tôi khẳng định rằng đó là giải quyết vấn đề.

76
00:05:18,440 --> 00:05:20,720
Và mặt trái của việc đó\nlà việc giải quyết vấn đề là

77
00:05:20,721 --> 00:05:23,031
một cái gì đó chúng tôi làm mọi lúc.

78
00:05:23,031 --> 00:05:25,834
Nhưng trong lớp khoa học máy tính\n, học lập trình

79
00:05:25,834 --> 00:05:27,500
Tôi nghĩ rằng loại làm sạch suy nghĩ của bạn.

80
00:05:27,500 --> 00:05:31,040
Nó giúp bạn học cách suy nghĩ nhiều hơn\n

81
00:05:32,630 --> 00:05:34,463
Bởi vì, thành thật mà nói,\nmáy tính sẽ không hoạt động

82
00:05:34,463 --> 00:05:37,670
làm những gì bạn muốn trừ khi bạn như vậy\n

83
00:05:37,670 --> 00:05:39,896
Và như vậy,\ncó những lợi ích phụ này

84
00:05:39,896 --> 00:05:42,771
chỉ là học cách suy nghĩ như một\n

85
00:05:42,771 --> 00:05:45,561
Và không cần nhiều\nđể bắt đầu làm như vậy.

86
00:05:45,560 --> 00:05:49,221
Ví dụ, đây có lẽ là\n

87
00:05:49,221 --> 00:05:51,141
chắc chắn rồi, nhưng thực sự là giải quyết được vấn đề nói chung.

88
00:05:51,141 --> 00:05:54,471
Vấn đề đều nằm ở việc lấy dữ liệu đầu vào,\n

89
00:05:54,471 --> 00:05:56,360
Bạn muốn nhận được giải pháp, hay còn gọi là

90
00:05:57,050 --> 00:05:59,750
Và như vậy, có điều gì đó thú vị\nhất định đang diễn ra ở đây

91
00:05:59,750 --> 00:06:03,240
ở đây, khi bạn đang cố gắng\nchuyển từ những đầu vào đó sang đầu ra.

92
00:06:03,240 --> 00:06:05,810
Hiện nay, trong thế giới\nmáy tính, cụ thể là

93
00:06:05,810 --> 00:06:09,680
chúng ta cần phải quyết định trước về cách chúng ta\n

94
00:06:09,680 --> 00:06:13,723
Tất cả chúng ta chỉ cần quyết định xem\n

95
00:06:13,723 --> 00:06:16,640
nếu không thì tất cả chúng ta sẽ nói chuyện\n

96
00:06:16,641 --> 00:06:18,841
ngôn ngữ của con người chúng ta nữa.

97
00:06:18,841 --> 00:06:22,550
Và bạn có thể biết rất rõ rằng\nmáy tính có xu hướng chỉ nói

98
00:06:26,740 --> 00:06:29,230
Hợp ngữ, một, nhưng nhị phân,\nhai, có thể là lựa chọn phù hợp của bạn.

99
00:06:29,230 --> 00:06:32,320
Và nhị phân, bằng cách ngụ ý hai,\ncó nghĩa là thế giới máy tính

100
00:06:32,321 --> 00:06:35,981
chỉ có hai chữ số tùy ý sử dụng, 0 và 1.

101
00:06:35,980 --> 00:06:40,060
Và thực sự, con người chúng ta còn có nhiều điều hơn thế\n

102
00:06:40,690 --> 00:06:43,120
Nhưng thực ra máy tính không có số không và số một.

103
00:06:43,120 --> 00:06:45,341
Tuy nhiên, bằng cách nào đó họ có thể làm được nhiều điều như vậy.

104
00:06:45,341 --> 00:06:47,711
Họ có thể xử lý số trong\nExcel, gửi tin nhắn văn bản

105
00:06:47,711 --> 00:06:51,081
tạo hình ảnh và tác phẩm nghệ thuật\nvà phim, v.v.

106
00:06:51,081 --> 00:06:54,790
Và vì vậy, làm thế nào bạn có được từ thứ gì đó\n

107
00:06:54,790 --> 00:06:56,920
cho tất cả những thứ\nmà chúng ta đang làm hôm nay

108
00:06:56,920 --> 00:06:58,870
trong túi, máy tính xách tay và máy tính để bàn của chúng ta?

109
00:06:58,870 --> 00:07:01,570
Chà, hóa ra\nchúng ta có thể bắt đầu khá đơn giản.

110
00:07:01,571 --> 00:07:05,471
Nếu một máy tính muốn làm\n

111
00:07:06,190 --> 00:07:09,190
Chà, trong thế giới con người của chúng ta,\nchúng ta có thể tính việc làm này

112
00:07:09,190 --> 00:07:13,778
như 1, 2, 3, 4, 5, sử dụng cái gọi là\n

113
00:07:13,778 --> 00:07:16,570
trên ngón tay của bạn nơi một ngón tay\n

114
00:07:16,571 --> 00:07:18,521
ví dụ như nếu tôi đang tham dự.

115
00:07:18,521 --> 00:07:22,600
Con người chúng ta thường đếm 1, 2, 3, 4, 5, 6.

116
00:07:22,600 --> 00:07:25,480
Và chúng ta sẽ chỉ vượt qua năm\nchữ số đó và đếm cao hơn nhiều

117
00:07:26,951 --> 00:07:29,871
Nhưng máy tính, bằng cách nào đó, chỉ có những số 0 và 1 này.

118
00:07:29,870 --> 00:07:33,190
Vì vậy, nếu một máy tính bằng cách nào đó\nnói đến hệ nhị phân, số không và số một

119
00:07:33,190 --> 00:07:36,180
làm sao nó đếm được\nvượt qua số 1?

120
00:07:36,180 --> 00:07:38,740
Vâng, tất nhiên đây là 3 số không.

121
00:07:38,740 --> 00:07:42,250
Và nếu bạn dịch\nsố này sang dạng nhị phân, 000

122
00:07:42,250 --> 00:07:46,150
sang một số quen thuộc hơn ở dạng thập phân,\n

123
00:07:47,021 --> 00:07:49,871
Nếu chúng ta biểu diễn, bằng\na máy tính, số 1

124
00:07:49,870 --> 00:07:52,930
thực ra nó sẽ là 001,\nđiều này không có gì đáng ngạc nhiên

125
00:07:52,930 --> 00:07:55,990
hoàn toàn giống như những gì chúng ta có thể làm trong thế giới con người

126
00:07:55,990 --> 00:07:59,500
nhưng chúng tôi có thể không bận tâm đến việc viết\n

127
00:07:59,500 --> 00:08:02,170
Nhưng bây giờ, một chiếc máy tính, nếu nó\nmuốn đếm cao tới hai

128
00:08:03,701 --> 00:08:06,431
Và do đó, nó phải sử dụng một\nmẫu số 0 và số 1 khác.

129
00:08:08,620 --> 00:08:10,810
Vậy đây không phải là 10 với\na số 0 ở phía trước.

130
00:08:10,810 --> 00:08:13,281
Nó thực sự là 0 một 0\trong bối cảnh nhị phân.

131
00:08:13,281 --> 00:08:15,401
Và nếu bây giờ chúng ta muốn đếm\ncao hơn hai

132
00:08:15,401 --> 00:08:19,540
chúng ta sẽ phải điều chỉnh những thứ này\n

133
00:08:19,540 --> 00:08:24,011
Và sau đó nếu chúng ta muốn 4\hay 5 hoặc 6 hoặc 7, chúng ta

134
00:08:24,011 --> 00:08:26,921
chỉ cần chuyển đổi những\nsố 0 và số 1 này, hay còn gọi là.

135
00:08:26,920 --> 00:08:31,408
bit, cho các chữ số nhị phân biểu thị,\n

136
00:08:31,408 --> 00:08:33,490
những con số khác nhau mà bạn\và tôi, với tư cách là con người, biết

137
00:08:33,490 --> 00:08:36,730
tất nhiên, như cái gọi là\nhệ thập phân, từ 0 đến 9

138
00:08:36,730 --> 00:08:40,390
tháng 12 ngụ ý 10, 10 chữ số,\ncác số 0 đến 9.

139
00:08:40,390 --> 00:08:42,760
Vậy tại sao lại có mô hình cụ thể đó?

140
00:08:42,760 --> 00:08:44,680
Và tại sao lại có những số 0 và số 1 đặc biệt này?

141
00:08:44,681 --> 00:08:48,011
Chà, hóa ra\nđại diện cho thứ này hay thứ khác

142
00:08:48,010 --> 00:08:50,360
thực sự rất đơn giản đối với một chiếc máy tính.

143
00:08:50,860 --> 00:08:53,110
Vào cuối ngày, họ\nđược cung cấp năng lượng bằng điện.

144
00:08:53,110 --> 00:08:56,081
Và đó là một điều thực sự đơn giản\n

145
00:08:56,081 --> 00:08:57,791
hoặc không lưu trữ một số điện.

146
00:08:57,791 --> 00:09:00,911
Giống như, điều đó đơn giản\nthế giới có thể làm được, bật hoặc tắt.

147
00:09:03,110 --> 00:09:05,821
Vì vậy, trên thực tế, bên trong\nmáy tính, điện thoại, bất cứ thứ gì

148
00:09:05,821 --> 00:09:07,571
ngày nay hầu như là điện tử

149
00:09:07,571 --> 00:09:10,763
là một số công tắc,\hay còn gọi là bóng bán dẫn.

150
00:09:11,471 --> 00:09:14,852
Bạn có hàng nghìn, hàng triệu trong số đó\n

151
00:09:14,852 --> 00:09:17,810
Và đây chỉ là những công tắc nhỏ bé\n

152
00:09:17,811 --> 00:09:20,471
Và bằng cách tắt những thứ đó\không theo kiểu mẫu

153
00:09:20,471 --> 00:09:24,274
một máy tính có thể đếm từ 0 trở lên\n

154
00:09:24,274 --> 00:09:27,191
Và những công tắc này, thực sự, bạn\n

155
00:09:27,691 --> 00:09:29,983
Cho tôi mượn một trong những chiếc đèn sân khấu nhỏ ở đây nhé.

156
00:09:32,260 --> 00:09:34,690
Và vì thế, tôi có thể coi\nđiều này như là đại diện

157
00:09:34,691 --> 00:09:38,110
trong máy tính xách tay của tôi, một bóng bán dẫn,\na công tắc, đại diện cho 0.

158
00:09:38,110 --> 00:09:43,120
Nhưng nếu tôi cho phép một chút điện\n

159
00:09:43,120 --> 00:09:44,730
Vâng, làm thế nào để tôi đếm cao hơn 1?

160
00:09:44,730 --> 00:09:46,341
Tất nhiên là tôi cần một bóng đèn khác.

161
00:09:46,341 --> 00:09:48,531
Vì vậy, hãy để tôi lấy một cái khác ở đây.

162
00:09:48,530 --> 00:09:53,350
Và nếu tôi đặt nó vào cùng loại\n

163
00:09:53,350 --> 00:09:57,140
Đó là kiểu đếm ngón tay cũ\nmột ngôi, chỉ 1, 2.

164
00:09:57,140 --> 00:09:59,140
Tôi thực sự muốn tính đến khuôn mẫu

165
00:09:59,140 --> 00:10:00,680
những thứ này đang bật và tắt.

166
00:10:00,681 --> 00:10:06,730
Vì vậy, nếu đây là một khoảnh khắc trước đây, những gì tôi\n

167
00:10:06,730 --> 00:10:10,660
và để cái tiếp theo được bật, hay còn gọi là

168
00:10:12,071 --> 00:10:15,110
Và hãy để tôi lấy cho chúng ta miếng thứ ba, nếu bạn muốn.

169
00:10:16,600 --> 00:10:20,440
Bây giờ đây là mẫu tương tự,\nbắt đầu từ đầu bằng 3.

170
00:10:25,721 --> 00:10:32,770
Đây là 010, hay còn gọi là, trong thế giới thập phân\nhân loại của chúng ta, 2.

171
00:10:32,770 --> 00:10:35,170
Và tất nhiên, sau đó chúng ta có thể\ntiếp tục đếm xa hơn.

172
00:10:35,171 --> 00:10:37,941
Bây giờ nó sẽ là 3 và dot dot dot.

173
00:10:37,941 --> 00:10:40,870
Nếu bóng đèn kia bây giờ tắt\non và công tắc đó được bật

174
00:10:40,870 --> 00:10:43,360
và cả ba đều ở lại--\nmột lần nữa, đây là số mấy?

175
00:10:45,581 --> 00:10:49,811
Vì vậy,\ncũng đơn giản thôi,\ntương đối, nếu bạn muốn.

176
00:10:49,811 --> 00:10:53,980
Nhưng làm thế nào mà những\nmô hình này lại hình thành?

177
00:10:53,980 --> 00:10:56,806
Chà, những mẫu này thực ra\ntheo một cái gì đó rất quen thuộc.

178
00:10:56,806 --> 00:10:58,931
Bạn và tôi thực sự không nghĩ về nó ở cấp độ này

179
00:10:58,931 --> 00:11:02,801
nữa vì có lẽ chúng ta đã từng\n

180
00:11:04,270 --> 00:11:09,160
Nhưng nếu chúng ta xem xét thứ gì đó dưới dạng thập phân, như số 123

181
00:11:10,301 --> 00:11:12,971
Số này trông giống như 123 ở dạng thập phân.

182
00:11:13,660 --> 00:11:17,800
Thực ra đó chỉ là ba biểu tượng,\n

183
00:11:17,801 --> 00:11:20,291
với một vài đường cong,\nbạn và tôi bây giờ theo bản năng

184
00:11:22,150 --> 00:11:27,000
Nhưng nếu chúng ta tua lại một vài năm,\n

185
00:11:27,000 --> 00:11:30,480
bởi vì bạn đang gán ý nghĩa\ncho từng cột này.

186
00:11:30,480 --> 00:11:33,331
Số 3 nằm ở vị trí được gọi là số một.

187
00:11:33,331 --> 00:11:36,931
Số 2 nằm ở vị trí được gọi là hàng chục.

188
00:11:36,931 --> 00:11:39,841
Và số 1 nằm ở vị trí\nđược gọi là hàng trăm.

189
00:11:39,841 --> 00:11:41,850
Và sau đó phép toán xuất hiện\nnhanh chóng trong đầu bạn.

190
00:11:41,850 --> 00:11:47,311
Về mặt kỹ thuật thì đây là 100 lần 1, cộng thêm\n

191
00:11:48,990 --> 00:11:54,390
Và ở đó chúng ta có được một loại khái niệm toán học mà chúng ta gọi là 123.

192
00:11:54,390 --> 00:11:58,570
Chà, khá hay, ở dạng nhị phân,\nit thực sự giống như vậy.

193
00:11:58,571 --> 00:12:01,021
Chỉ là những cột này có ý nghĩa\na hơi khác một chút.

194
00:12:01,020 --> 00:12:05,010
Nếu bạn sử dụng ba chữ số trong số thập phân,\nvà bạn có hàng đơn vị

195
00:12:05,010 --> 00:12:09,331
hàng chục và hàng trăm,\n

196
00:12:09,331 --> 00:12:11,230
Về mặt kỹ thuật, chúng chỉ là lũy thừa của 10.

197
00:12:11,230 --> 00:12:13,620
Vậy 10 ăn 0, 10 ăn 1, 10 ăn 2.

198
00:12:14,520 --> 00:12:16,440
Hệ thập phân, "dec" nghĩa là 10.

199
00:12:16,441 --> 00:12:18,841
Bạn có 8 và 10 chữ số, từ 0 đến 9.

200
00:12:18,841 --> 00:12:21,390
Trong hệ nhị phân, nếu bạn\nđịnh sử dụng ba chữ số

201
00:12:21,390 --> 00:12:24,910
chỉ cần thay đổi cơ số nếu bạn chỉ sử dụng số không và số một.

202
00:12:24,910 --> 00:12:29,130
Vậy bây giờ nó là lũy thừa của 2, 2 mũ\n

203
00:12:31,900 --> 00:12:36,120
Và nếu bạn tiếp tục thì nó sẽ tiếp tục\n

204
00:12:37,510 --> 00:12:40,260
Vậy tại sao chúng tôi lại có\nnhững mẫu này?

205
00:12:40,260 --> 00:12:46,290
Đây là 000 của bạn vì nó gấp 4 lần\n

206
00:12:46,291 --> 00:12:49,471
Đây là lý do tại sao chúng ta có\nsố thập phân 1 ở dạng nhị phân.

207
00:12:49,471 --> 00:12:53,341
Đây là lý do tại sao chúng ta có số nhị phân 2\nin, vì nó gấp 4 lần

208
00:12:53,341 --> 00:13:01,051
0, cộng 2 nhân 1, cộng 1 nhân 0, và\n

209
00:13:01,831 --> 00:13:05,373
Và tất nhiên, nếu bạn muốn\n

210
00:13:06,331 --> 00:13:08,831
Máy tính cần\nlàm gì để đếm cao hơn 7?

211
00:13:10,880 --> 00:13:12,530
Thêm một bóng đèn khác, một công tắc khác.

212
00:13:12,530 --> 00:13:14,810
Và quả thật, máy tính đã chuẩn hóa cách thức

213
00:13:14,811 --> 00:13:17,240
nhiều số không và số một,\cũng không phải bit hoặc công tắc

214
00:13:17,240 --> 00:13:19,020
họ ném vào những loại vấn đề này.

215
00:13:19,020 --> 00:13:23,300
Và trên thực tế, hầu hết các máy tính sẽ\n

216
00:13:23,301 --> 00:13:25,971
Và ngay cả khi bạn chỉ đếm\nas cao đến ba hoặc bảy

217
00:13:25,971 --> 00:13:28,431
bạn vẫn sẽ sử dụng số 8 và\ncó cả đống số không.

218
00:13:28,431 --> 00:13:31,551
Nhưng không sao cả, vì\nmáy tính ngày nay chắc chắn

219
00:13:31,551 --> 00:13:35,301
còn rất nhiều nữa, hàng ngàn,\n

220
00:13:37,921 --> 00:13:41,671
Được rồi, như đã nói, nếu\n

221
00:13:41,671 --> 00:13:44,161
hoặc, thẳng thắn mà nói, theo mức độ chúng tôi muốn, chỉ điều đó

222
00:13:44,160 --> 00:13:46,770
dường như làm cho máy tính\có ích cho những thứ như Excel

223
00:13:48,030 --> 00:13:50,280
Nhưng tất nhiên, máy tính\ncho phép bạn gửi tin nhắn văn bản

224
00:13:50,280 --> 00:13:52,240
viết tài liệu, và nhiều hơn nữa.

225
00:13:52,240 --> 00:13:55,530
Vậy làm thế nào một máy tính có thể biểu diễn\nthứ gì đó giống như một chữ cái

226
00:13:55,530 --> 00:13:59,860
giống như chữ A trong tiếng Anh\n

227
00:14:03,721 --> 00:14:05,961
ĐỐI TƯỢNG: Bạn có thể biểu thị\ncác chữ cái bằng số.

228
00:14:05,961 --> 00:14:08,571
DAVID Malan: Được rồi, vậy chúng ta có thể\nbiểu diễn các chữ cái bằng cách sử dụng các con số.

229
00:14:10,004 --> 00:14:11,421
Số nào nên đại diện cho cái gì?

230
00:14:11,421 --> 00:14:15,221
ĐỐI TƯỢNG: Giả sử bạn đang bắt đầu\n

231
00:14:15,221 --> 00:14:18,745
bạn có thể nói 1 là A, 2 là B, 3 là C.

232
00:14:19,620 --> 00:14:22,630
Vâng, tất cả chúng ta đều phải đồng ý\nbằng cách nào đó một con số là

233
00:14:22,630 --> 00:14:23,880
sẽ đại diện cho một chữ cái.

234
00:14:23,880 --> 00:14:28,490
Vậy 1 là A, 2 là B, 3 là\nC, Z là 26, v.v.

235
00:14:28,490 --> 00:14:30,990
Có lẽ chúng ta thậm chí có thể tính đến\nchữ hoa và chữ thường.

236
00:14:30,990 --> 00:14:34,230
Chúng ta chỉ cần đồng ý và đại loại\n

237
00:14:34,230 --> 00:14:36,461
Và quả thật con người đã làm được điều đó.

238
00:14:38,010 --> 00:14:40,110
Hóa ra họ bắt đầu ở vị trí cao hơn một chút.

239
00:14:40,110 --> 00:14:44,130
Chữ A đã được\nchuẩn hóa thành số 65.

240
00:14:44,130 --> 00:14:47,581
Và chữ B đã được\nchuẩn hóa thành số 66.

241
00:14:47,581 --> 00:14:50,370
Và bạn có thể tưởng tượng\nnó sẽ đi lên như thế nào từ đó.

242
00:14:50,370 --> 00:14:53,250
Và đó là bởi vì bất cứ điều gì\nbạn đang đại diện

243
00:14:53,250 --> 00:14:57,461
cuối cùng, chỉ có thể được lưu trữ, tại\n

244
00:14:57,461 --> 00:15:01,110
Và như vậy, một số người ở trong phòng trước đó,\n

245
00:15:01,110 --> 00:15:05,100
hoặc thực sự là mẫu số 0 này\n

246
00:15:08,791 --> 00:15:12,481
Vì vậy, nếu kiểu số 0 và\không đó xuất hiện trong máy tính

247
00:15:12,480 --> 00:15:17,910
thì nó có thể được hiểu là thực sự\n

248
00:15:18,811 --> 00:15:23,191
Nhưng tôi lo lắng, nói rõ hơn, chúng ta\n

249
00:15:23,191 --> 00:15:25,681
Có vẻ như, nếu tôi chơi\nngây thơ thế này, thế nọ, OK

250
00:15:25,681 --> 00:15:28,860
bây giờ tôi thực sự làm\ntoán với số 65 như thế nào?

251
00:15:28,860 --> 00:15:33,571
Nếu bây giờ Excel hiển thị 65 là\nan A, chứ chưa nói đến Bs và Cs.

252
00:15:33,571 --> 00:15:37,230
Vậy làm thế nào một chiếc máy tính\ncó thể thực hiện được những gì bạn đề xuất

253
00:15:37,230 --> 00:15:41,875
có ánh xạ này từ số tới\n

254
00:15:41,875 --> 00:15:43,500
Cảm giác như chúng ta đã từ bỏ điều gì đó.

255
00:15:44,000 --> 00:15:46,262
ĐỐI TƯỢNG: Bằng cách có\na tiền tố cho các chữ cái?

256
00:15:46,263 --> 00:15:47,596
DAVID Malan: Bằng cách có một tiền tố?

257
00:15:47,596 --> 00:15:48,887
ĐỐI TƯỢNG: Bạn có thể có\ntiền tố và hậu tố.

258
00:15:48,886 --> 00:15:51,640
DAVID Malan: Được rồi, vậy\ncó lẽ chúng ta có thể có một loại tiền tố nào đó

259
00:15:51,640 --> 00:15:53,230
giống như một số mẫu số không và số một--

260
00:15:53,230 --> 00:15:56,201
Tôi thích cái này-- cái đó\chỉ ra máy tính

261
00:15:56,201 --> 00:15:58,870
ở đây có một mẫu khác\nđại diện cho một chữ cái.

262
00:15:58,870 --> 00:16:02,920
Ở đây có một mẫu khác\nbiểu thị một số hoặc một chữ cái.

263
00:16:05,620 --> 00:16:08,480
Làm thế nào một máy tính có thể phân biệt được hai điều này?

264
00:16:08,980 --> 00:16:11,360
ĐỐI TƯỢNG: Có\nđịnh dạng tệp khác nhau, vì vậy

265
00:16:11,360 --> 00:16:16,120
như, văn bản lẻ hoặc chỉ\nkiểm tra đồ họa hoặc--

266
00:16:16,120 --> 00:16:17,841
DAVID Malan: Quả thực, và điều đó hoàn toàn chính xác.

267
00:16:17,841 --> 00:16:20,781
Không có gì sai với những gì bạn đề xuất,\n

268
00:16:20,780 --> 00:16:23,613
Lý do chúng tôi có tất cả những thứ này\n

269
00:16:23,614 --> 00:16:28,521
như các tài liệu JPEG, GIF và PNG\nand Word, .docx

270
00:16:28,520 --> 00:16:32,270
và các tệp Excel, v.v., là\n

271
00:16:32,270 --> 00:16:35,780
và đã quyết định, à, trong bối cảnh\n

272
00:16:35,780 --> 00:16:38,600
cụ thể hơn, trong\nbối cảnh của loại chương trình này

273
00:16:38,600 --> 00:16:42,140
Excel so với Photoshop so với\nGoogle Tài liệu hoặc tương tự

274
00:16:42,140 --> 00:16:46,550
chúng tôi sẽ giải thích bất kỳ mẫu nào của\n

275
00:16:46,551 --> 00:16:51,051
đối với Excel, có thể là các chữ cái trong, như, a\n

276
00:16:51,051 --> 00:16:54,471
hoặc thậm chí có thể là màu sắc của cầu vồng\n

277
00:16:55,610 --> 00:16:58,490
Và chúng ta sẽ thấy, khi chúng ta bắt đầu lập trình

278
00:16:58,490 --> 00:17:00,471
bạn, lập trình viên\ncuối cùng sẽ cung cấp

279
00:17:00,471 --> 00:17:05,671
một số gợi ý cho máy tính biết\n

280
00:17:05,671 --> 00:17:08,631
Vì vậy, về mặt tinh thần cũng tương tự như vậy, nhưng\n

281
00:17:09,260 --> 00:17:12,651
Vậy hệ thống này ở đây thực sự có một\n

282
00:17:12,651 --> 00:17:14,421
Mã trao đổi thông tin.

283
00:17:14,421 --> 00:17:16,760
Và quả thực, nó đã bắt đầu ở đây\tại Hoa Kỳ, và đó là

284
00:17:16,760 --> 00:17:19,550
tại sao nó thực sự hơi thiên về từ A đến Z

285
00:17:19,550 --> 00:17:21,300
và một chút dấu câu.

286
00:17:21,300 --> 00:17:22,920
Và điều đó nhanh chóng trở thành một vấn đề.

287
00:17:22,921 --> 00:17:26,780
Nhưng nếu chúng ta bắt đầu đơn giản ngay bây giờ,\nin tiếng Anh, việc lập bản đồ

288
00:17:26,780 --> 00:17:28,860
bản thân nó khá đơn giản.

289
00:17:28,861 --> 00:17:33,291
Vì vậy, nếu A là 65, B là 66,\nand dot dot dot, giả sử

290
00:17:33,290 --> 00:17:36,020
rằng bạn đã nhận được một tin nhắn\ntin nhắn, một email từ một người bạn

291
00:17:36,020 --> 00:17:39,080
và bên dưới mui xe,\ncó thể nói, nếu bạn đại loại

292
00:17:39,080 --> 00:17:42,740
nhìn vào bên trong máy tính, bạn\n

293
00:17:42,740 --> 00:17:48,080
hoặc email này tình cờ lại là các số 72, 73, 33

294
00:17:48,080 --> 00:17:50,810
hoặc thực sự là mẫu\n cơ bản của số không và số một.

295
00:17:50,810 --> 00:17:56,376
Bạn của bạn có thể đã gửi gì cho bạn\n

296
00:18:02,280 --> 00:18:06,780
Chà, có vẻ như, theo điều này\n

297
00:18:06,780 --> 00:18:09,421
\nBiểu đồ này không thể hiện rõ số 33 là gì

298
00:18:09,421 --> 00:18:11,520
nhưng quả thực,\nmẫu này đại diện cho "hi.

299
00:18:11,520 --> 00:18:13,773
Và có ai muốn đoán không,\và nếu bạn biết thì 33 là bao nhiêu?

300
00:18:13,773 --> 00:18:14,940
ĐỐI TƯỢNG: Dấu chấm than.

301
00:18:14,941 --> 00:18:16,020
DAVID Malan: Dấu chấm than.

302
00:18:16,020 --> 00:18:18,562
Và thành thật mà nói, đây không phải là thứ mà hầu hết mọi người đều biết.

303
00:18:18,563 --> 00:18:22,241
Nhưng nó có thể dễ dàng truy cập bởi\n

304
00:18:23,671 --> 00:18:26,431
Khi tôi nói rằng chúng ta chỉ cần\n

305
00:18:27,510 --> 00:18:29,302
Họ đã viết nó ra trong một cuốn sách hoặc trong một biểu đồ.

306
00:18:29,303 --> 00:18:33,961
Và, ví dụ, đây là\n72 của chúng ta cho H, đây là 73 của chúng ta cho I

307
00:18:33,961 --> 00:18:37,861
và đây là dấu chấm than 33\ncủa chúng tôi.

308
00:18:37,861 --> 00:18:41,191
Và máy tính, máy Mac, PC,\niPhone, thiết bị Android

309
00:18:41,191 --> 00:18:43,721
chỉ cần thuộc lòng bản đồ\nnày nếu bạn muốn.

310
00:18:43,721 --> 00:18:46,451
Chúng được thiết kế để\nhiểu được những chữ cái đó.

311
00:18:46,451 --> 00:18:48,121
Vì vậy, ở đây, tôi có thể đã nhận được "hi.

312
00:18:48,121 --> 00:18:51,750
Về mặt kỹ thuật, những gì tôi nhận được là\n

313
00:18:51,750 --> 00:18:54,960
Nhưng điều quan trọng cần lưu ý là khi\n

314
00:18:54,960 --> 00:18:58,020
ở bất kỳ định dạng nào, có thể là\nemail hoặc văn bản hoặc tệp

315
00:18:58,020 --> 00:19:00,661
chúng có xu hướng đạt đến độ dài tiêu chuẩn

316
00:19:00,661 --> 00:19:04,351
với một số\nsố 0 nhất định và toàn bộ là số 1.

317
00:19:04,351 --> 00:19:07,200
Và điều này xảy ra là 8 cộng 8, cộng 8.

318
00:19:07,200 --> 00:19:10,561
Vì vậy, chỉ để nhận được tin nhắn\n"xin chào, dấu chấm than

319
00:19:10,560 --> 00:19:15,000
bạn có thể đã nhận được ít nhất\nit dường như là khoảng 24 bit.

320
00:19:15,000 --> 00:19:18,330
Nhưng thành thật mà nói, bit rất nhỏ,\ntheo nghĩa đen và toán học

321
00:19:18,330 --> 00:19:21,060
mà chúng ta không có xu hướng nghĩ hoặc\n

322
00:19:21,060 --> 00:19:23,370
Có lẽ bạn\nquen thuộc hơn với byte.

323
00:19:23,371 --> 00:19:27,480
B-Y-T-E-S là một byte,\nis một byte, là một byte.

324
00:19:29,340 --> 00:19:32,373
Và thậm chí cả những điều đó, thành thật mà nói, không phải\n

325
00:19:32,374 --> 00:19:34,290
Bạn có thể đếm được bao nhiêu\nnếu bạn có 8 bit?

326
00:19:39,270 --> 00:19:42,570
Trừ khi bạn muốn đi\ntiêu cực, không sao cả.

327
00:19:45,151 --> 00:19:48,631
Nói tóm lại, nếu chúng ta thực sự có được\n

328
00:19:48,631 --> 00:19:54,061
và những cái đó, và chúng tôi đã tìm ra điều gì\n

329
00:19:54,060 --> 00:19:57,570
sang số thập phân thì thực sự nó phải là 255 hoặc ít hơn

330
00:19:57,570 --> 00:20:00,280
nếu bạn cũng muốn biểu diễn\nsố âm.

331
00:20:00,280 --> 00:20:04,140
Vì vậy, điều này rất hữu ích vì bây giờ chúng ta có thể\n

332
00:20:04,141 --> 00:20:06,811
nhưng, nếu các tệp lớn hơn,\nkilobytes là hàng nghìn byte

333
00:20:06,810 --> 00:20:10,590
megabyte là hàng triệu byte,\ngigabyte là hàng tỷ byte

334
00:20:10,590 --> 00:20:14,080
terabyte là hàng nghìn tỷ\no byte, v.v.

335
00:20:14,080 --> 00:20:20,520
Chúng tôi có vốn từ vựng cho những điều này\n

336
00:20:20,520 --> 00:20:24,350
Vấn đề là ở chỗ, nếu bạn đang sử dụng\n

337
00:20:24,351 --> 00:20:27,801
byte cho mỗi ký tự, và\nban đầu chỉ có bảy byte, bạn

338
00:20:27,800 --> 00:20:30,390
chỉ có thể đại diện cho 255 ký tự.

339
00:20:30,391 --> 00:20:33,980
Và đó thực sự là tổng cộng 256\nký tự, bao gồm cả số 0.

340
00:20:33,980 --> 00:20:37,790
Và điều đó không sao nếu bạn đang sử dụng\ntiếng Anh theo nghĩa đen, trong trường hợp này

341
00:20:39,141 --> 00:20:42,081
Nhưng có rất nhiều ngôn ngữ của con người trên thế giới

342
00:20:42,080 --> 00:20:45,410
cần nhiều ký hiệu hơn\nvà do đó cần nhiều bit hơn.

343
00:20:45,411 --> 00:20:48,291
Vì vậy, thật may mắn, thế giới\nđã quyết định rằng chúng ta thực sự sẽ

344
00:20:48,290 --> 00:20:51,441
hỗ trợ không chỉ bàn phím tiếng Anh\nMỹ mà còn hỗ trợ tất cả

345
00:20:51,441 --> 00:20:54,500
của các ký tự có dấu\n

346
00:20:54,500 --> 00:20:57,740
Và chết tiệt, nếu chúng ta sử dụng đủ\nbit, số không và số một

347
00:20:57,740 --> 00:21:01,730
chúng ta không chỉ có thể biểu diễn tất cả\nngôn ngữ của con người dưới dạng chữ viết

348
00:21:01,730 --> 00:21:03,651
cũng như một số cảm xúc\trong quá trình thực hiện, chúng tôi

349
00:21:03,651 --> 00:21:06,621
có thể nắm bắt được cái sau bằng\nnhững thứ được gọi là biểu tượng cảm xúc.

350
00:21:06,621 --> 00:21:09,230
Và thực sự, những thứ này rất\n đang thịnh hành ngày nay.

351
00:21:09,230 --> 00:21:12,951
Bạn có thể gửi và/hoặc nhận\n

352
00:21:12,951 --> 00:21:16,520
Đây chỉ là các ký tự, như\ncác chữ cái trong bảng chữ cái, mẫu

353
00:21:16,520 --> 00:21:20,570
của số không và số mà bạn đang nhận được,\n

354
00:21:20,570 --> 00:21:22,690
Ví dụ: có\na một số biểu tượng cảm xúc nhất định

355
00:21:22,691 --> 00:21:24,721
được biểu diễn bằng\ncác mẫu bit nhất định.

356
00:21:24,721 --> 00:21:28,070
Và khi bạn nhận được chúng,\n của bạn

357
00:21:30,000 --> 00:21:32,780
Và tiêu chuẩn mới hơn này\nis được gọi là Unicode.

358
00:21:32,780 --> 00:21:35,270
Vì vậy, đây là tập hợp lớn\nmà chúng tôi gọi là ASCII.

359
00:21:35,270 --> 00:21:39,951
Và Unicode chỉ là sự ánh xạ của nhiều\n

360
00:21:39,951 --> 00:21:42,320
hoặc các ký tự,\nnói chung, điều đó có thể

361
00:21:42,320 --> 00:21:45,140
sử dụng 8 bit để có khả năng tương thích ngược\n

362
00:21:45,141 --> 00:21:49,821
với cách làm việc cũ với\n

363
00:21:49,820 --> 00:21:51,680
Và nếu bạn có 16\nbit, bạn thực sự có thể

364
00:21:51,681 --> 00:21:54,713
đại diện cho hơn\n65.000 chữ cái có thể.

365
00:21:54,713 --> 00:21:55,880
Và nó đang tiến lên đó.

366
00:21:55,881 --> 00:22:01,341
Và chết tiệt, Unicode thậm chí có thể sử dụng 32\n

367
00:22:01,340 --> 00:22:03,230
và các ký hiệu chấm câu và biểu tượng cảm xúc.

368
00:22:03,230 --> 00:22:06,411
Và điều đó sẽ mang lại cho bạn\ntới 4 tỷ khả năng.

369
00:22:06,411 --> 00:22:09,980
Và, tôi dám chắc, một trong những lý do chúng ta\n

370
00:22:11,060 --> 00:22:14,060
Ý tôi là, chúng tôi có chỗ cho\nhàng tỷ USD nữa, theo đúng nghĩa đen.

371
00:22:14,060 --> 00:22:16,280
Vì vậy, trên thực tế, chỉ là\nmột chút chuyện vặt

372
00:22:16,280 --> 00:22:21,500
có ai đã từng nhận được số thập phân này chưa\n

373
00:22:21,500 --> 00:22:25,971
có ai từng nhận được mẫu này chưa\n

374
00:22:25,971 --> 00:22:29,070
trong một tin nhắn hoặc một email,\ncó lẽ là vào năm ngoái?

375
00:22:29,070 --> 00:22:33,951
Chà, nếu bạn thực sự tra cứu điều này,\n

376
00:22:33,951 --> 00:22:37,131
tình cờ đại diện\nkhuôn mặt với khẩu trang y tế.

377
00:22:37,131 --> 00:22:40,941
Và lưu ý rằng nếu bạn có\nan iPhone hoặc thiết bị Android

378
00:22:40,941 --> 00:22:43,290
bạn có thể đang nhìn thấy những thứ khác nhau.

379
00:22:43,290 --> 00:22:46,580
Trên thực tế, đây là phiên bản Android\ncủa phiên bản này gần đây nhất.

380
00:22:46,580 --> 00:22:49,221
Đây là phiên bản iOS\no của nó, gần đây nhất.

381
00:22:49,221 --> 00:22:51,891
Và còn rất nhiều cách giải thích khác của các công ty khác

382
00:22:53,040 --> 00:22:55,730
Vì vậy, Unicode, với tư cách là một\nconsortium, nếu bạn muốn

383
00:22:55,730 --> 00:22:58,861
đã chuẩn hóa các mô tả\nvề những thứ này là gì.

384
00:22:58,861 --> 00:23:02,391
Nhưng bản thân các công ty,\ncác nhà sản xuất ngoài kia

385
00:23:02,391 --> 00:23:05,000
nói chung đã diễn giải\nit theo cách bạn thấy phù hợp.

386
00:23:05,000 --> 00:23:08,330
Và điều này có thể dẫn đến một số\nthông tin sai lệch của con người.

387
00:23:08,330 --> 00:23:11,870
Trên thực tế, thích, theo nghĩa đen,\n

388
00:23:11,871 --> 00:23:14,781
Tôi bắt đầu có thói quen\n

389
00:23:14,780 --> 00:23:17,820
như thế này bởi vì tôi nghĩ nó như vậy\n

390
00:23:17,820 --> 00:23:19,760
Tôi đã không nhận ra đây\là biểu tượng cảm xúc cho cái ôm

391
00:23:19,760 --> 00:23:24,350
bởi vì bất kể thiết bị nào tôi đang sử dụng\n

392
00:23:24,351 --> 00:23:27,171
Và đó là do cách diễn giải dữ liệu của họ.

393
00:23:27,171 --> 00:23:31,551
Điều này cũng đã xảy ra khi\ncái vốn là một khẩu súng trở thành nước

394
00:23:31,550 --> 00:23:33,590
súng lục trong mắt một số nhà sản xuất.

395
00:23:33,590 --> 00:23:37,971
Và đó là một sự phân đôi thú vị\n

396
00:23:37,971 --> 00:23:42,500
muốn đại diện và cách chúng ta\n

397
00:23:42,500 --> 00:23:45,891
Sau đó, hãy đặt câu hỏi về những\ncách trình bày các định dạng này

398
00:23:45,891 --> 00:23:49,021
có thể là số hoặc chữ cái, hoặc sớm hơn.

399
00:23:49,520 --> 00:23:52,140
ĐỐI TƯỢNG: Tại sao số thập phân\nphổ biến cho máy tính

400
00:23:52,141 --> 00:23:54,739
nếu nhị phân là nền tảng cho mọi thứ?

401
00:23:54,739 --> 00:23:56,530
DAVID Malan: Xin lỗi,\ntại sao thứ này lại phổ biến đến thế?

402
00:23:56,530 --> 00:23:59,310
ĐỐI TƯỢNG: Tại sao số thập phân lại phổ biến\n

403
00:23:59,310 --> 00:24:01,900
DAVID Malan: Vâng, vậy chúng tôi sẽ đến\n

404
00:24:01,901 --> 00:24:03,811
Có nhiều cách khác\nđể biểu thị số.

405
00:24:07,171 --> 00:24:12,480
Và hệ thập lục phân vẫn là một phần tư\n

406
00:24:12,480 --> 00:24:15,540
qua 9 cộng với A, B, C,\nD, E, F. Và bằng cách nào đó

407
00:24:15,540 --> 00:24:18,600
bạn có thể đếm tương tự\nthậm chí cao hơn với những thứ đó.

408
00:24:18,601 --> 00:24:21,121
Chúng ta sẽ biết sau vài tuần\ntại sao điều này lại hấp dẫn.

409
00:24:21,121 --> 00:24:24,781
Nhưng hệ thập lục phân, câu chuyện dài\nngắn gọn, sử dụng bốn bit cho mỗi chữ số.

410
00:24:24,780 --> 00:24:28,290
Và như vậy, bốn bit, nếu bạn có hai\n

411
00:24:28,290 --> 00:24:30,810
Và nó chỉ là một đơn vị đo lường rất\ntiện lợi.

412
00:24:30,810 --> 00:24:34,140
Và đó cũng là quy ước của con người trong\n

413
00:24:34,141 --> 00:24:35,874
Nhưng chúng ta sẽ quay lại vấn đề đó sớm thôi.

414
00:24:36,540 --> 00:24:39,923
KHÁN GIẢ: Có phải ánh đèn trên sân khấu\nnói lên điều đó--

415
00:24:39,923 --> 00:24:42,590
DAVID Malan: Những ánh đèn trên sân khấu\ncó thể nói lên điều gì không?

416
00:24:42,590 --> 00:24:46,310
Chà, nếu chúng ta nghĩ trước\ncó thể sử dụng 64 bóng đèn

417
00:24:46,310 --> 00:24:51,650
điều đó dường như mang lại cho chúng ta tổng cộng 8\nbyte trên sân khấu, 8 nhân 8

418
00:24:55,171 --> 00:24:58,447
Các câu hỏi khác về số 0 và số 1?

419
00:24:58,446 --> 00:25:01,130
Ở đây hơi sáng một chút.

420
00:25:04,911 --> 00:25:08,931
Nơi mọi người đang trỏ\nvào một nơi cụ thể.

421
00:25:11,391 --> 00:25:14,863
ĐỐI TƯỢNG: Tôi vừa định hỏi về 255 bit

422
00:25:14,863 --> 00:25:16,346
giống như với các ký tự tối đa.

423
00:25:16,846 --> 00:25:19,555
DAVID Malan: À, chắc chắn rồi, và chúng ta sẽ\n

424
00:25:19,555 --> 00:25:22,131
trong những ngày tới,\na cũng với tốc độ chậm hơn

425
00:25:22,131 --> 00:25:26,074
chúng ta có, với 8 bit, hai\ngiá trị có thể có cho giá trị đầu tiên

426
00:25:26,074 --> 00:25:28,490
rồi hai cho cái tiếp theo, hai\n cho cái tiếp theo, v.v.

427
00:25:30,131 --> 00:25:32,230
Đó là tổng số 2 mũ\nthứ tám, mà

428
00:25:32,230 --> 00:25:36,730
nghĩa là bạn có thể có tổng cộng 256\n

429
00:25:36,730 --> 00:25:40,580
Nhưng như chúng ta sẽ sớm thấy các nhà khoa học máy tính, lập trình viên

430
00:25:40,580 --> 00:25:45,250
phần mềm thường bắt đầu đếm từ 0 đến\n

431
00:25:45,250 --> 00:25:50,980
mẫu, 00000000 để biểu thị\n

432
00:25:50,980 --> 00:25:56,830
bạn chỉ còn 255 mẫu khác\n

433
00:25:59,421 --> 00:26:04,421
Được rồi, vậy chúng ta có thể làm gì\n

434
00:26:04,990 --> 00:26:07,451
Chà, tất nhiên là chúng tôi có những thứ\nnhư màu sắc và chương trình

435
00:26:07,451 --> 00:26:09,682
như Photoshop và hình ảnh và hình ảnh.

436
00:26:09,682 --> 00:26:11,141
Vâng, hãy để tôi hỏi lại câu hỏi.

437
00:26:11,141 --> 00:26:14,351
Bạn nghĩ làm thế nào một chiếc máy tính có thể,\n

438
00:26:16,000 --> 00:26:19,510
Giống như lựa chọn của chúng ta là gì nếu tất cả những gì chúng ta có\n

439
00:26:23,471 --> 00:26:27,070
RGB thực sự là từ viết tắt này\nbiểu thị một lượng màu đỏ

440
00:26:27,070 --> 00:26:29,590
và một số lượng máy tính màu xanh lục,\nxanh dương và thực tế là

441
00:26:29,590 --> 00:26:32,380
có thể biểu diễn màu sắc chỉ bằng cách làm điều đó.

442
00:26:32,381 --> 00:26:33,893
Ví dụ như việc ghi nhớ dấu chấm này.

443
00:26:33,893 --> 00:26:36,851
Chấm màu vàng này trên màn hình\n

444
00:26:36,851 --> 00:26:39,611
ngày nay, đó là một số tiền lớn\n

445
00:26:40,443 --> 00:26:42,340
Và nếu bạn trộn\nnhững màu đó lại với nhau

446
00:26:42,340 --> 00:26:44,080
bạn thực sự có thể có được một cái rất cụ thể.

447
00:26:44,080 --> 00:26:46,660
Và chúng tôi sẽ gặp lại bạn\nchỉ trong giây lát thôi.

448
00:26:46,661 --> 00:26:51,408
Vì vậy, thực sự trước đó, con người không sử dụng tổng cộng bảy bit.

449
00:26:51,407 --> 00:26:54,490
Và chỉ có một lần họ quyết định,\n

450
00:26:54,490 --> 00:26:57,100
đã mở rộng ASCII và\nban đầu đó là một phần

451
00:26:57,101 --> 00:27:00,941
một giải pháp cho cùng một vấn đề\n

452
00:27:00,941 --> 00:27:05,248
trong những mẫu số không và số một\n

453
00:27:06,080 --> 00:27:10,330
Nhưng ngay cả điều đó vẫn chưa đủ và đó\n

454
00:27:11,891 --> 00:27:16,961
Vậy nếu bây giờ chúng ta quay lại\nvới một màu cụ thể này.

455
00:27:16,961 --> 00:27:19,330
RGB đã được đề xuất như một sơ đồ,\nnhưng nó có thể hoạt động như thế nào?

456
00:27:19,330 --> 00:27:21,280
Vâng, hãy xem xét ví dụ này.

457
00:27:21,280 --> 00:27:25,661
Nếu chúng ta thực sự quyết định với tư cách là một nhóm\n

458
00:27:25,661 --> 00:27:28,421
với một số hỗn hợp của một số màu đỏ,\nmột số màu xanh lá cây và một số màu xanh lam

459
00:27:28,421 --> 00:27:33,311
chúng ta phải quyết định cách thể hiện\n

460
00:27:33,310 --> 00:27:37,030
Chà, hóa ra là nếu tất cả những gì chúng ta có\n

461
00:27:38,351 --> 00:27:44,501
Ví dụ: giả sử chúng ta có một chiếc máy tính\n

462
00:27:44,500 --> 00:27:47,471
không còn trong ngữ cảnh của\nan email hoặc tin nhắn văn bản

463
00:27:47,471 --> 00:27:51,701
nhưng bây giờ trong bối cảnh của một cái gì đó\n

464
00:27:51,701 --> 00:27:55,331
và tạo các tập tin đồ họa,\ncó thể con số đầu tiên này

465
00:27:55,330 --> 00:28:00,140
có thể được hiểu là đại diện\n

466
00:28:00,688 --> 00:28:02,021
Và đó chính xác là những gì xảy ra.

467
00:28:02,020 --> 00:28:05,740
Bạn có thể coi chữ số đầu tiên là\n

468
00:28:05,740 --> 00:28:10,030
Và cuối cùng khi bạn kết hợp điều đó\n

469
00:28:10,030 --> 00:28:14,230
lượng màu xanh đó hóa ra là\n

470
00:28:14,230 --> 00:28:18,040
Và quả thực, bạn có thể nghĩ ra\ncác số từ 0 đến 255

471
00:28:18,040 --> 00:28:21,461
để mỗi màu đó pha trộn bất kỳ\n

472
00:28:21,461 --> 00:28:23,330
Và bạn thực sự có thể\nthấy điều này trong thực tế.

473
00:28:23,330 --> 00:28:26,530
Mặc dù phải thừa nhận rằng màn hình của chúng ta đang trở nên rất tốt

474
00:28:26,530 --> 00:28:30,739
trên điện thoại và máy tính xách tay của chúng tôi để bạn\n

475
00:28:30,739 --> 00:28:32,530
Bạn có thể đã từng nghe\nthuật ngữ pixel trước đây.

476
00:28:32,530 --> 00:28:34,661
Pixel chỉ là một chấm trên\nmàn hình và bạn đã

477
00:28:34,661 --> 00:28:38,260
có hàng nghìn, hàng triệu cái này\n

478
00:28:38,260 --> 00:28:41,201
Nếu tôi lấy cả\nemoji này, điều đó sẽ lại xảy ra

479
00:28:41,201 --> 00:28:46,211
trở thành sự diễn giải của một công ty về khuôn mặt đeo khẩu trang y tế

480
00:28:46,211 --> 00:28:48,550
và phóng to một chút, có thể\phóng to thêm một chút

481
00:28:48,550 --> 00:28:50,890
bạn thực sự có thể bắt đầu\nxem những pixel này.

482
00:28:50,891 --> 00:28:53,561
Mọi thứ trở nên mờ ảo\nvì những gì bạn đang thấy

483
00:28:53,560 --> 00:28:57,280
là mỗi dấu chấm riêng lẻ\n

484
00:28:57,280 --> 00:28:59,681
Và dường như mỗi\nnhững dấu chấm riêng lẻ này

485
00:28:59,681 --> 00:29:04,961
có thể đang sử dụng 24 bit, 8 bit\n

486
00:29:04,961 --> 00:29:07,300
bit cho màu xanh lam, theo một số mẫu.

487
00:29:07,300 --> 00:29:11,290
Chương trình này hoặc chương trình tương tự khác\n

488
00:29:11,290 --> 00:29:16,270
và nó có màu trắng hoặc vàng hoặc\nđen hoặc một chút màu nâu ở giữa.

489
00:29:16,270 --> 00:29:19,870
Vì vậy, nếu bạn trông có vẻ lúng túng, nhưng\n

490
00:29:19,871 --> 00:29:23,673
hoặc có thể là TV của bạn, bạn cũng có thể\nxem chính xác điều này.

491
00:29:23,673 --> 00:29:25,631
Được rồi, vậy còn những điều mà chúng ta cũng

492
00:29:25,631 --> 00:29:27,256
xem hàng ngày trên YouTube hoặc tương tự?

493
00:29:28,540 --> 00:29:30,550
Làm thế nào một chiếc máy tính\nbiết được những gì chúng ta biết bây giờ

494
00:29:30,550 --> 00:29:32,545
đại diện cho một cái gì đó giống như một video?

495
00:29:35,080 --> 00:29:37,930
Làm cách nào bạn có thể trình bày một video\chỉ sử dụng số 0 và số 1?

496
00:29:38,760 --> 00:29:43,260
ĐỐI TƯỢNG: Như chúng ta có thể thấy ở đây,\nchúng đại diện cho hình ảnh, phải không?

497
00:29:43,260 --> 00:29:47,760
[KHÔNG NGHE ĐƯỢC] cả âm thanh\ncủa số 0 và số 1.

498
00:29:52,040 --> 00:29:55,410
Tóm lại, video thực sự là gì\n

499
00:29:55,411 --> 00:29:58,131
Đó không chỉ là một hình ảnh,\nkhông chỉ là một chữ cái hay một con số

500
00:29:58,131 --> 00:30:01,911
có lẽ đó là một dạng\ntrình tự nào đó vì thời gian đang trôi qua.

501
00:30:01,911 --> 00:30:05,780
Vì vậy, với cả đống hình ảnh,\ncó thể là 24 hoặc 30 hình ảnh mỗi giây

502
00:30:05,780 --> 00:30:08,480
nếu bạn điều khiển chúng bằng\ncon người, chúng ta có thể

503
00:30:08,480 --> 00:30:11,240
diễn giải chúng bằng đôi mắt\nvà bộ não của chúng ta hiện có

504
00:30:11,240 --> 00:30:13,431
chuyển động và do đó video.

505
00:30:13,431 --> 00:30:16,040
Tương tự với âm thanh hoặc âm nhạc.

506
00:30:16,040 --> 00:30:20,211
Nếu chúng ta vừa nghĩ ra một quy ước nào đó\n

507
00:30:20,211 --> 00:30:23,361
trên một nhạc cụ, liệu chúng ta có thể có\n

508
00:30:23,361 --> 00:30:25,153
Và điều này\thực ra có thể khá quen thuộc.

509
00:30:25,153 --> 00:30:29,901
Hãy để tôi đưa một video ngắn lên đây\n

510
00:30:31,310 --> 00:30:32,990
Bạn có thể nhớ từ thời thơ ấu.

511
00:30:54,961 --> 00:30:58,861
Vì vậy, cho rằng\nvideo cụ thể đó là một video thực tế

512
00:30:58,861 --> 00:31:02,311
của hoạt hình trên giấy, nhưng\n

513
00:31:02,310 --> 00:31:06,270
là một chuỗi các hình ảnh này,\ntất nhiên chính chúng

514
00:31:06,270 --> 00:31:10,320
chỉ là số không và số một vì chúng\n

515
00:31:10,320 --> 00:31:14,003
Bây giờ có thứ gì đó giống như nốt nhạc như\n

516
00:31:14,003 --> 00:31:16,170
có thể phát\nnhững trò chơi này một cách tự nhiên trên thiết bị vật lý

517
00:31:16,171 --> 00:31:19,201
nhưng máy tính chắc chắn cũng có thể\nthể hiện những âm thanh đó.

518
00:31:19,201 --> 00:31:22,050
Ví dụ: định dạng\nphổ biến cho âm thanh là

519
00:31:22,050 --> 00:31:24,780
được gọi là MIDI và MIDI\ncó thể chỉ đại diện

520
00:31:24,780 --> 00:31:29,100
từng ghi chú mà bạn đã thấy lúc nãy\n

521
00:31:29,101 --> 00:31:32,491
Nhưng tổng quát hơn, bạn có thể\nnghĩ về âm nhạc như có những nốt nhạc

522
00:31:32,490 --> 00:31:35,401
ví dụ: A đến G, có thể\nmột số dấu thăng và một số dấu thăng

523
00:31:35,401 --> 00:31:39,000
bạn có thể có thời lượng như thế nào\n

524
00:31:39,000 --> 00:31:41,040
trên đàn piano hoặc một thiết bị\nkhác nào đó, sau đó

525
00:31:41,040 --> 00:31:43,770
chỉ là âm lượng như mức độ\ncủa một con người trong thế giới thực

526
00:31:43,770 --> 00:31:46,681
nhấn phím đó xuống và\nvậy âm thanh đó lớn đến mức nào?

527
00:31:46,681 --> 00:31:51,571
Dường như chỉ cần nhớ lại\n

528
00:31:51,570 --> 00:31:57,090
khi đó chúng ta có thể đại diện cho tất cả\n

529
00:31:57,090 --> 00:32:00,420
Vậy thì đó thực sự là\na một danh sách các cách

530
00:32:00,421 --> 00:32:02,551
rằng chúng ta chỉ có thể biểu diễn thông tin.

531
00:32:02,550 --> 00:32:05,313
Xin nhắc lại, máy tính hoặc kỹ thuật số đều có\nang các định dạng khác nhau này

532
00:32:05,314 --> 00:32:07,980
nhưng xét cho cùng và\nlạ mắt như những thiết bị đó trong nhiều năm

533
00:32:07,980 --> 00:32:11,760
là, nó chỉ là số không và số một, rất nhỏ\n

534
00:32:11,760 --> 00:32:14,941
nếu bạn muốn, hãy thể hiện theo\ncách nào đó và điều đó tùy thuộc vào phần mềm

535
00:32:14,941 --> 00:32:17,941
mà bạn và tôi và những người khác\nviết để sử dụng những số không đó

536
00:32:17,941 --> 00:32:21,421
và những cách chúng tôi muốn để máy tính\nlàm được điều gì đó

537
00:32:22,861 --> 00:32:27,181
Vậy thì hãy đặt câu hỏi về phần trình bày này\n

538
00:32:27,181 --> 00:32:30,811
cuối cùng là giải quyết vấn đề\n

539
00:32:30,810 --> 00:32:35,590
và tạo ra quy trình mới thông qua\nsome ở giữa.

540
00:32:40,070 --> 00:32:43,999
KHÁN GIẢ: Đúng vậy, chúng tôi đã nói về cách\n

541
00:32:43,999 --> 00:32:45,962
bạn để giải thích thông tin.

542
00:32:45,962 --> 00:32:50,873
Định dạng tệp như .mp4\n như thế nào

543
00:32:52,346 --> 00:32:53,971
DAVID Malan: Vì vậy, một câu hỏi thực sự hay.

544
00:32:53,971 --> 00:32:55,921
Có rất nhiều định dạng\ntệp khác.

545
00:32:55,921 --> 00:32:58,730
Bạn ám chỉ MP4 cho video\nvà nói chung hơn là việc sử dụng

546
00:32:58,730 --> 00:33:01,340
những thứ này được gọi là\ncodec và vùng chứa.

547
00:33:01,340 --> 00:33:04,910
Chẳng hạn, nó không đơn giản như vậy khi\nsử dụng các tệp lớn hơn

548
00:33:04,911 --> 00:33:08,449
ở các định dạng hiện đại hơn mà\n

549
00:33:09,560 --> 00:33:13,160
Nếu bạn lưu trữ nhiều hình ảnh\nnhư một bộ phim Hollywood

550
00:33:13,161 --> 00:33:17,431
khoảng 24 hoặc 30 trong số đó mỗi giây,\n

551
00:33:17,431 --> 00:33:19,760
Và nếu bạn đã từng chụp\nảnh trên điện thoại của mình

552
00:33:19,760 --> 00:33:23,780
bạn có thể biết bao nhiêu megabyte hoặc\n

553
00:33:24,381 --> 00:33:27,771
Vì vậy, trong nhiều năm qua, con người đã phát triển một phần mềm tuyệt vời hơn

554
00:33:27,770 --> 00:33:32,480
sử dụng nhiều toán học hơn để biểu diễn\n

555
00:33:32,480 --> 00:33:35,240
chỉ bằng cách sử dụng những mẫu\n ngắn hơn của số 0 và số 1

556
00:33:35,240 --> 00:33:37,830
hơn là cách trình bày\nđơn giản nhất ở đây.

557
00:33:37,830 --> 00:33:40,160
Và họ sử dụng cái có thể được gọi là nén.

558
00:33:40,161 --> 00:33:42,561
Nếu bạn đã từng sử dụng tệp zip\n hoặc thứ gì khác

559
00:33:42,560 --> 00:33:45,170
bằng cách nào đó máy tính của bạn đang\nsử dụng ít số không và số một hơn

560
00:33:45,171 --> 00:33:47,061
để thể hiện cùng một lượng thông tin

561
00:33:47,060 --> 00:33:49,522
lý tưởng mà không làm mất bất kỳ thông tin nào.

562
00:33:49,522 --> 00:33:52,730
Trong thế giới đa phương tiện mà chúng ta sẽ\n

563
00:33:52,730 --> 00:33:56,330
có cả định dạng mất dữ liệu và\nkhông mất dữ liệu.

564
00:33:56,330 --> 00:33:59,961
Không mất dữ liệu có nghĩa là bạn không mất\nbất kỳ thông tin nào.

565
00:33:59,961 --> 00:34:05,361
Nhưng phổ biến hơn khi bạn đang ám chỉ\n

566
00:34:05,361 --> 00:34:08,151
nơi bạn thực sự đang bỏ đi\nmột lượng chất lượng nào đó.

567
00:34:08,150 --> 00:34:10,592
Bạn đang nhận được một lượng\nđiểm ảnh mà có thể không

568
00:34:10,592 --> 00:34:13,550
trông thật hoàn hảo đối với con người, nhưng chết tiệt\n

569
00:34:14,541 --> 00:34:17,691
Và trong thế giới đa phương tiện,\n

570
00:34:17,690 --> 00:34:20,480
và các bộ chứa MPEG khác\ncó thể kết hợp

571
00:34:20,481 --> 00:34:24,561
các định dạng video khác nhau, khác nhau\n

572
00:34:24,561 --> 00:34:26,841
nhưng ở đó,\ncác nhà thiết kế cũng có quyền quyết định.

573
00:34:28,911 --> 00:34:32,311
Vậy còn những câu hỏi khác về\nthông tin ở đây?

574
00:34:32,811 --> 00:34:35,523
KHÁN GIẢ: Tôi biết\nmáy tính đã từng rất lớn

575
00:34:35,523 --> 00:34:37,510
và chiếm cả\ncả một căn phòng và các thứ.

576
00:34:37,510 --> 00:34:41,545
Có phải lý do chúng trở nên\nnhỏ hơn là vì chúng ta có thể lưu trữ

577
00:34:41,545 --> 00:34:43,826
thông tin này từng phần hay sao?

578
00:34:44,701 --> 00:34:47,659
Ý tôi là, ngày xưa bạn có thể\n

579
00:34:47,659 --> 00:34:50,340
ống, giống như một\nthiết bị vật lý lớn nào đó

580
00:34:50,340 --> 00:34:53,280
có thể chỉ lưu trữ một số 0 hoặc 1.

581
00:34:53,280 --> 00:34:55,920
Vâng, đó là sự thu nhỏ\ncủa phần cứng ngày nay

582
00:34:55,920 --> 00:35:00,721
điều đó đã cho phép chúng tôi lưu trữ nhiều\n

583
00:35:01,661 --> 00:35:03,583
Và khi chúng tôi chế tạo thêm\nnhững chiếc máy lạ mắt hơn

584
00:35:03,583 --> 00:35:06,000
có thể thiết kế phần cứng này\nang ở quy mô nhỏ hơn nữa

585
00:35:06,001 --> 00:35:08,531
chúng tôi đang ngày càng bổ sung thêm\nnhiều hơn nữa vào những thiết bị này.

586
00:35:08,530 --> 00:35:09,840
Nhưng ở đó cũng có sự đánh đổi.

587
00:35:09,840 --> 00:35:13,110
Ví dụ: bạn có thể biết bằng cách\nsử dụng điện thoại hoặc máy tính xách tay của mình

588
00:35:13,110 --> 00:35:15,810
trong một thời gian khá lâu, có thể trên đùi bạn, bắt đầu ấm lên.

589
00:35:15,811 --> 00:35:17,941
Vì vậy, có những tác dụng phụ về mặt vật lý\n theo nghĩa đen

590
00:35:17,940 --> 00:35:20,370
trong số này hiện tại một số\nthiết bị của chúng tôi đang nóng.

591
00:35:20,371 --> 00:35:23,251
Đây là lý do tại sao giống như một trung tâm dữ liệu trong thế giới thực

592
00:35:23,251 --> 00:35:25,591
có thể cần nhiều máy điều hòa\nhơn một nơi thông thường

593
00:35:25,590 --> 00:35:28,712
bởi vì cũng có những tạo tác vật lý này.

594
00:35:28,713 --> 00:35:31,921
Thực tế, nếu bạn muốn xem một trong\n

595
00:35:31,920 --> 00:35:35,310
bên kia sông ở đây bây giờ là Allston\n

596
00:35:35,311 --> 00:35:40,621
là chiếc máy tính Harvard Mark 1\n

597
00:35:41,981 --> 00:35:44,491
Chà, nếu bây giờ chúng ta quay lại\nvới bức ảnh đầu tiên này

598
00:35:44,490 --> 00:35:47,161
là khoa học máy tính hoặc\nthực sự là người giải quyết vấn đề

599
00:35:47,161 --> 00:35:49,110
Tôi dám chắc bây giờ chúng ta có quá\nquá đủ cách

600
00:35:49,110 --> 00:35:53,190
để thể hiện thông tin, đầu vào và\n

601
00:35:53,190 --> 00:35:56,250
về điều gì đó và may mắn thay tất cả\nnhững điều đó trước chúng tôi đã cho chúng tôi

602
00:35:56,251 --> 00:35:57,961
những thứ như ASCII và Unicode.

603
00:35:57,960 --> 00:36:01,150
Chưa kể MP4, tài liệu word\n và những thứ tương tự.

604
00:36:01,150 --> 00:36:05,250
Nhưng bên trong câu tục ngữ này có gì\n

605
00:36:05,251 --> 00:36:06,998
đi vào các đầu ra đang đến?

606
00:36:06,998 --> 00:36:09,539
Chà, đó là nơi chúng tôi có\nthuật ngữ này mà bạn cũng có thể đã nghe thấy.

607
00:36:09,539 --> 00:36:14,670
Một thuật toán chỉ thực hiện từng bước\n

608
00:36:14,670 --> 00:36:17,940
nhập thể vào thế giới\nmáy tính bằng phần mềm.

609
00:36:17,940 --> 00:36:20,910
Khi bạn viết phần mềm\naka chương trình, bạn

610
00:36:20,911 --> 00:36:26,099
đang triển khai một hoặc nhiều thuật toán,\n

611
00:36:26,099 --> 00:36:29,380
để giải quyết một số vấn đề và có thể\n

612
00:36:29,380 --> 00:36:31,422
nhưng suy cho cùng,\nbất kể ngôn ngữ

613
00:36:31,422 --> 00:36:34,410
bạn sử dụng máy tính sẽ\nđại diện cho những gì bạn gõ

614
00:36:37,769 --> 00:36:40,260
Vậy thuật toán\nđại diện có thể là gì?

615
00:36:40,260 --> 00:36:42,630
Ngày nay bạn có thể sử dụng\nđiện thoại của mình khá nhiều

616
00:36:42,630 --> 00:36:45,480
để thực hiện cuộc gọi hoặc gửi tin nhắn\cũng như email và do đó bạn

617
00:36:45,481 --> 00:36:48,001
có rất nhiều\nliên hệ trong sổ địa chỉ của bạn.

618
00:36:48,001 --> 00:36:50,251
Tất nhiên, ngày nay\nđiều này rất kỹ thuật số

619
00:36:50,251 --> 00:36:53,341
nhưng cho dù trên iOS hay\nAndroid hay tương tự

620
00:36:53,340 --> 00:36:56,010
bạn có thể có rất nhiều\ntên, tên

621
00:36:56,010 --> 00:36:58,942
và/hoặc cuối cùng, cũng như số\nvà email và những thứ tương tự.

622
00:36:58,943 --> 00:37:01,651
Bạn có thể có thói quen thích\n

623
00:37:01,650 --> 00:37:05,190
tất cả những cái tên đó để tìm\nngười bạn muốn gọi.

624
00:37:05,190 --> 00:37:09,000
Nó có thể được sắp xếp theo thứ tự bảng chữ cái\n

625
00:37:11,431 --> 00:37:16,764
Thực ra điều này khá giống với\n

626
00:37:16,764 --> 00:37:18,181
khi chúng ta chỉ sử dụng một cuốn sách vật lý.

627
00:37:18,181 --> 00:37:20,014
Trong cuốn sách in này\ncó thể có cả đống

628
00:37:20,014 --> 00:37:22,171
tên được sắp xếp theo thứ tự bảng chữ cái\ntừ trái sang phải

629
00:37:22,170 --> 00:37:24,340
tương ứng với\ncả một dãy số.

630
00:37:24,340 --> 00:37:27,000
Vậy giả sử rằng trong danh bạ điện thoại\ncũ của Harvard này

631
00:37:27,001 --> 00:37:29,161
chúng tôi muốn tìm kiếm John Harvard.

632
00:37:29,161 --> 00:37:31,441
Tất nhiên chúng ta có thể bắt đầu\nkhá đơn giản ngay từ đầu

633
00:37:31,440 --> 00:37:36,070
ở đây, nhìn vào một trang mỗi lần\n và đây là một thuật toán.

634
00:37:36,070 --> 00:37:40,320
Điều này giống như từng bước\ntìm kiếm giải pháp

635
00:37:41,490 --> 00:37:43,710
Theo nghĩa đó, nếu John\nHarvard có tên trong danh bạ điện thoại

636
00:37:43,710 --> 00:37:47,663
bạn cho biết thuật toán này theo từng trang\n có đúng không?

637
00:37:49,121 --> 00:37:51,041
Giống như nếu John Harvard ghi vào danh bạ điện thoại

638
00:37:51,041 --> 00:37:54,641
rõ ràng là cuối cùng tôi cũng sẽ đạt được\n

639
00:37:56,141 --> 00:37:58,340
Bạn có cho rằng nó được thiết kế tốt không?

640
00:37:58,840 --> 00:38:01,990
Ý tôi là việc này sẽ kéo dài mãi mãi\n

641
00:38:01,990 --> 00:38:03,190
tùy thuộc vào cách thứ này được sắp xếp.

642
00:38:03,190 --> 00:38:04,930
Được rồi, hãy để tôi đi nhanh hơn một chút.

643
00:38:04,931 --> 00:38:06,431
Tôi sẽ bắt đầu như hai trang cùng một lúc.

644
00:38:06,431 --> 00:38:11,050
2, 4, 6, 8, 10, 12, v.v.

645
00:38:11,050 --> 00:38:13,721
Âm thanh nhanh hơn, nhanh hơn, đúng không?

646
00:38:14,411 --> 00:38:16,421
DAVID Malan: Được rồi, tại sao nó không đúng?

647
00:38:17,235 --> 00:38:19,043
KHÁN GIẢ: Vậy nếu bạn\nbắt đầu từ trang 1

648
00:38:19,043 --> 00:38:22,085
bạn chỉ đọc số trang lẻ thôi,\n

649
00:38:23,630 --> 00:38:26,297
Nếu tôi bắt đầu trên một số lẻ\ntrang và tôi đi tới hai trang cùng một lúc

650
00:38:26,297 --> 00:38:28,230
Tôi có thể bỏ lỡ các trang ở giữa.

651
00:38:28,231 --> 00:38:30,493
Và vì vậy nếu tôi kết luận\nkhi tôi quay lại phía sau

652
00:38:30,492 --> 00:38:33,201
trong cuốn sách không có John\n

653
00:38:33,201 --> 00:38:35,451
Đây sẽ lại là một trong những lỗi này.

654
00:38:35,451 --> 00:38:39,260
Nhưng nếu tôi cố gắng hơn một chút,\ntôi cảm thấy như có giải pháp.

655
00:38:39,260 --> 00:38:41,550
Chúng tôi không cần phải loại bỏ hoàn toàn\n thuật toán này.

656
00:38:41,550 --> 00:38:44,240
Tôi nghĩ chúng ta có thể đi\nnhanh gấp đôi.

657
00:38:44,240 --> 00:38:47,001
Nhưng thay vào đó chúng ta nên làm gì\để khắc phục điều này?

658
00:38:59,610 --> 00:39:02,985
Vì vậy tôi nghĩ điều mà nhiều người trong chúng ta, hầu hết chúng ta,\n

659
00:39:02,985 --> 00:39:05,610
ngày nay, chúng ta có thể đi tới\nkhoảng giữa danh bạ điện thoại

660
00:39:05,610 --> 00:39:06,902
chỉ để giúp chúng tôi bắt đầu.

661
00:39:06,902 --> 00:39:10,350
Và bây giờ tôi đang nhìn xuống, tôi đang nhìn\n

662
00:39:10,351 --> 00:39:13,061
và có vẻ như tôi đang ở khu M.

663
00:39:13,061 --> 00:39:15,759
Vì vậy, để nói rõ,\ntôi nên làm gì tiếp theo?

664
00:39:21,657 --> 00:39:23,740
DAVID Malan: Được rồi, và\ncó lẽ đó là John Harvard

665
00:39:23,740 --> 00:39:24,949
sẽ ở bên trái của cái này.

666
00:39:24,949 --> 00:39:27,931
Vì vậy, đây là cơ hội để\nxé rách theo nghĩa bóng và nghĩa đen

667
00:39:27,931 --> 00:39:32,461
vấn đề đặc biệt này một nửa,\nvứt một nửa vấn đề đi.

668
00:39:32,460 --> 00:39:34,980
Thực ra việc này khá dễ dàng\nnếu bạn làm theo cách đó.

669
00:39:36,791 --> 00:39:41,141
Nhưng bây giờ tôi vừa giảm\n

670
00:39:41,141 --> 00:39:45,240
Vì vậy, nếu tôi bắt đầu với 1.000 trang\no số điện thoại và tên thì bây giờ

671
00:39:46,590 --> 00:39:48,601
Và chúng tôi vẫn chưa\ntìm thấy John Harvard

672
00:39:48,601 --> 00:39:50,751
nhưng đó là một vấn đề lớn\nngoài vấn đề này.

673
00:39:50,751 --> 00:39:54,339
Tôi nghĩ nó đúng vì nếu\n

674
00:39:54,338 --> 00:39:56,130
anh ấy chắc chắn sẽ không ở đó.

675
00:39:56,130 --> 00:40:00,150
Tôi nghĩ nếu tôi lặp lại điều này lần nữa\n

676
00:40:00,150 --> 00:40:02,070
ở đây tôi có thể đã đi hơi quá xa.

677
00:40:02,070 --> 00:40:03,581
Bây giờ tôi đang ở phần E.

678
00:40:03,581 --> 00:40:08,131
Vậy hãy để tôi xé vấn đề ra làm đôi\n

679
00:40:08,130 --> 00:40:11,100
và lặp lại lần nữa, chia\nvà chia và chinh phục

680
00:40:11,101 --> 00:40:14,550
cho đến khi cuối cùng, có lẽ, tôi kết thúc\n

681
00:40:14,550 --> 00:40:18,090
cuốn sách có\ntên John Harvard hoặc không có

682
00:40:18,090 --> 00:40:21,400
nhưng vì thuật toán\nbạn đã đề xuất, từng bước một

683
00:40:21,400 --> 00:40:24,550
Tôi biết rằng anh ấy không có trong bất cứ thứ gì tôi đã vứt bỏ.

684
00:40:24,550 --> 00:40:28,201
Thật đau buồn\ncó thể đã được giải quyết

685
00:40:28,201 --> 00:40:31,715
thực ra nó chỉ là khai thác\n

686
00:40:31,715 --> 00:40:33,840
Quả thực, đây cũng chính là nội dung\ncủa việc lập trình.

687
00:40:33,840 --> 00:40:36,690
Đây không phải là việc học\na một thế giới hoàn toàn mới

688
00:40:36,690 --> 00:40:40,350
nhưng thực ra chỉ là cách khai thác trực giác\n

689
00:40:40,351 --> 00:40:43,381
có và nhận một cách tự nhiên\nnhưng học cách diễn đạt

690
00:40:43,380 --> 00:40:45,900
bây giờ chúng ngắn gọn hơn,\nchính xác hơn

691
00:40:45,900 --> 00:40:49,150
sử dụng thứ gọi là\nngôn ngữ lập trình.

692
00:40:49,150 --> 00:40:54,330
Tại sao thuật toán lại như vậy nếu tôi tìm thấy\n

693
00:40:54,331 --> 00:40:56,820
chỉ làm việc đầu tiên\nkhông hoặc thậm chí thứ hai

694
00:40:56,820 --> 00:40:59,940
và có thể quay lại gấp đôi\nđể kiểm tra các trang chẵn đó?

695
00:40:59,940 --> 00:41:01,830
Nào chúng ta hãy nhìn\na các biểu đồ nhỏ ở đây.

696
00:41:01,831 --> 00:41:04,291
Một lần nữa, chúng ta không cần phải hiểu các sắc thái của các con số

697
00:41:04,291 --> 00:41:07,501
nhưng nếu chúng ta có một biểu đồ\nở đây, biểu đồ xy, trên trục x

698
00:41:07,501 --> 00:41:09,431
ở đây tôi khẳng định là quy mô của vấn đề.

699
00:41:09,431 --> 00:41:12,441
Vì vậy, được đo bằng số\ntrang trong danh bạ điện thoại.

700
00:41:12,440 --> 00:41:16,050
Vì vậy, bạn càng đi xa ra khỏi đây,\n

701
00:41:16,050 --> 00:41:18,641
Và ở đây chúng ta có thời gian\nđể giải trên trục y.

702
00:41:18,641 --> 00:41:21,331
Vì vậy bạn càng lên cao\n thì càng có nhiều thời gian

703
00:41:21,331 --> 00:41:24,101
sẽ thực hiện để giải quyết\nvấn đề cụ thể đó.

704
00:41:24,101 --> 00:41:27,751
Vậy nên cứ tùy ý nói thế\n

705
00:41:27,751 --> 00:41:31,511
như n trang, có thể\nđược biểu diễn bằng đồ họa như thế này.

706
00:41:31,510 --> 00:41:33,931
Dù có dốc bao nhiêu,\nit vẫn là một đường thẳng

707
00:41:33,931 --> 00:41:36,360
bởi vì có lẽ\na có mối quan hệ 1-1

708
00:41:36,360 --> 00:41:40,440
giữa số trang và số\n

709
00:41:40,951 --> 00:41:43,291
Nếu công ty điện thoại thêm\nanother trang vào năm tới

710
00:41:43,291 --> 00:41:45,301
bởi vì một số người mới\nchuyển đến thị trấn, đó là

711
00:41:45,300 --> 00:41:47,161
sẽ yêu cầu một\ntrang bổ sung cho tôi.

712
00:41:49,110 --> 00:41:52,800
Tuy nhiên, nếu chúng ta sử dụng\thuật toán thứ hai, mặc dù nó có sai sót

713
00:41:52,800 --> 00:41:56,431
trừ khi chúng ta tăng gấp đôi một chút\n

714
00:41:56,431 --> 00:41:59,280
đó cũng sẽ là một\nđường thẳng, nhưng nó

715
00:41:59,280 --> 00:42:02,820
sẽ có một độ dốc khác vì\n

716
00:42:02,820 --> 00:42:06,250
mối quan hệ vì tôi\nđi tới các trang cùng một lúc.

717
00:42:06,251 --> 00:42:10,981
Vì vậy, nếu công ty điện thoại thêm\nanother trang hoặc hai trang khác

718
00:42:10,981 --> 00:42:13,008
vẫn chỉ còn một bước nữa thôi.

719
00:42:13,007 --> 00:42:15,090
Bạn có thể thấy sự khác biệt\nnếu tôi vẽ thế này.

720
00:42:15,090 --> 00:42:18,210
Nếu đây là danh bạ điện thoại trong\ncâu hỏi thì số trang này

721
00:42:18,210 --> 00:42:20,910
có thể mất bao nhiêu\ngiây trên đường màu vàng

722
00:42:20,911 --> 00:42:24,661
đại diện hoặc tìm\nai đó như John Harvard.

723
00:42:24,661 --> 00:42:27,421
Nhưng tất nhiên ở thuật toán\đầu tiên, đường màu đỏ

724
00:42:27,420 --> 00:42:29,760
thực tế là nó sẽ\nthực hiện gấp đôi số bước.

725
00:42:29,760 --> 00:42:32,311
Và n ở đây có nghĩa là gì?\nn là biến đi tới

726
00:42:32,311 --> 00:42:36,251
dành cho nhà khoa học máy tính hoặc lập trình viên\n

727
00:42:36,251 --> 00:42:38,671
Vậy nếu số trang\nin danh bạ điện thoại là n

728
00:42:38,670 --> 00:42:41,580
số bước mà thuật toán\thứ hai sẽ thực hiện

729
00:42:41,581 --> 00:42:44,266
trong trường hợp xấu nhất là n trên 2.

730
00:42:44,266 --> 00:42:46,271
Một nửa vì\nbạn đang đi nhanh gấp đôi.

731
00:42:46,271 --> 00:42:50,611
Nhưng thuật toán thứ ba, thực ra\nnếu bạn nhớ lại logarit của mình

732
00:42:50,610 --> 00:42:52,320
trông hơi giống thế này.

733
00:42:52,320 --> 00:42:54,750
Về cơ bản có một mối quan hệ khác

734
00:42:54,751 --> 00:42:58,261
giữa quy mô của vấn đề và\n

735
00:42:58,260 --> 00:43:00,150
về mặt kỹ thuật thì\ncũng dựa trên nhật ký

736
00:43:00,150 --> 00:43:02,911
nhưng thực sự\nhình dạng đó có sự khác biệt.

737
00:43:02,911 --> 00:43:06,331
Hàm ý ở đây là nếu,\n

738
00:43:06,331 --> 00:43:08,911
hai thị trấn khác nhau ở đây tại\nMassachusetts, sáp nhập vào năm tới

739
00:43:08,911 --> 00:43:11,971
và chỉ có một chiếc điện thoại\nbook lớn gấp đôi

740
00:43:11,971 --> 00:43:14,670
không có vấn đề gì lớn đối với thuật toán\nthứ ba và cuối cùng đó.

741
00:43:15,181 --> 00:43:17,941
Bạn chỉ cần giải quyết vấn đề\không còn một nửa thời gian nữa

742
00:43:17,940 --> 00:43:21,360
lấy thêm một byte nữa,\nthế là xong, không phải 1.000 nữa

743
00:43:21,360 --> 00:43:23,760
byte chỉ để đi đến giải pháp.

744
00:43:23,760 --> 00:43:26,320
Nói cách khác, bạn\ncó thể đi theo con đường đó

745
00:43:26,320 --> 00:43:29,520
thoát khỏi đây để đến với một danh bạ\nđiện thoại lớn hơn nhiều và cuối cùng

746
00:43:29,521 --> 00:43:32,551
đường màu xanh lá cây đó gần như không nhúc nhích.

747
00:43:32,550 --> 00:43:35,880
Vì vậy, đây chỉ là một cách\nhình thức hóa và suy nghĩ

748
00:43:35,880 --> 00:43:42,400
về hiệu suất hoặc\n

749
00:43:42,400 --> 00:43:46,070
Trước khi chúng ta tạo thêm một cái nữa\n

750
00:43:46,070 --> 00:43:52,121
có câu hỏi nào về khái niệm này\n

751
00:43:52,621 --> 00:43:56,193
ĐỐI TƯỢNG: Bạn có bao nhiêu\ndanh bạ điện thoại?

752
00:43:56,193 --> 00:43:58,651
DAVID Malan: (CƯỜI) Rất nhiều danh bạ điện thoại trong những năm qua

753
00:43:58,650 --> 00:44:02,040
và nếu bạn hoặc bố mẹ bạn có bất kỳ\n

754
00:44:02,041 --> 00:44:04,501
sử dụng chúng vì chúng khó tìm.

755
00:44:13,007 --> 00:44:15,340
KHÁN GIẢ: Bạn có thể mời Harry\nPotter làm diễn giả khách mời.

756
00:44:15,340 --> 00:44:16,473
DAVID Malan: Xin lỗi, nói lại.

757
00:44:16,474 --> 00:44:18,780
KHÁN GIẢ: Bạn có thể mời Harry\nPotter làm diễn giả khách mời.

758
00:44:18,780 --> 00:44:19,800
DAVID Malan: (CƯỜI) Ồ, vâng.

759
00:44:20,300 --> 00:44:23,380
Sau đó chúng ta sẽ có thêm một chút\nthứ gì đó để sử dụng ở đây.

760
00:44:23,380 --> 00:44:28,740
Vì vậy bây giờ nếu chúng ta muốn chính thức hóa\nthêm những gì chúng ta vừa làm

761
00:44:28,740 --> 00:44:30,360
chúng ta có thể tiếp tục và giới thiệu điều này.

762
00:44:30,360 --> 00:44:33,327
Một dạng mã hay còn gọi là mã giả.

763
00:44:33,327 --> 00:44:35,911
Mã giả không phải là một\nngôn ngữ cụ thể, nó không giống thứ gì đó

764
00:44:35,911 --> 00:44:38,851
chúng ta sắp bắt đầu viết mã, đó\n

765
00:44:38,851 --> 00:44:41,371
bằng tiếng Anh hoặc bất kỳ\nngôn ngữ nào của con người một cách ngắn gọn

766
00:44:41,371 --> 00:44:45,331
một cách chính xác để kết thúc việc nhận được\n

767
00:44:45,331 --> 00:44:47,701
Ví dụ: đây\ncó thể là cách chúng ta có thể

768
00:44:47,701 --> 00:44:51,331
chính thức hóa mã, mã giả\ncho cùng thuật toán đó.

769
00:44:51,331 --> 00:44:54,211
Bước một là nhặt\ndanh bạ điện thoại lên, như tôi đã làm.

770
00:44:54,210 --> 00:44:56,940
Bước hai có thể mở ở\nở giữa danh bạ điện thoại

771
00:44:56,940 --> 00:44:58,740
như bạn đề xuất mà chúng tôi làm đầu tiên.

772
00:44:58,740 --> 00:45:01,920
Bước ba có lẽ là\nnhìn xuống các trang, tôi đã làm vậy.

773
00:45:01,920 --> 00:45:04,530
Và bước bốn sẽ thú vị hơn một chút

774
00:45:04,530 --> 00:45:07,770
bởi vì tôi phải nhanh chóng thực hiện một\n

775
00:45:07,771 --> 00:45:11,521
Nếu người đó ở trên trang thì\ncó lẽ tôi chỉ nên

776
00:45:11,521 --> 00:45:13,251
hãy tiếp tục và gọi cho người đó.

777
00:45:13,251 --> 00:45:15,751
Nhưng đó có lẽ không phải là trường hợp\nít nhất đối với John Harvard

778
00:45:17,851 --> 00:45:19,951
Vì vậy bây giờ tôi có\ncâu hỏi khác

779
00:45:19,951 --> 00:45:22,590
hãy hỏi xem người đó\nis ở phần trước trong cuốn sách có phải không

780
00:45:22,590 --> 00:45:26,010
thì tôi nên giải quyết vấn đề\nmột nửa như tôi đã làm nhưng đi sang trái, vì vậy

781
00:45:26,010 --> 00:45:30,121
để nói, và sau đó không chỉ mở ra\n

782
00:45:30,121 --> 00:45:33,300
nhưng thực sự chỉ cần quay lại\nbước ba, lặp lại.

783
00:45:33,900 --> 00:45:37,650
Bởi vì tôi chỉ có thể lặp lại những gì tôi\n

784
00:45:39,010 --> 00:45:41,753
Tuy nhiên, nếu người đó\n xuất hiện muộn hơn trong cuốn sách

785
00:45:41,753 --> 00:45:44,461
như có thể đã xảy ra với một\n

786
00:45:44,460 --> 00:45:47,085
thì tôi nên mở phần giữa\nnửa bên phải của cuốn sách

787
00:45:47,085 --> 00:45:49,075
một lần nữa quay lại dòng\nba, nhưng một lần nữa, tôi

788
00:45:49,076 --> 00:45:51,451
sẽ không chán khi làm\nnhững việc như thế này mãi mãi

789
00:45:51,451 --> 00:45:54,521
bởi vì tôi tiếp tục thu nhỏ\nquy mô của vấn đề.

790
00:45:54,521 --> 00:45:56,431
Cuối cùng, kịch bản\ncó thể xảy ra duy nhất đó là

791
00:45:56,431 --> 00:45:59,905
trái, nếu John Harvard không bật\n

792
00:45:59,905 --> 00:46:02,280
và anh ấy không ở bên phải,\nkết luận của chúng ta nên là gì?

793
00:46:03,322 --> 00:46:04,489
DAVID Malan: Anh ấy không có ở đó.

794
00:46:05,391 --> 00:46:08,240
Vì vậy chúng ta cần phải bỏ thuốc lá dưới một hình thức khác.

795
00:46:08,240 --> 00:46:11,751
Ngoài ra, nó có phần có chủ ý\n

796
00:46:11,751 --> 00:46:16,021
ở cuối vì đây là thứ\n

797
00:46:16,021 --> 00:46:17,990
cho dù bạn là người mới hay chuyên nghiệp

798
00:46:17,990 --> 00:46:22,201
chỉ là không xem xét tất cả những gì có thể\n

799
00:46:22,201 --> 00:46:25,701
điều đó có thể không xảy ra thường xuyên,\n

800
00:46:25,701 --> 00:46:28,550
bằng mã của riêng bạn,\npseudocode hoặc cách khác

801
00:46:28,550 --> 00:46:31,101
đây là thời điểm và lý do\nchương trình có thể gặp sự cố

802
00:46:31,101 --> 00:46:34,111
hoặc bạn có thể nói là ngu ngốc\n

803
00:46:34,110 --> 00:46:35,360
hoặc máy tính của bạn có thể khởi động lại.

804
00:46:35,931 --> 00:46:38,780
Nó đang làm điều gì đó\nkhông thể đoán trước được

805
00:46:38,780 --> 00:46:42,411
nếu một con người, có thể là chính tôi,\không lường trước được điều này.

806
00:46:42,411 --> 00:46:45,501
Giống như chương trình này làm gì nếu\n

807
00:46:45,501 --> 00:46:48,109
nếu tôi đã bỏ qua dòng 12 và 13?

808
00:46:48,650 --> 00:46:50,650
Có thể nó sẽ hoạt động\nkhác biệt trên máy Mac hoặc PC

809
00:46:50,650 --> 00:46:53,330
bởi vì đó là loại hành vi không xác định.

810
00:46:53,331 --> 00:46:56,510
Đây là những kiểu thiếu sót\nmà thực lòng mà nói bạn luôn mắc phải

811
00:46:56,510 --> 00:46:58,641
sắp thực hiện, lỗi\nbạn sắp giới thiệu

812
00:46:58,641 --> 00:47:02,751
những sai lầm bạn sẽ mắc phải sớm\n

813
00:47:02,751 --> 00:47:06,111
Nhưng bạn sẽ giỏi hơn\nnghĩ về những trường hợp góc đó

814
00:47:06,110 --> 00:47:09,030
và xử lý mọi thứ có thể\n

815
00:47:09,030 --> 00:47:11,931
mã của bạn sẽ tốt hơn cho nó.

816
00:47:11,931 --> 00:47:15,262
Bây giờ vấn đề cuối cùng\nvới việc học cách lập trình

817
00:47:15,262 --> 00:47:16,971
đặc biệt là nếu bạn\nchưa từng có kinh nghiệm

818
00:47:16,971 --> 00:47:21,411
hoặc thậm chí nếu bạn làm vậy nhưng bạn\nchỉ học một ngôn ngữ

819
00:47:21,411 --> 00:47:25,130
là tất cả chúng đều trông hơi\nkhó hiểu ngay từ cái nhìn đầu tiên.

820
00:47:25,130 --> 00:47:27,260
Nhưng họ có những điểm chung nhất định.

821
00:47:27,260 --> 00:47:30,141
Trên thực tế, chúng ta sẽ sử dụng\npseudocode này để xác định những mã đó trước tiên.

822
00:47:30,141 --> 00:47:32,360
Được đánh dấu bằng màu vàng\nđây là những gì kể từ bây giờ

823
00:47:32,360 --> 00:47:34,520
chúng ta sẽ bắt đầu gọi hàm.

824
00:47:34,521 --> 00:47:37,641
Có rất nhiều ngôn ngữ lập trình\nkhác nhau tồn tại, nhưng hầu hết chúng đều

825
00:47:37,641 --> 00:47:40,820
có những gì chúng ta có thể gọi là\nchức năng, đó là những hành động

826
00:47:40,820 --> 00:47:43,797
hoặc những động từ giải quyết\nmột số vấn đề nhỏ hơn.

827
00:47:43,797 --> 00:47:46,130
Điều đó có nghĩa là bạn có thể sử dụng\na cả đống hàm

828
00:47:46,130 --> 00:47:50,240
để giải quyết một vấn đề lớn hơn\nvì mỗi hàm đều có xu hướng làm

829
00:47:50,240 --> 00:47:52,851
một cái gì đó rất cụ thể hoặc chính xác

830
00:47:52,851 --> 00:47:57,141
Những từ này trong tiếng Anh có thể là\n

831
00:47:57,141 --> 00:47:59,360
mã, cho những thứ được gọi là hàm.

832
00:47:59,360 --> 00:48:02,931
Được đánh dấu màu vàng bây giờ là\nnhững gì chúng ta có thể gọi là điều kiện.

833
00:48:02,931 --> 00:48:05,751
Điều kiện là những việc\nbạn làm có điều kiện

834
00:48:05,751 --> 00:48:07,443
dựa trên câu trả lời cho một số câu hỏi.

835
00:48:07,443 --> 00:48:09,651
Bạn có thể coi chúng\nnhư những ngã ba trên đường.

836
00:48:09,650 --> 00:48:12,350
Bạn rẽ trái hay rẽ phải\hay hướng nào khác

837
00:48:12,351 --> 00:48:14,809
dựa trên câu trả lời cho một số câu hỏi?

838
00:48:14,809 --> 00:48:16,101
Vâng, những câu hỏi đó là gì?

839
00:48:16,101 --> 00:48:20,181
Bây giờ được đánh dấu bằng màu vàng hoặc những gì chúng tôi\n

840
00:48:20,181 --> 00:48:25,070
theo tên họ của nhà toán học Bool,\n

841
00:48:25,070 --> 00:48:31,130
Hoặc, nếu bạn thích, câu trả lời đúng hoặc sai\n

842
00:48:31,130 --> 00:48:34,310
Chúng ta chỉ cần phân biệt\none kịch bản này với kịch bản khác.

843
00:48:34,311 --> 00:48:37,101
Điều cuối cùng thể hiện\trong mã giả này

844
00:48:37,101 --> 00:48:39,740
là những gì tôi có thể đánh dấu\nnow và gọi các vòng lặp.

845
00:48:39,740 --> 00:48:43,521
Một loại chu kỳ nào đó, một loại\n nào đó

846
00:48:43,521 --> 00:48:48,861
hết lần này đến lần khác để tôi không\n

847
00:48:48,860 --> 00:48:53,030
một danh bạ điện thoại 1.000 trang, tôi có thể lấy được\n

848
00:48:53,030 --> 00:48:58,161
lặp lại bản thân mình một cách cố hữu để\n

849
00:48:59,221 --> 00:49:01,581
Vậy đây là cái mà chúng ta có thể gọi là mã giả

850
00:49:01,581 --> 00:49:05,151
và thực sự có những đặc điểm khác

851
00:49:05,150 --> 00:49:08,540
về các chương trình mà chúng ta sẽ đề cập trước đó\n

852
00:49:08,541 --> 00:49:13,740
giá trị, biến, v.v., nhưng\n

853
00:49:13,740 --> 00:49:16,371
bao gồm một số thứ chúng tôi sẽ cố ý sử dụng trong lớp này

854
00:49:16,371 --> 00:49:19,760
và mọi người trong thế giới\nthực ngày nay vẫn sử dụng

855
00:49:19,760 --> 00:49:22,201
các chương trình của nó có xu hướng trông như thế này.

856
00:49:22,201 --> 00:49:24,860
Ví dụ, đây là sự chắt lọc\ncủa chương trình đầu tiên đó

857
00:49:24,860 --> 00:49:29,810
Tôi đã viết vào năm 1996 bằng chính CS50\n

858
00:49:29,811 --> 00:49:34,731
Trên thực tế, phiên bản này ở đây chỉ thử\n

859
00:49:34,731 --> 00:49:37,731
Có thể nói rằng đó là điều đầu tiên\nkinh điển nhất mà hầu hết

860
00:49:37,731 --> 00:49:41,601
bất kỳ lập trình viên nào cũng từng được một\nmáy tính nói chỉ vì

861
00:49:42,900 --> 00:49:45,920
Ý tôi là, có một ký hiệu băm,\n

862
00:49:45,920 --> 00:49:49,760
các từ như int, dấu ngoặc nhọn, dấu ngoặc kép,\n

863
00:49:50,420 --> 00:49:54,020
Ý tôi là có nhiều chi phí hơn\nvà nhiều cú pháp hơn và lộn xộn hơn

864
00:49:54,021 --> 00:49:55,941
hơn là có một ý tưởng thực tế.

865
00:49:55,940 --> 00:50:00,080
Điều đó không có nghĩa là bạn sẽ không\n

866
00:50:00,081 --> 00:50:03,441
bởi vì thực lòng mà nói thì không có nhiều đến thế\n

867
00:50:03,440 --> 00:50:07,701
thường có vốn từ vựng nhỏ hơn nhiều\n

868
00:50:07,701 --> 00:50:10,581
nhưng lúc đầu nó có thể thực sự trông khá khó hiểu.

869
00:50:10,581 --> 00:50:14,361
Nhưng có lẽ bạn có thể suy ra rằng tôi không có\n

870
00:50:14,360 --> 00:50:18,170
mà là "Xin chào thế giới." \ncó lẽ là trích dẫn bỏ trích dẫn cái gì

871
00:50:18,170 --> 00:50:19,860
sẽ được in trên màn hình.

872
00:50:19,860 --> 00:50:22,880
Nhưng những gì chúng ta sẽ làm hôm nay,\nsau một thời gian nghỉ ngắn

873
00:50:22,880 --> 00:50:24,980
và chuẩn bị cho\tiếp theo phần giới thiệu

874
00:50:24,981 --> 00:50:27,336
những ý tưởng giống hệt như vậy\nchỉ một chút khi sử dụng Scratch

875
00:50:27,335 --> 00:50:29,210
thứ gì đó mà chính bạn có thể đã sử dụng

876
00:50:29,210 --> 00:50:32,630
khi bạn còn khá trẻ nhưng\n

877
00:50:34,041 --> 00:50:38,421
Ưu điểm của những gì chúng tôi sẽ sớm thực hiện bằng cách sử dụng\n

878
00:50:38,420 --> 00:50:41,960
ngôn ngữ từ bạn bè của chúng tôi trở xuống\n

879
00:50:41,960 --> 00:50:46,490
bắt đầu kéo và thả những thứ\n

880
00:50:46,490 --> 00:50:48,471
cùng nhau nếu việc đó hợp lý\nhợp lý

881
00:50:48,471 --> 00:50:51,710
nhưng không bị phân tâm\no bởi các hàm băm, dấu ngoặc đơn

882
00:50:51,710 --> 00:50:54,410
dấu ngoặc nhọn, dấu ngoặc nhọn,\ndấu chấm phẩy và các thứ

883
00:50:54,411 --> 00:50:56,311
điều đó hoàn toàn không quan trọng.

884
00:50:56,311 --> 00:50:58,800
Nhưng bây giờ, hãy tiếp tục\nvà nghỉ ngơi 10 phút tại đây

885
00:50:58,800 --> 00:51:01,101
và khi tiếp tục, chúng ta\nsẽ bắt đầu lập trình.

886
00:51:01,101 --> 00:51:04,561
Vì vậy, trên màn hình\nis một ngôn ngữ được gọi là

887
00:51:04,561 --> 00:51:07,921
C thứ gì đó sẽ lặn\nvào tuần tới và thật may mắn

888
00:51:07,920 --> 00:51:10,980
cái này bây giờ trên màn hình là\ngôn ngữ nano khác tên là Python

889
00:51:10,981 --> 00:51:13,921
mà chúng ta cũng sẽ xem xét\nmột vài tuần trước đó

890
00:51:13,920 --> 00:51:15,690
với các ngôn ngữ khác trên đường đi.

891
00:51:15,690 --> 00:51:19,640
Tuy nhiên, hôm nay và trong\ntuần đầu tiên này, có thể nói là tuần thứ 0

892
00:51:19,641 --> 00:51:21,391
chúng tôi sử dụng Scratch vì\nmột lần nữa nó sẽ cho phép

893
00:51:21,391 --> 00:51:23,971
chúng ta khám phá một số\nnguyên tắc cơ bản về lập trình

894
00:51:23,971 --> 00:51:28,471
nó sẽ ở dạng C và Python và trong\n

895
00:51:28,471 --> 00:51:32,521
nhưng theo cách mà chúng ta không cần phải làm vậy\n

896
00:51:32,521 --> 00:51:35,351
Thế giới của Scratch trông như thế này.

897
00:51:35,351 --> 00:51:38,070
Đó là môi trường lập trình\ndựa trên web hoặc có thể tải xuống

898
00:51:38,070 --> 00:51:40,920
có bố cục này ở đây\ntheo mặc định. Bên trái đây

899
00:51:40,920 --> 00:51:45,000
chúng ta sẽ sớm thấy một bảng câu đố\n

900
00:51:45,001 --> 00:51:47,521
đại diện cho tất cả những\ný tưởng mà chúng ta vừa thảo luận.

901
00:51:47,521 --> 00:51:50,071
Và bằng cách kéo và\nthả những mảnh ghép này

902
00:51:50,070 --> 00:51:54,181
hoặc các khối trên khu vực rộng lớn này\nvà kết nối chúng lại với nhau

903
00:51:54,181 --> 00:51:56,251
nếu việc làm đó hợp lý\nhơn, chúng tôi sẽ

904
00:51:56,251 --> 00:51:58,531
bắt đầu lập trình trong môi trường này.

905
00:51:58,530 --> 00:52:01,561
Môi trường cho phép bạn có\n

906
00:52:01,561 --> 00:52:04,111
Nhiều nhân vật, những thứ\nnhư con mèo hay bất cứ thứ gì

907
00:52:04,110 --> 00:52:08,310
khác, và những sinh vật đó tồn tại\trong thế giới hình chữ nhật này

908
00:52:08,311 --> 00:52:11,521
ở đây bạn có thể xem toàn màn hình\n

909
00:52:11,521 --> 00:52:16,201
là Scratch, người có thể di chuyển lên, xuống, sang trái,\n

910
00:52:16,201 --> 00:52:19,291
Trong thế giới\ncủa Scratch, bạn có thể nghĩ về nó

911
00:52:19,291 --> 00:52:23,251
có lẽ là một hệ tọa độ\n quen thuộc với X và Y

912
00:52:23,251 --> 00:52:27,001
điều này chỉ hữu ích khi nó đến\n

913
00:52:27,001 --> 00:52:32,281
Hiện tại Scratch đang ở chế độ mặc định,\n

914
00:52:32,280 --> 00:52:36,061
Nếu bạn di chuyển theo hướng mèo\n

915
00:52:37,891 --> 00:52:40,651
Nếu bạn di chuyển con mèo hết cỡ\n

916
00:52:40,650 --> 00:52:42,940
nhưng y bây giờ sẽ là âm 180.

917
00:52:42,940 --> 00:52:47,460
Và nếu bạn rẽ trái, x sẽ trở thành\n

918
00:52:47,460 --> 00:52:51,690
hoặc ở bên phải x sẽ là\n240 và y sẽ bằng 0.

919
00:52:51,690 --> 00:52:55,590
Vì vậy những con số đó thường không\n

920
00:52:55,590 --> 00:52:58,170
di chuyển tương đối trong thế giới này\nlên, xuống, trái, phải

921
00:52:58,170 --> 00:53:01,230
nhưng khi đến lúc\nhãy xác định vị trí chính xác

922
00:53:01,231 --> 00:53:03,601
một số hình ảnh\hoặc hình ảnh khác, nó sẽ

923
00:53:03,601 --> 00:53:07,050
sẽ hữu ích nếu có được tinh thần đó\n

924
00:53:07,050 --> 00:53:10,150
Nào chúng ta hãy tiếp tục và có lẽ\n

925
00:53:10,150 --> 00:53:13,050
Tôi sẽ chuyển sang\ncùng một môi trường lập trình

926
00:53:13,050 --> 00:53:15,971
bây giờ là chuyến tham quan phía bên tay trái.

927
00:53:15,971 --> 00:53:20,911
Vì vậy, theo mặc định, lựa chọn ở đây là\ndanh mục chuyển động màu xanh lam

928
00:53:20,911 --> 00:53:24,451
trong đó có cả đống câu đố\n

929
00:53:24,451 --> 00:53:27,001
Và trong khi Scratch as\na ngôn ngữ đồ họa

930
00:53:27,001 --> 00:53:30,688
phân loại mọi thứ theo loại\nnhững việc mà những phần này làm

931
00:53:30,688 --> 00:53:32,521
chúng ta sẽ thấy điều đó xuyên suốt\ntoàn bộ bảng màu này

932
00:53:32,521 --> 00:53:35,461
chúng ta sẽ có các hàm,\nbiến và điều kiện

933
00:53:35,460 --> 00:53:38,650
và các biểu thức Boolean và hơn thế nữa\n

934
00:53:38,650 --> 00:53:42,181
Vì vậy, ví dụ, di chuyển 10 bước\cũng không rẽ sang hướng này hay hướng khác

935
00:53:42,181 --> 00:53:45,691
sẽ là các chức năng được phân loại\nở đây thành những thứ như chuyển động.

936
00:53:45,690 --> 00:53:49,257
Dưới giao diện màu tím, bạn\ncó thể có ô hội thoại

937
00:53:49,257 --> 00:53:51,090
mà bạn có thể tạo bằng cách\nkéo và thả

938
00:53:51,090 --> 00:53:54,360
những cái này có thể nói "xin chào" hoặc\n

939
00:53:54,360 --> 00:53:58,320
Hoặc bạn có thể đổi trang phục, thay đổi\n

940
00:54:01,320 --> 00:54:05,010
Bạn có thể phát các âm thanh như "meo meo" hoặc\n

941
00:54:06,001 --> 00:54:09,271
Sau đó có những thứ này gọi bằng Scratch\n

942
00:54:09,271 --> 00:54:11,191
là lần đầu tiên khi cờ xanh được nhấp vào.

943
00:54:11,190 --> 00:54:14,221
Bởi vì nếu chúng ta nhìn sang\nquyền của thế giới Scratch ở đây

944
00:54:14,221 --> 00:54:17,670
vùng hình chữ nhật này có\ncờ xanh và điểm dừng màu đỏ

945
00:54:17,670 --> 00:54:20,880
đăng ký ở trên, một trong số đó là\nđể chơi, một trong số đó là để dừng

946
00:54:20,880 --> 00:54:24,510
và điều đó sẽ cho phép chúng tôi\n

947
00:54:24,510 --> 00:54:27,840
khi lá cờ xanh\nis đó được nhấp vào lần đầu tiên.

948
00:54:27,840 --> 00:54:31,860
Nhưng bạn có thể nghe các loại khác\n

949
00:54:31,860 --> 00:54:35,911
hoặc cái gì khác, khi sprite này\n

950
00:54:35,911 --> 00:54:39,570
Ở đây bạn đã thấy giống như một\nhiện thân của mọi thứ

951
00:54:39,570 --> 00:54:42,451
bạn và tôi coi như\nmọi ngày trên điện thoại của mình là điều hiển nhiên.

952
00:54:42,451 --> 00:54:46,391
Bất kỳ lúc nào bạn nhấn vào một biểu tượng hoặc kéo\n

953
00:54:46,391 --> 00:54:48,550
Đây là những gì mà một lập trình viên\nsẽ gọi là sự kiện

954
00:54:48,550 --> 00:54:51,451
những điều xảy ra và\na thường do chúng ta gây ra

955
00:54:51,451 --> 00:54:55,471
con người và những thứ mà một chương trình\ncó thể được lập trình bằng Scratch hoặc Python

956
00:54:55,471 --> 00:54:59,280
hoặc C hoặc bất cứ thứ gì khác có thể\nlắng nghe và phản hồi.

957
00:54:59,280 --> 00:55:01,980
Quả thực, đó là lý do tại sao khi bạn nhấn\nbiểu tượng điện thoại trên điện thoại của mình

958
00:55:01,981 --> 00:55:04,441
ứng dụng điện thoại\nkhởi động vì ai đó

959
00:55:04,440 --> 00:55:08,640
đã viết phần mềm đang lắng nghe\n

960
00:55:08,641 --> 00:55:10,711
Vì vậy, Scratch cũng có những thứ tương tự.

961
00:55:10,710 --> 00:55:13,590
Trong phần Kiểm soát có màu cam,\nbạn có thể thấy rằng chúng tôi

962
00:55:13,590 --> 00:55:15,721
có thể đợi một giây\cũng không lặp lại điều gì đó

963
00:55:15,721 --> 00:55:17,670
một số lần,\n10 theo mặc định, nhưng chúng tôi

964
00:55:17,670 --> 00:55:20,800
có thể thay đổi bất kỳ thứ gì trong\nvòng tròn màu trắng này thành bất kỳ thứ gì khác.

965
00:55:20,800 --> 00:55:22,710
Có một câu đố\nmảnh ghép khác ở đây mãi mãi

966
00:55:22,710 --> 00:55:25,590
ngụ ý một loại vòng lặp nào đó\n

967
00:55:25,590 --> 00:55:27,060
Mặc dù nó có vẻ hơi chật, nhưng vẫn có

968
00:55:27,061 --> 00:55:29,131
không có nhiều chỗ để nhét\nthứ gì đó vào đó, Scratch

969
00:55:29,130 --> 00:55:31,005
những thứ này sẽ lớn lên và co lại

970
00:55:31,005 --> 00:55:33,993
tuy nhiên chúng tôi muốn lấp đầy\ncác phần có hình dạng tương tự.

971
00:55:33,994 --> 00:55:35,161
Dưới đây là những điều kiện đó.

972
00:55:35,161 --> 00:55:40,061
Nếu điều gì đó đúng hoặc sai,\nthì hãy thực hiện việc tiếp theo.

973
00:55:40,061 --> 00:55:42,841
Và đó là cách chúng ta có thể đặt\nhình dạng hình thang nhỏ này.

974
00:55:42,840 --> 00:55:46,770
Một số dạng biểu thức Boolean, a\n

975
00:55:46,771 --> 00:55:50,131
hoặc câu trả lời một/không và quyết định\ncó nên làm điều gì đó hay không.

976
00:55:50,130 --> 00:55:52,440
Bạn cũng có thể kết hợp những thứ này.

977
00:55:52,440 --> 00:55:55,905
Nếu điều gì đó đúng thì hãy làm điều này,\nhãy làm điều kia.

978
00:55:55,905 --> 00:55:57,780
Và bạn thậm chí có thể nhét\none vào bên trong cái kia

979
00:55:57,780 --> 00:56:01,320
nếu bạn muốn hỏi ba\hoặc bốn câu hỏi trở lên.

980
00:56:01,320 --> 00:56:03,010
Cảm giác cũng vậy, sẽ là một điều.

981
00:56:03,010 --> 00:56:07,871
Bạn có thể đặt câu hỏi hay còn gọi là Boolean\n

982
00:56:07,871 --> 00:56:10,161
con trỏ chuột,\thu hẹp trên màn hình?

983
00:56:10,161 --> 00:56:12,800
Để bạn có thể bắt đầu\ntương tác với các chương trình này.

984
00:56:12,800 --> 00:56:15,298
Khoảng cách giữa\na sprite và con trỏ chuột là bao nhiêu?

985
00:56:15,298 --> 00:56:17,590
Bạn có thể thực hiện những phép tính đơn giản\nchỉ để tìm ra

986
00:56:17,590 --> 00:56:20,141
nếu kẻ thù đang đến gần con mèo.

987
00:56:20,141 --> 00:56:23,651
Dưới Nhà điều hành một số cấp độ thấp hơn\n

988
00:56:23,650 --> 00:56:25,850
để chọn các số ngẫu nhiên,\nđiều này thật tuyệt vời đối với một trò chơi

989
00:56:25,851 --> 00:56:27,851
bởi vì sau đó bạn có thể thay đổi độ khó

990
00:56:27,851 --> 00:56:30,309
hoặc điều gì đang xảy ra trong một trò chơi\nmà không chơi cùng một trò chơi

991
00:56:33,550 --> 00:56:37,520
Điều gì đó và điều gì đó phải là sự thật\n

992
00:56:38,021 --> 00:56:40,240
Hoặc thậm chí chúng ta có thể nối hai từ lại với nhau.

993
00:56:40,240 --> 00:56:43,181
Theo mặc định, nói táo và chuối,\n

994
00:56:43,181 --> 00:56:46,990
bất cứ điều gì bạn muốn ở đó\nkết hợp nhiều từ thành đầy đủ

995
00:56:48,581 --> 00:56:52,361
Rồi cuối cùng xuống đây, có trong\n

996
00:56:52,360 --> 00:56:54,911
Trong toán học, rõ ràng chúng ta\không có x và y và những thứ tương tự.

997
00:56:54,911 --> 00:56:56,921
Trong lập trình, chúng ta\ncó khả năng tương tự

998
00:56:56,920 --> 00:57:03,010
để lưu trữ trong các ký hiệu được đặt tên này,\n

999
00:57:03,010 --> 00:57:06,701
Cuối cùng thì các con số, chữ cái, từ ngữ,\nmàu sắc hay bất cứ thứ gì.

1000
00:57:06,701 --> 00:57:09,971
Nhưng trong lập trình bạn sẽ thấy điều đó\n

1001
00:57:09,971 --> 00:57:13,391
sử dụng các chữ cái đơn giản như x\nand y và z, nhưng thực tế

1002
00:57:13,391 --> 00:57:20,291
đưa ra các biến số ít hoặc số nhiều\n

1003
00:57:20,291 --> 00:57:24,131
Cuối cùng, nếu đây\không đủ khối màu cho bạn

1004
00:57:24,130 --> 00:57:25,960
bạn có thể tạo các khối của riêng bạn.

1005
00:57:25,960 --> 00:57:29,050
Quả thực, đây sẽ là một\n

1006
00:57:29,050 --> 00:57:32,920
và với vấn đề đầu tiên được đặt ra theo đó\n

1007
00:57:32,920 --> 00:57:37,660
từng mảnh và bạn nhận ra, ồ, sẽ có\n

1008
00:57:37,661 --> 00:57:40,990
vừa được thay thế bởi một\nhad MIT nghĩ sẽ cho tôi cái đó

1009
00:57:40,990 --> 00:57:44,291
một mảnh ghép, chính bạn\ncó thể tạo ra các khối của riêng mình

1010
00:57:44,291 --> 00:57:47,111
bằng cách kết nối tất cả những thứ này lại với nhau,\nđặt tên cho chúng và bùng nổ

1011
00:57:47,110 --> 00:57:49,250
một mảnh ghép mới sẽ tồn tại.

1012
00:57:49,251 --> 00:57:51,581
Vì vậy, hãy thực hiện những chương trình\nchuẩn mực nhất, đơn giản nhất

1013
00:57:51,581 --> 00:57:53,530
đây, bắt đầu với\nđiều khiển và tôi sẽ

1014
00:57:53,530 --> 00:57:57,880
để nhấp và kéo và thả cái này\n

1015
00:57:57,880 --> 00:58:01,107
Sau đó, tôi sẽ lấy một\nthêm nữa, chẳng hạn như trong phần Ngoại hình

1016
00:58:01,108 --> 00:58:03,191
và bên dưới Vẻ ngoài tôi sẽ\ntiếp tục và chỉ nói

1017
00:58:03,190 --> 00:58:07,900
đại loại như ban đầu không\nchỉ là Hello mà càng chuẩn hơn

1018
00:58:09,550 --> 00:58:12,250
Bây giờ bạn có thể đoán rằng trong\nmôi trường lập trình này

1019
00:58:12,251 --> 00:58:15,611
Bây giờ tôi có thể đi qua đây\nnhấp vào lá cờ xanh và thì đấy

1020
00:58:17,090 --> 00:58:19,005
Đó là\nchương trình đầu tiên của tôi và rõ ràng là rất nhiều

1021
00:58:19,005 --> 00:58:21,880
thân thiện với người dùng hơn là gõ phím\n

1022
00:58:21,880 --> 00:58:25,040
thấy trên màn hình rằng\nbạn cũng sẽ gõ vào tuần tới.

1023
00:58:25,041 --> 00:58:28,280
Nhưng hiện tại, chúng ta sẽ chỉ tập trung vào\n

1024
00:58:28,280 --> 00:58:29,891
Vậy chuyện gì vừa xảy ra vậy?

1025
00:58:29,891 --> 00:58:32,391
Khối màu tím này ở đây\nNói, đó là hàm

1026
00:58:32,391 --> 00:58:37,090
và có vẻ như nó cần một dạng đầu vào nào đó\n

1027
00:58:37,996 --> 00:58:40,121
Chà, điều này thực sự phù hợp\nmô hình mà chúng tôi đã xem xét

1028
00:58:40,121 --> 00:58:42,445
trước đó chỉ là đầu vào và đầu ra.

1029
00:58:42,445 --> 00:58:45,340
Vậy nếu tôi có thể, nếu bạn xem xét\nmảnh ghép này đang làm gì

1030
00:58:47,050 --> 00:58:51,010
Đầu vào trong trường hợp này đang diễn ra\n

1031
00:58:51,010 --> 00:58:55,346
Thuật toán sắp được triển khai\n

1032
00:58:55,346 --> 00:58:57,971
và kết quả của việc đó\nsẽ là một loại tác dụng phụ nào đó

1033
00:58:57,971 --> 00:59:01,271
giống như con mèo và lời nói\nbong bóng đang nói Xin chào thế giới.

1034
00:59:01,271 --> 00:59:03,760
Vì vậy, ngay cả\nchỉ cần kéo và thả đơn giản

1035
00:59:03,760 --> 00:59:07,340
bắt chước chính xác mô hình tinh thần tương đối\nđơn giản này.

1036
00:59:07,340 --> 00:59:08,750
Vì vậy, hãy đưa mọi thứ đi xa hơn.

1037
00:59:08,751 --> 00:59:11,923
Bây giờ chúng ta hãy tiếp tục và thực hiện\n

1038
00:59:11,922 --> 00:59:14,380
nó có nội dung như\nXin chào, David hoặc Xin chào, Carter

1039
00:59:14,380 --> 00:59:16,600
hoặc Xin chào bạn cụ thể.

1040
00:59:16,601 --> 00:59:18,556
Và để làm điều này, tôi sẽ\nchuyển sang phần Cảm biến.

1041
00:59:18,556 --> 00:59:21,431
Và bạn có thể phải lục lọi\n

1042
00:59:21,431 --> 00:59:24,472
xung quanh, nhưng tôi đã làm điều này một vài lần\n

1043
00:59:26,860 --> 00:59:28,752
Hỏi tên bạn là gì,\nnhưng tên đó có màu trắng

1044
00:59:28,753 --> 00:59:30,461
vì vậy chúng ta có thể thay đổi\ncâu hỏi thành bất cứ điều gì

1045
00:59:30,460 --> 00:59:34,930
chúng tôi muốn và nó sẽ đợi\n

1046
00:59:34,931 --> 00:59:37,510
Chức năng này có tên là Ask\nis hơi khác một chút

1047
00:59:37,510 --> 00:59:41,320
từ khối Say vừa có\n

1048
00:59:42,460 --> 00:59:47,080
Chức năng hỏi thậm chí còn mạnh mẽ hơn\n

1049
00:59:47,831 --> 00:59:50,831
Chức năng này sẽ\ntrả lại cho bạn những gì

1050
00:59:50,831 --> 00:59:55,091
họ đã nhập vào dưới dạng\ncái được gọi là giá trị trả về, cái này

1051
00:59:55,090 --> 00:59:57,940
cuối cùng được lưu trữ và theo mặc định, thứ này được gọi là Trả lời.

1052
00:59:57,940 --> 01:00:00,612
Hình bầu dục nhỏ màu xanh này ở đây\ncó tên là Câu trả lời lại là

1053
01:00:00,612 --> 01:00:02,320
một trong những biến\ntrong toán học sẽ

1054
01:00:02,320 --> 01:00:05,828
chỉ được gọi là x hoặc y nhưng trong\n

1055
01:00:05,829 --> 01:00:07,371
Vì vậy, tôi sẽ tiếp tục và làm điều này.

1056
01:00:07,371 --> 01:00:09,204
Hãy để tôi tiếp tục\ndkéo và thả khối này

1057
01:00:09,204 --> 01:00:11,631
và tôi muốn đặt câu hỏi\ntrước khi nói bất cứ điều gì

1058
01:00:11,630 --> 01:00:13,630
nhưng bạn sẽ nhận thấy rằng\nScratch rất thông minh và nó

1059
01:00:13,630 --> 01:00:15,641
sẽ nhận ra rằng tôi muốn\chèn thứ gì đó vào giữa

1060
01:00:15,641 --> 01:00:17,599
và nó sẽ\ndi chuyển mọi thứ lên xuống.

1061
01:00:17,599 --> 01:00:20,530
Tôi định buông tay và hỏi\n

1062
01:00:20,530 --> 01:00:23,770
Và bây giờ nếu tôi muốn tiếp tục\nvà chào, David hoặc Carter

1063
01:00:23,771 --> 01:00:26,141
chúng ta hãy làm Hello\ncomma, vì rõ ràng là tôi

1064
01:00:26,141 --> 01:00:28,820
không biết khi nào tôi viết\nchương trình ai sẽ sử dụng nó.

1065
01:00:28,820 --> 01:00:35,141
Vậy bây giờ hãy để tôi lấy một khối giao diện khác\n

1066
01:00:35,141 --> 01:00:39,280
hãy để tôi quay lại phần Cảm biến và bây giờ\n

1067
01:00:39,280 --> 01:00:42,610
bởi mảnh ghép khác này, và\n

1068
01:00:42,610 --> 01:00:45,460
Lưu ý rằng nó có hình dạng giống nhau\n

1069
01:00:45,460 --> 01:00:47,650
Mọi thứ sẽ phát triển hoặc thu hẹp khi cần thiết.

1070
01:00:47,650 --> 01:00:49,721
Được rồi, bây giờ chúng ta hãy thu nhỏ lại.

1071
01:00:49,721 --> 01:00:52,630
Hãy để tôi dừng phiên bản cũ\n

1072
01:00:53,291 --> 01:00:55,751
Hãy để tôi nhấn cờ xanh\nvà tên tôi là gì?

1073
01:00:59,338 --> 01:01:01,880
Được rồi, có lẽ tôi đã không chú ý kỹ.

1074
01:01:03,141 --> 01:01:06,360
Cờ xanh, D-A-V-I-D, Enter.

1075
01:01:09,280 --> 01:01:13,300
Bạn có thể nghĩ lỗi hoặc\nsai lầm gì?

1076
01:01:14,150 --> 01:01:17,370
ĐỐI TƯỢNG: Bạn có cần thêm bằng cách nào đó\n

1077
01:01:17,371 --> 01:01:20,760
DAVID Malan: Vâng, chúng tôi hơi muốn\n

1078
01:01:20,760 --> 01:01:23,940
Và về mặt kỹ thuật thì đó là một lỗi vì\n

1079
01:01:23,940 --> 01:01:26,910
Nó chỉ nói David\nsau khi tôi hỏi tên mình.

1080
01:01:26,911 --> 01:01:29,971
Tôi muốn nó nói\ncó lẽ Xin chào David

1081
01:01:29,971 --> 01:01:32,460
nhưng nó chỉ lướt qua\nXin chào và in ra David.

1082
01:01:32,460 --> 01:01:34,780
Nhưng hãy cùng tìm hiểu\tại sao điều này lại xảy ra.

1083
01:01:34,780 --> 01:01:38,190
Bạn đúng về giải pháp, nhưng\n

1084
01:01:39,228 --> 01:01:42,706
ĐỐI TƯỢNG: Thế là nó nói xin chào,\nnhưng nó đã đi đến bước cuối cùng

1085
01:01:42,706 --> 01:01:43,925
nhanh đến mức bạn không thể nhìn thấy nó.

1086
01:01:44,800 --> 01:01:47,440
Ý tôi là, máy tính ngày nay\nthực sự rất nhanh.

1087
01:01:47,440 --> 01:01:50,350
Nó đang nói Xin chào, tất cả chúng ta\na đang ở trong phòng này quá chậm

1088
01:01:50,351 --> 01:01:54,740
thậm chí có thể nhìn thấy nó bởi vì lúc đó nó đang nói\n

1089
01:01:54,740 --> 01:01:57,443
Vì vậy, có một số giải pháp\nở đây và giải pháp của bạn là phù hợp

1090
01:01:57,443 --> 01:01:59,651
nhưng chỉ để tìm hiểu thôi,\nbạn sẽ thấy ví dụ đầu tiên

1091
01:01:59,650 --> 01:02:03,130
có bao nhiêu cách trong lập trình\n

1092
01:02:03,130 --> 01:02:05,440
nếu không thì sẽ có cách giải quyết vấn đề?

1093
01:02:05,440 --> 01:02:07,420
Chúng tôi sẽ hướng dẫn bạn trong\nkhóa học trong những tuần này

1094
01:02:07,420 --> 01:02:10,660
đôi khi một số cách\ntương đối tốt hơn những cách khác

1095
01:02:10,661 --> 01:02:13,811
nhưng hiếm khi nhất thiết phải có\ncách tốt nhất

1096
01:02:13,811 --> 01:02:15,728
bởi vì một lần nữa hợp lý\nmọi người sẽ không đồng ý.

1097
01:02:15,728 --> 01:02:17,936
Và những điều chúng tôi sẽ cố gắng dạy\nbạn trong những tuần tới

1098
01:02:17,936 --> 01:02:20,111
là cách suy nghĩ\nthông qua những sắc thái đó.

1099
01:02:20,110 --> 01:02:22,257
Và nó sẽ không rõ ràng ngay từ cái nhìn đầu tiên

1100
01:02:22,257 --> 01:02:24,340
nhưng bạn\nviết càng nhiều chương trình thì càng có nhiều phản hồi

1101
01:02:24,340 --> 01:02:26,951
bạn nhận được càng nhiều lỗi\nmà bạn giới thiệu

1102
01:02:26,951 --> 01:02:30,860
bạn càng có được chỗ đứng với\n

1103
01:02:30,860 --> 01:02:33,130
Vậy hãy để tôi thử điều này theo một vài cách.

1104
01:02:33,130 --> 01:02:35,620
Ở trên đây sẽ là một\ngiải pháp cho vấn đề.

1105
01:02:35,621 --> 01:02:40,286
MIT đã đoán trước được loại vấn đề này,\n

1106
01:02:40,286 --> 01:02:42,161
và tôi chỉ có thể sử dụng một\nmảnh ghép có nội dung

1107
01:02:42,161 --> 01:02:44,771
nói những câu sau trong\nhai giây hoặc một giây

1108
01:02:44,771 --> 01:02:47,381
hoặc bất cứ điều gì, sau đó thực hiện\nđiều tương tự với từ tiếp theo

1109
01:02:47,380 --> 01:02:50,110
và có thể\ncó một chút tạm dừng

1110
01:02:50,110 --> 01:02:54,610
Xin chào, một giây, hai giây, David,\n

1111
01:02:54,610 --> 01:02:56,760
nó sẽ có vẻ đúng ngữ pháp hơn một chút.

1112
01:02:56,760 --> 01:02:59,260
Nhưng tôi có thể làm điều đó một cách thanh lịch hơn một chút, như bạn đã đề xuất.

1113
01:02:59,260 --> 01:03:01,385
Hãy để tôi tiếp tục và ném\nmột trong những khối này đi

1114
01:03:01,385 --> 01:03:04,181
và bạn chỉ cần kéo và thả\ngo là nó sẽ tự xóa.

1115
01:03:04,181 --> 01:03:10,211
Hãy để tôi đi xuống Toán tử vì\n

1116
01:03:10,210 --> 01:03:13,721
Vì vậy, ngay cả khi bạn không chắc chắn điều gì sẽ xảy ra\n

1117
01:03:17,300 --> 01:03:20,170
Hãy để tôi tiếp tục và\nnói xin chào bằng dấu phẩy.

1118
01:03:20,170 --> 01:03:22,330
Bây giờ nó chỉ có thể nói theo\nmặc định Xin chào, chuối

1119
01:03:22,331 --> 01:03:27,701
nhưng hãy để tôi quay lại\nCảm biến, Kéo câu trả lời

1120
01:03:27,701 --> 01:03:29,501
và nó sẽ kéo và thả ở đó.

1121
01:03:29,501 --> 01:03:34,161
Vì vậy bây giờ hãy lưu ý rằng chúng ta đang sắp xếp chúng\n

1122
01:03:34,161 --> 01:03:38,021
để đầu ra của một cái trở thành\n

1123
01:03:38,021 --> 01:03:42,024
Hãy để tôi tiếp tục và phóng to\nthu nhỏ, nhấn Dừng và nhấn Phát.

1124
01:03:42,023 --> 01:03:43,190
Được rồi, tên bạn là gì?

1125
01:03:45,550 --> 01:03:48,770
Bây giờ có lẽ\na đó là ý định đầu tiên của chúng tôi.

1126
01:03:57,811 --> 01:04:02,728
Vì vậy, hãy cân nhắc điều đó ngay cả với\nví dụ bổ sung này

1127
01:04:02,728 --> 01:04:05,811
nó vẫn phù hợp với mô hình tinh thần tương tự,\n

1128
01:04:05,811 --> 01:04:08,961
Đây là chức năng mới\nHãy hỏi điều gì đó và chờ đợi.

1129
01:04:08,960 --> 01:04:12,471
Và lưu ý rằng trong trường hợp này cũng vậy\n

1130
01:04:12,471 --> 01:04:15,621
từ nay trở đi như một đối số\cũng không phải một tham số, lập trình

1131
01:04:15,621 --> 01:04:18,681
chỉ nói về một đầu vào trong\nngữ cảnh của một hàm.

1132
01:04:18,681 --> 01:04:21,831
Nếu chúng ta sử dụng bản vẽ của mình như trước\nđể thể hiện điều này ở đây

1133
01:04:21,831 --> 01:04:26,061
chúng ta sẽ thấy rằng dữ liệu đầu vào bây giờ đang diễn ra\n

1134
01:04:26,061 --> 01:04:30,081
Thuật toán sắp được triển khai\n

1135
01:04:30,081 --> 01:04:33,381
hàm có tên là Hỏi và\nđầu ra của thứ đó lần này

1136
01:04:33,380 --> 01:04:36,110
sẽ không trở thành\ncon mèo nói bất cứ điều gì

1137
01:04:36,110 --> 01:04:39,721
mà đúng hơn nó sẽ là câu trả lời thực sự.

1138
01:04:39,721 --> 01:04:43,130
Vì vậy, thay vì tác dụng phụ về mặt thị giác\n

1139
01:04:43,130 --> 01:04:45,620
bây giờ không có gì có thể nhìn thấy đang xảy ra.

1140
01:04:45,621 --> 01:04:49,671
Nhờ chức năng này mà nó giống như vậy\n

1141
01:04:49,670 --> 01:04:55,701
với bất cứ điều gì tôi gõ vào được viết trên đó\n

1142
01:04:57,951 --> 01:05:00,050
Bây giờ tôi đã làm gì với giá trị đó?

1143
01:05:00,050 --> 01:05:04,820
Hãy xem xét điều đó với\nchức năng tiếp theo

1144
01:05:04,820 --> 01:05:08,280
chúng tôi cũng có khối Say này\n, được kết hợp với một phép nối.

1145
01:05:08,280 --> 01:05:11,780
Vì vậy, chúng ta có biến này\nđược gọi là Trả lời, chúng ta sẽ kết hợp nó

1146
01:05:11,780 --> 01:05:14,202
với đối số đầu tiên đó, Xin chào.

1147
01:05:14,202 --> 01:05:16,161
Vậy là chúng ta đã thấy\nmột số chức năng như Tham gia

1148
01:05:16,161 --> 01:05:20,001
có thể nhận không phải một mà là hai đối số\cũng như dữ liệu đầu vào và điều đó không sao cả.

1149
01:05:20,001 --> 01:05:24,891
Đầu ra của Tham gia có lẽ đang diễn ra\n

1150
01:05:24,891 --> 01:05:27,171
hoặc bất cứ điều gì con người gõ vào.

1151
01:05:27,170 --> 01:05:31,580
Thông báo đầu ra đó về cơ bản là\n

1152
01:05:31,581 --> 01:05:33,951
Nói đi, chỉ vì chúng ta\ncó nhiều thứ xếp chồng lên nhau

1153
01:05:33,951 --> 01:05:35,851
hoặc lồng chúng lên nhau.

1154
01:05:35,851 --> 01:05:40,280
Nhưng về mặt phương pháp, đó\nthực sự là cùng một ý tưởng.

1155
01:05:40,280 --> 01:05:44,900
Dữ liệu đầu vào bây giờ là hai thứ,\nXin chào dấu phẩy và giá trị trả về

1156
01:05:44,900 --> 01:05:47,300
từ chức năng Hỏi trước đó.

1157
01:05:47,300 --> 01:05:51,230
Chức năng bây giờ sẽ là Tham gia,\n

1158
01:05:51,231 --> 01:05:53,061
Nhưng xin chào, David\noutput hiện đang diễn ra

1159
01:05:53,061 --> 01:05:57,501
để trở thành đầu vào cho một hàm khác,\n

1160
01:05:57,501 --> 01:06:01,611
và thế là sẽ có một bên\n

1161
01:06:02,670 --> 01:06:06,410
Vì vậy, một lần nữa, nó lại khá phức tạp\n

1162
01:06:06,411 --> 01:06:09,231
sẽ có được, họ thực sự có được\n

1163
01:06:09,231 --> 01:06:12,741
của đầu vào và đầu ra và bạn chỉ cần có\n

1164
01:06:12,740 --> 01:06:17,030
và để biết loại câu đố nào\n

1165
01:06:17,030 --> 01:06:19,650
Nhưng cuối cùng thì bạn cũng có thể thực sự thêm gia vị cho những thứ này.

1166
01:06:19,650 --> 01:06:21,320
Hãy để tôi quay lại\nchương trình của tôi ở đây

1167
01:06:21,320 --> 01:06:22,911
bằng cách sử dụng bong bóng lời nói vào lúc này.

1168
01:06:22,911 --> 01:06:26,090
Bên trong Scratch có vài cái khá đẹp\n

1169
01:06:26,090 --> 01:06:28,971
Tôi nhấp vào nút Tiện ích mở rộng\ở góc dưới bên trái.

1170
01:06:28,971 --> 01:06:33,248
Và hãy để tôi tiếp tục và chọn\ntiện ích mở rộng Chuyển văn bản thành giọng nói.

1171
01:06:33,248 --> 01:06:36,081
Đây là sử dụng dịch vụ Đám mây, vì vậy\n

1172
01:06:36,081 --> 01:06:39,141
nó thực sự có thể giao tiếp với\nCloud hoặc dịch vụ của bên thứ ba

1173
01:06:39,141 --> 01:06:42,411
và cái này sẽ cho tôi một\n

1174
01:06:42,411 --> 01:06:45,171
khả năng nói\nđiều gì đó từ loa của tôi

1175
01:06:45,170 --> 01:06:47,090
thay vì chỉ nói bằng văn bản.

1176
01:06:47,090 --> 01:06:48,574
Vì vậy, hãy để tôi tiếp tục và kéo cái này.

1177
01:06:48,574 --> 01:06:51,740
Bây giờ hãy lưu ý rằng tôi không cần phải khóa liên động\n

1178
01:06:51,740 --> 01:06:52,971
và tôi muốn di chuyển một số thứ xung quanh.

1179
01:06:52,971 --> 01:06:55,280
Tôi chỉ muốn tạm thời sử dụng cái này như\nnhư một bức vẽ.

1180
01:06:55,280 --> 01:06:58,141
Hãy để tôi tiếp tục và\nđánh cắp Tham gia từ đây

1181
01:06:58,141 --> 01:07:01,581
đặt nó ở đó, để tôi vứt\nkhối Say bằng cách di chuyển nó

1182
01:07:01,581 --> 01:07:04,641
rời đi và buông tay,\nbây giờ hãy để tôi tham gia vào

1183
01:07:04,641 --> 01:07:08,581
nên bây giờ tôi đã thay đổi chương trình của mình\nđể thú vị hơn một chút.

1184
01:07:08,581 --> 01:07:10,341
Vì vậy, bây giờ hãy để tôi dừng phiên bản cũ.

1185
01:07:18,365 --> 01:07:20,240
DAVID Malan: (CƯỜI)\nOK, thực tế là trừ 2.

1186
01:07:20,240 --> 01:07:27,260
Được rồi, vậy thì tôi vô tình\n

1187
01:07:27,260 --> 01:07:30,170
cho mục đích giảng dạy,\nlà câu trả lời thực tế

1188
01:07:30,170 --> 01:07:32,660
được trả về từ khối hỏi.

1189
01:07:33,621 --> 01:07:37,593
Vì vậy bây giờ nếu tôi chơi lại trò này,\nhãy nhấp vào biểu tượng màu xanh lá cây.

1190
01:07:50,271 --> 01:07:54,481
Được rồi, vậy là chúng ta có những chức năng này rồi\n

1191
01:07:54,481 --> 01:07:57,441
Vậy còn những điều kiện đó thì sao\n

1192
01:07:57,440 --> 01:07:59,810
Làm cách nào chúng tôi có thể đưa những chương trình này\vào cuộc sống để nó không chỉ

1193
01:07:59,811 --> 01:08:01,951
nhấp vào nút và thì đấy,\ncó chuyện gì đó đang xảy ra vậy?

1194
01:08:01,951 --> 01:08:04,251
Hãy tiếp tục và làm cho tính năng này\ntương tác hơn nữa.

1195
01:08:04,251 --> 01:08:06,501
Hãy để tôi tiếp tục và vứt bỏ hầu hết những thứ này

1196
01:08:06,501 --> 01:08:09,471
và để tôi thêm gia vị cho mọi thứ\n

1197
01:08:09,471 --> 01:08:12,170
Tôi sẽ vào Play\nSound Meow cho đến khi hoàn tất.

1198
01:08:15,251 --> 01:08:18,521
Được rồi, nó hơi to một chút nhưng nó\đã làm đúng như những gì nó nói.

1199
01:08:21,791 --> 01:08:23,490
Cuối cùng thì đây cũng là một chương trình\n chán ngắt

1200
01:08:23,490 --> 01:08:26,551
vì bạn muốn nghĩ rằng\n

1201
01:08:26,940 --> 01:08:28,358
Tôi phải nhấn nút liên tục.

1202
01:08:28,358 --> 01:08:31,386
Chà, đây có vẻ như là một cơ hội\n

1203
01:08:31,386 --> 01:08:33,511
Được rồi, nếu tôi\nmuốn meo, meo, meo

1204
01:08:33,511 --> 01:08:37,171
để tôi lấy một ít trong số này, hoặc bạn\n

1205
01:08:37,171 --> 01:08:39,360
và bạn có thể Sao chép Dán\nngay cả mã ở đây.

1206
01:08:43,230 --> 01:08:45,228
Được rồi, bây giờ có vẻ như\nit không thực sự gây cảm xúc

1207
01:08:45,228 --> 01:08:46,560
hạnh phúc theo cách hoàn toàn giống nhau.

1208
01:08:49,421 --> 01:08:52,481
Hãy để tôi đi tới Kiểm soát, đợi\không một giây ở giữa

1209
01:08:52,480 --> 01:08:55,860
có thể sẽ bớt lo lắng hơn một chút.

1210
01:09:01,451 --> 01:09:06,310
Được rồi, vậy nếu mục tiêu của tôi là làm cho\ncon mèo kêu meo meo ba lần

1211
01:09:06,310 --> 01:09:10,000
Tôi dám nói mã hoặc\thuật toán này là chính xác.

1212
01:09:10,001 --> 01:09:12,940
Nhưng bây giờ chúng ta hãy phê bình thiết kế của nó.

1213
01:09:21,501 --> 01:09:27,052
ĐỐI TƯỢNG: Bạn có thể sử dụng mãi mãi\n

1214
01:09:27,052 --> 01:09:28,510
DAVID Malan: Đúng vậy, đồng ý.

1215
01:09:28,511 --> 01:09:31,301
Tôi có thể sử dụng mãi mãi hoặc lặp lại,\nnhưng hãy để tôi nhấn mạnh hơn một chút.

1216
01:09:31,990 --> 01:09:36,070
Cứ như thế này, tôi gần như đã xong việc với\n

1217
01:09:36,070 --> 01:09:37,881
KHÁN GIẢ: Có quá nhiều sự lặp lại.

1218
01:09:37,881 --> 01:09:40,131
DAVID Malan: Vâng, có quá nhiều sự lặp lại phải không?

1219
01:09:40,131 --> 01:09:42,591
Nếu tôi muốn thay đổi\nâm thanh mà con mèo đang tạo ra

1220
01:09:42,591 --> 01:09:46,041
sang một biến thể khác của meo meo hoặc\n

1221
01:09:46,041 --> 01:09:48,351
Rõ ràng tôi có thể thay đổi nó từ\nthả xuống ở đây

1222
01:09:48,350 --> 01:09:51,350
nhưng sau đó tôi sẽ phải thay đổi nó ở đây\n

1223
01:09:51,350 --> 01:09:54,110
và Chúa ơi, nếu chuyện này còn dài hơn\nthì nó sẽ nhanh chóng trở nên nhàm chán

1224
01:09:54,110 --> 01:09:56,030
và có lẽ bạn đang\tăng xác suất

1225
01:09:56,030 --> 01:09:57,081
rằng bạn sắp sửa làm hỏng việc và bạn sẽ

1226
01:09:57,081 --> 01:10:00,072
bỏ lỡ một trong các danh sách thả xuống hoặc\n

1227
01:10:00,072 --> 01:10:02,779
Hoặc, nếu bạn muốn thay đổi\n

1228
01:10:02,779 --> 01:10:05,150
bạn phải thay đổi nó ở\nhai, thậm chí có thể nhiều chỗ hơn.

1229
01:10:05,150 --> 01:10:07,581
Một lần nữa, bạn chỉ đang\ntạo ra rủi ro cho chính mình

1230
01:10:07,581 --> 01:10:09,150
và các lỗi tiềm ẩn trong chương trình.

1231
01:10:09,150 --> 01:10:13,041
Vì vậy tôi thích lặp lại hoặc mãi mãi\n

1232
01:10:13,041 --> 01:10:15,801
Và thực sự, điều tôi cho là có thể xảy ra

1233
01:10:15,801 --> 01:10:18,651
sao chép và dán trước đó không có nghĩa đó là điều tốt.

1234
01:10:18,650 --> 01:10:20,421
Và trong mã,\nnói chung, khi bạn

1235
01:10:20,421 --> 01:10:23,841
bắt đầu sao chép và dán các mảnh ghép\nhoặc văn bản vào tuần tới

1236
01:10:23,841 --> 01:10:26,910
có thể bạn đang làm\nđiều gì đó không tốt.

1237
01:10:26,909 --> 01:10:30,680
Vì vậy hãy để tôi tiếp tục và vứt bỏ hầu hết\n

1238
01:10:30,680 --> 01:10:33,680
chỉ giữ lại hai\nkhối mà tôi quan tâm.

1239
01:10:33,680 --> 01:10:37,880
Hãy để tôi lấy khối Lặp lại bây giờ,\n

1240
01:10:37,881 --> 01:10:40,941
chặn, nó sẽ phát triển cho vừa\nit, hãy để tôi kết nối lại tất cả những thứ này

1241
01:10:40,940 --> 01:10:44,449
và thay đổi số 10\thành số 3 và bây giờ, Chơi.

1242
01:10:51,621 --> 01:10:53,538
Nó vẫn đúng, nhưng\nbây giờ tôi đã chuẩn bị xong rồi

1243
01:10:53,537 --> 01:10:57,040
ví dụ như để con mèo kêu meo meo\n

1244
01:10:57,041 --> 01:11:00,431
40 lần bằng cách thay đổi một thứ, hoặc\n

1245
01:11:00,430 --> 01:11:03,159
và chỉ cần bỏ đi và thay vào đó nó\nsẽ kêu meo meo mãi mãi.

1246
01:11:03,159 --> 01:11:05,230
Nếu đó là mục tiêu của bạn thì\nđiều đó sẽ tốt hơn.

1247
01:11:05,230 --> 01:11:07,569
Một thiết kế tốt hơn nhưng vẫn chính xác.

1248
01:11:08,319 --> 01:11:10,270
Bây giờ tôi có một\nchương trình được thiết kế

1249
01:11:10,270 --> 01:11:13,630
có một con mèo kêu meo meo, ồ, tại sao vậy?

1250
01:11:13,631 --> 01:11:16,360
Ý tôi là, MIT đã phát minh\nScratch, Scratch như một con mèo

1251
01:11:16,359 --> 01:11:18,371
tại sao không có mảnh ghép\ntên Meow?

1252
01:11:18,371 --> 01:11:20,081
Điều này cảm thấy như một cơ hội bị bỏ lỡ.

1253
01:11:20,081 --> 01:11:22,751
Công bằng mà nói, họ đã trao\nus tất cả các khối xây dựng

1254
01:11:22,751 --> 01:11:26,032
mà chúng tôi có thể thực hiện điều đó\n

1255
01:11:26,032 --> 01:11:28,239
và thực sự là khoa học máy tính\nis để tận dụng những gì chúng tôi đang có

1256
01:11:28,239 --> 01:11:30,489
bây giờ bắt đầu gọi Trừu tượng.

1257
01:11:30,489 --> 01:11:34,480
Chúng tôi có hướng dẫn từng bước\ntại đây, Lặp lại, Phát

1258
01:11:34,480 --> 01:11:37,001
và Wait cùng nhau\nithực hiện ý tưởng này

1259
01:11:37,001 --> 01:11:38,771
mà con người chúng ta gọi là meo meo.

1260
01:11:38,770 --> 01:11:41,831
Chẳng phải sẽ rất hay nếu trừu tượng\nmột vài câu đố đó sao?

1261
01:11:41,831 --> 01:11:45,701
từng mảnh thành một theo đúng nghĩa đen\n

1262
01:11:45,701 --> 01:11:48,280
Vâng, đây là nơi chúng ta\ncó thể tạo các khối của riêng mình.

1263
01:11:48,280 --> 01:11:52,331
Hãy để tôi qua đây tới Scratch\ntrong danh mục khối màu hồng

1264
01:11:52,331 --> 01:11:55,932
ở đây và để tôi nhấp vào Tạo một khối.

1265
01:11:55,932 --> 01:11:57,640
Ở đây tôi thấy một giao diện hơi khác

1266
01:11:57,640 --> 01:12:00,490
nơi tôi có thể chọn tên cho nó\nvà tôi sẽ gọi nó là Meow.

1267
01:12:05,180 --> 01:12:08,201
Bây giờ tôi sẽ\ndọn dẹp nó một chút ở đây.

1268
01:12:08,201 --> 01:12:12,020
Để tôi kéo và thả Play\nSound và Wait ở đây.

1269
01:12:13,030 --> 01:12:15,850
Tôi sẽ kéo cái này\nxuống đây, xuống dưới

1270
01:12:15,850 --> 01:12:18,190
ở đây vì bây giờ tôi\nđã triển khai xong Meow

1271
01:12:18,190 --> 01:12:21,050
Tôi sẽ trừu tượng hóa theo đúng nghĩa đen\nit, gần như khuất tầm nhìn

1272
01:12:21,051 --> 01:12:25,301
mất trí rồi, vì giờ mới để ý ở\n

1273
01:12:26,711 --> 01:12:31,541
Vì vậy, tại thời điểm này, tôi cho rằng điều đó không\n

1274
01:12:31,541 --> 01:12:35,020
Thành thật mà nói, tôi không biết Ask\nor Say được MIT triển khai như thế nào.

1275
01:12:35,020 --> 01:12:37,210
Họ đã trừu tượng hóa những thứ đó cho chúng tôi.

1276
01:12:37,211 --> 01:12:40,121
Bây giờ tôi có một mảnh ghép\nhoàn toàn mới chỉ cho biết nó là gì.

1277
01:12:40,121 --> 01:12:44,440
Và điều này bây giờ vẫn đúng,\nnhưng được cho là có thiết kế tốt hơn.

1278
01:12:45,041 --> 01:12:47,440
Bởi vì nó dễ\nđọc hơn đối với tôi, với bạn

1279
01:12:47,440 --> 01:12:49,690
nó dễ bảo trì hơn\nkhi bạn nhìn vào mã của mình

1280
01:12:49,690 --> 01:12:52,240
một năm kể từ bây giờ lần đầu tiên\n

1281
01:12:52,240 --> 01:12:53,948
quay lại chương trình\nđầu tiên bạn viết.

1282
01:12:55,541 --> 01:12:59,230
Bản thân hàm này có ngữ nghĩa,\n

1283
01:12:59,230 --> 01:13:01,960
Nếu bạn thực sự quan tâm\nMeow được triển khai như thế nào

1284
01:13:01,961 --> 01:13:04,931
bạn có thể cuộn xuống và bắt đầu\nsửa đổi phần cơ bản

1285
01:13:04,930 --> 01:13:09,701
chi tiết triển khai, nhưng mặt khác\n

1286
01:13:09,701 --> 01:13:13,211
Bây giờ tôi cảm thấy như có\nmột cơ hội nữa

1287
01:13:13,211 --> 01:13:17,711
ở đây để trừu tượng hóa và phân tích\n

1288
01:13:17,711 --> 01:13:21,161
Thật là khập khiễng khi tôi có khối Lặp lại này

1289
01:13:21,161 --> 01:13:24,511
để tôi gọi hàm Meo,\n

1290
01:13:25,570 --> 01:13:28,480
Chẳng phải sẽ tốt hơn sao nếu tôi\ngọi chúng là hàm Meow

1291
01:13:28,480 --> 01:13:32,860
hay còn gọi là sử dụng hàm Meow và vượt qua\n

1292
01:13:32,860 --> 01:13:35,110
mảnh bao nhiêu lần tôi muốn nó kêu meo meo?

1293
01:13:35,110 --> 01:13:37,970
Hãy để tôi tiếp tục\thu nhỏ và cuộn xuống.

1294
01:13:37,970 --> 01:13:41,560
Hãy để tôi nhấp chuột phải hoặc nhấp chuột Control vào\n

1295
01:13:41,560 --> 01:13:44,951
hoặc tôi có thể bắt đầu lại từ đầu,\n

1296
01:13:44,951 --> 01:13:48,791
Bây giờ ở đây, thay vì chỉ đưa cái này\n

1297
01:13:50,801 --> 01:13:53,081
Tôi sẽ tiếp tục và\nnhập vào, ví dụ: n

1298
01:13:53,081 --> 01:13:56,141
vài lần\nmeo meo và chỉ để thực hiện

1299
01:13:56,140 --> 01:13:58,505
điều này thậm chí còn thân thiện hơn với người dùng\nvà tự mô tả

1300
01:13:58,506 --> 01:14:00,881
Tôi sẽ thêm một nhãn\nnhãn này không có tác động gì về mặt chức năng

1301
01:14:00,881 --> 01:14:03,070
nó chỉ mang tính thẩm mỹ,\nvà tôi sẽ đi

1302
01:14:03,070 --> 01:14:05,740
nói Times, chỉ để làm cho\nit đọc giống tiếng Anh hơn

1303
01:14:05,740 --> 01:14:08,201
trong trường hợp này nó cho tôi biết\nmảnh ghép có tác dụng gì.

1304
01:14:09,680 --> 01:14:12,201
Và bây giờ tôi cần tinh chỉnh\nđiều này một chút.

1305
01:14:12,201 --> 01:14:18,480
Hãy để tôi tiếp tục và lấy\ndưới Kiểm soát khối lặp lại

1306
01:14:18,480 --> 01:14:22,180
để tôi chuyển Play, Sound,\nand Wait vào khối lặp lại.

1307
01:14:22,180 --> 01:14:24,720
Tôi không muốn 10 và tôi cũng không muốn 3 ở đây.

1308
01:14:24,720 --> 01:14:29,880
Điều tôi muốn bây giờ là cái này cái kia\n

1309
01:14:29,881 --> 01:14:33,271
đang tạo ra cho tôi cái đại diện\n

1310
01:14:34,025 --> 01:14:35,400
Chú ý rằng nó khớp đúng vị trí.

1311
01:14:35,400 --> 01:14:39,451
Hãy để tôi kết nối cái này và bây giờ thì đấy, tôi\n

1312
01:14:40,951 --> 01:14:44,878
Nó nhận đầu vào ảnh hưởng đến hành vi\nits tương ứng.

1313
01:14:44,878 --> 01:14:47,671
Bây giờ tôi sẽ cuộn ngược lên,\n

1314
01:14:47,671 --> 01:14:49,021
Tôi chỉ quan tâm rằng Meow có tồn tại.

1315
01:14:49,020 --> 01:14:52,560
Bây giờ tôi có thể thắt chặt mã của mình,\ncó thể nói, sử dụng ít dòng hơn nữa

1316
01:14:52,560 --> 01:14:55,740
làm điều tương tự bằng cách\nvứt bỏ khối Lặp lại

1317
01:14:55,740 --> 01:15:00,091
đang kết nối lại mảnh ghép mới này tại đây\n

1318
01:15:00,091 --> 01:15:02,221
bây giờ chúng ta thực sự đang lập trình, phải không?

1319
01:15:02,220 --> 01:15:04,560
Chúng tôi chưa thực hiện bất kỳ tiến bộ nào về mặt chức năng.

1320
01:15:04,560 --> 01:15:06,871
Điều chỉ cần chuột ba lần.

1321
01:15:09,060 --> 01:15:11,371
Khi bạn ngày càng lập trình\nnhiều hơn, đây là những loại

1322
01:15:11,371 --> 01:15:13,860
của bản năng vẫn bắt đầu có được nên người ta

1323
01:15:13,860 --> 01:15:16,711
bạn có thể bắt đầu nhận một nhiệm vụ lớn,\n

1324
01:15:16,711 --> 01:15:20,371
thậm chí cả bài tập về nhà, điều đó có vẻ giống\n

1325
01:15:21,541 --> 01:15:25,440
Nhưng nếu bạn bắt đầu xác định được\n

1326
01:15:25,440 --> 01:15:27,390
Sau đó, bạn có thể bắt đầu tiến bộ.

1327
01:15:27,390 --> 01:15:32,070
Tôi làm điều này cho đến ngày nay nếu tôi phải làm vậy\n

1328
01:15:32,070 --> 01:15:36,121
thật dễ dàng để làm tôi chùn bước và ugh,\n

1329
01:15:36,121 --> 01:15:38,820
cho đến khi tôi bắt đầu viết\ndòng như một danh sách việc cần làm

1330
01:15:38,820 --> 01:15:41,490
và tôi bắt đầu mô-đun hóa\nchương trình và nói, được rồi, à

1331
01:15:41,490 --> 01:15:42,600
tôi muốn thứ này để làm gì?

1332
01:15:43,680 --> 01:15:45,680
Tôi phải yêu cầu nó\nnói điều gì đó trên màn hình.

1333
01:15:45,680 --> 01:15:48,150
Được rồi, tôi cần nó\nnói điều gì đó trên màn hình

1334
01:15:49,081 --> 01:15:52,421
Giống như nghĩa đen là tâm thần hoặc văn bản\n

1335
01:15:52,421 --> 01:15:55,621
nếu bạn muốn, bằng tiếng Anh trên một\nmảnh giấy hoặc tệp văn bản

1336
01:15:55,621 --> 01:15:57,810
và sau đó bạn có thể quyết định,\nĐược rồi, điều đầu tiên tôi

1337
01:15:57,810 --> 01:16:00,790
cần làm bài tập về nhà để\ngiải quyết vấn đề thực tế này

1338
01:16:02,161 --> 01:16:04,261
Tôi cũng cần sử dụng một loạt\n mã khác

1339
01:16:04,261 --> 01:16:06,661
nhưng tôi cần tạo một hàm\nMeow và bùm

1340
01:16:06,661 --> 01:16:10,440
bây giờ bạn đã gặp phải một phần vấn đề\n

1341
01:16:10,440 --> 01:16:14,850
đặt chỗ ở đó, nhưng trong trường hợp này, chúng tôi sẽ\n

1342
01:16:14,850 --> 01:16:16,510
Được rồi, vậy chúng ta có thể làm gì hơn nữa?

1343
01:16:16,511 --> 01:16:18,993
Hãy thêm một vài\nmảnh ghép nữa vào câu đố ở đây.

1344
01:16:18,993 --> 01:16:20,701
Bây giờ chúng ta hãy thực sự tương tác\nvới con mèo.

1345
01:16:20,701 --> 01:16:24,030
Hãy để tôi tiếp tục và bây giờ khi\n

1346
01:16:24,030 --> 01:16:26,820
và đặt câu hỏi bằng cách sử dụng một sự kiện ở đây.

1347
01:16:26,820 --> 01:16:31,081
Hãy để tôi tiếp tục và\nnói, để xem nào, tôi muốn

1348
01:16:31,081 --> 01:16:34,331
để làm điều gì đó như thực hiện\ný tưởng vuốt ve con mèo.

1349
01:16:34,331 --> 01:16:39,841
Vì vậy, nếu con trỏ chạm vào\n

1350
01:16:39,841 --> 01:16:42,472
sẽ thật dễ thương nếu con mèo kêu\nnhư thể bạn đang vuốt ve một con mèo.

1351
01:16:42,472 --> 01:16:45,180
Vì vậy tôi sẽ đặt câu hỏi,\n

1352
01:16:45,180 --> 01:16:48,370
nếu để xem tôi nghĩ tôi cần Cảm biến.

1353
01:16:48,371 --> 01:16:50,761
Vì vậy, nếu chạm vào chuột\ncon trỏ, nó quá lớn

1354
01:16:50,761 --> 01:16:52,891
nhưng một lần nữa hình dạng vẫn\nổn, thế là xong.

1355
01:16:53,730 --> 01:16:56,280
Và sau đó nếu nó chạm\ncon trỏ chuột

1356
01:16:56,280 --> 01:16:59,760
đó là nếu con mèo mà\nkịch bản này hoặc chương trình này gửi cho

1357
01:16:59,761 --> 01:17:03,031
bất cứ khi nào tôi đính kèm câu đố\nmảnh MIT gọi chúng là tập lệnh

1358
01:17:03,030 --> 01:17:07,230
hoặc giống như một chương trình, nếu bạn muốn, hãy\n

1359
01:17:07,230 --> 01:17:10,219
và nói chơi kêu meo meo cho đến khi xong.

1360
01:17:10,219 --> 01:17:11,761
Được rồi, ở đây cần phải rõ ràng.

1361
01:17:11,761 --> 01:17:13,891
Khi cờ xanh được\nnhấp vào, hãy đặt câu hỏi

1362
01:17:13,890 --> 01:17:18,180
nếu con mèo đang chạm vào con trỏ chuột\nthì hãy đặt âm thanh meo meo.

1363
01:17:29,581 --> 01:17:34,351
Tôi lo rằng đó không phải lỗi của Scratch. Cảm giác giống như của tôi.

1364
01:17:39,381 --> 01:17:42,231
Vâng, ở phía sau, người vừa quay lại.

1365
01:17:47,935 --> 01:17:50,810
DAVID Malan: Vâng, vấn đề là\n

1366
01:17:50,810 --> 01:17:54,260
Scratch đặt câu hỏi,\n

1367
01:17:54,261 --> 01:17:57,261
Và rõ ràng không phải vì\n

1368
01:17:58,430 --> 01:18:01,370
Tôi di chuyển con trỏ\nxuống đó cũng được nhưng đã quá muộn.

1369
01:18:01,371 --> 01:18:03,141
Chương trình đã đặt câu hỏi rồi.

1370
01:18:03,140 --> 01:18:06,810
Câu trả lời là không hoặc sai hoặc không,\n

1371
01:18:08,190 --> 01:18:10,340
Vậy giải pháp ở đây có thể là gì?

1372
01:18:10,341 --> 01:18:12,891
Tôi có thể di chuyển con trỏ\nnhanh chóng, nhưng có vẻ như

1373
01:18:12,890 --> 01:18:14,900
như thể sẽ không bao giờ thành công vậy.

1374
01:18:18,051 --> 01:18:20,521
Bạn có thể sử dụng vòng lặp mãi mãi không?

1375
01:18:21,341 --> 01:18:24,601
Vậy là tôi thực sự có thể sử dụng cái này Mãi mãi\n

1376
01:18:24,600 --> 01:18:28,080
chỉ cần liên tục lắng nghe tôi, à\n

1377
01:18:28,081 --> 01:18:30,150
hoặc ít nhất là mãi mãi\nmiễn là chương trình còn

1378
01:18:30,150 --> 01:18:32,318
chạy cho đến khi tôi nhấn Dừng một cách rõ ràng.

1379
01:18:33,150 --> 01:18:36,480
Để tôi vào Control, để\ntôi lấy khối Forever

1380
01:18:36,480 --> 01:18:40,260
để tôi di chuyển khối If bên trong khối\nForever này, hãy kết nối lại khối này

1381
01:18:40,261 --> 01:18:43,951
quay lại đây, nhấp vào màu xanh\n

1382
01:18:43,951 --> 01:18:45,721
nhưng hãy để tôi thử di chuyển con trỏ ngay bây giờ.

1383
01:18:50,381 --> 01:18:52,298
Vậy là bây giờ con mèo thực sự\nđang phản hồi và nó

1384
01:18:52,297 --> 01:18:54,840
sẽ tiếp tục làm\nviệc này nhiều lần.

1385
01:18:54,841 --> 01:18:58,651
Vì vậy bây giờ chúng tôi có ý tưởng sử dụng những thứ này\n

1386
01:18:58,650 --> 01:19:01,501
các mảnh, lắp ráp chúng thành\nthứ gì đó phức tạp hơn.

1387
01:19:01,501 --> 01:19:03,621
Tôi chắc chắn có thể đặt tên cho điều này.

1388
01:19:03,621 --> 01:19:05,371
Tôi có thể tạo một\nkhối tùy chỉnh, nhưng hiện tại

1389
01:19:05,371 --> 01:19:08,074
chúng ta hãy xem xét loại\nloại tương tác nào chúng ta có thể thực hiện nhiều hơn.

1390
01:19:08,073 --> 01:19:09,240
Hãy để tôi tiếp tục và làm điều này.

1391
01:19:09,240 --> 01:19:12,930
Bằng cách lấy lại một lần nữa,\nkhi cờ xanh được nhấp vào

1392
01:19:12,930 --> 01:19:16,003
để tôi tiếp tục và\nnhấp vào cảm biến video

1393
01:19:16,003 --> 01:19:18,421
và tôi sẽ xoay\nmáy tính xách tay vì nếu không chúng ta sẽ

1394
01:19:18,421 --> 01:19:21,463
sẽ có một chút gì đó khởi đầu\n

1395
01:19:22,470 --> 01:19:25,980
Vì vậy tôi sẽ đi tiết lộ\ncho bạn biết bên trong bục giảng có gì

1396
01:19:29,911 --> 01:19:34,980
Bây giờ chúng ta không có phông nền\nvideo, tôi sẽ nói điều này.

1397
01:19:34,980 --> 01:19:37,110
Thực ra, thay vì nhấp vào lá cờ xanh\n, tôi

1398
01:19:37,110 --> 01:19:40,770
sẽ nói khi nào video chuyển động\n

1399
01:19:40,770 --> 01:19:47,233
đo chuyển động, tôi sẽ đi\n

1400
01:19:47,233 --> 01:19:48,940
Và sau đó tôi sẽ\ngắt đường.

1401
01:19:50,511 --> 01:19:53,341
Chúng tôi sẽ đặt chúng lên trên đó.

1402
01:20:00,451 --> 01:20:03,171
Vì vậy, tay tôi đang di chuyển nhanh hơn\nhơn 50 cái này hay cái khác

1403
01:20:03,171 --> 01:20:05,021
bất kể đơn vị đo là gì.

1404
01:20:06,881 --> 01:20:08,298
DAVID Malan: (CƯỜI) Cảm ơn bạn.

1405
01:20:08,297 --> 01:20:10,960
Vì vậy bây giờ chúng tôi có một phiên bản\ntương tác nhiều hơn nữa.

1406
01:20:12,081 --> 01:20:15,721
Nhưng tôi nghĩ nếu tôi đi từ từ.

1407
01:20:18,780 --> 01:20:23,570
Nó hoàn toàn rùng rợn, nhưng tôi\n

1408
01:20:24,360 --> 01:20:27,161
Cho đến khi tay tôi\ncuối cùng cũng di chuyển nhanh như vậy.

1409
01:20:27,161 --> 01:20:29,341
Và đây thực sự là cơ hội\nan để cho bạn thấy

1410
01:20:29,341 --> 01:20:31,261
điều mà một cựu học sinh đã làm.

1411
01:20:35,501 --> 01:20:38,391
Hãy để tôi tiếp tục và thu nhỏ\nđiều này chỉ trong giây lát.

1412
01:20:40,610 --> 01:20:42,360
(CƯỜI) Nếu ai đó\ncó thể thoải mái

1413
01:20:42,360 --> 01:20:44,871
sắp xuất hiện không chỉ khi đeo mặt nạ mà\ncũng xuất hiện trên máy ảnh trên internet

1414
01:20:44,871 --> 01:20:48,751
Tôi nghĩ chúng ta sẽ chơi một trong những người cũ của bạn\n

1415
01:20:48,751 --> 01:20:51,400
Có ai muốn tình nguyện\nở đây và lên sân khấu không?

1416
01:20:57,011 --> 01:20:58,981
Hãy để tôi thiết lập nó cho bạn ở đây.

1417
01:21:10,180 --> 01:21:13,240
Được rồi, hãy để tôi tiếp tục\nvà toàn màn hình ở đây.

1418
01:21:13,240 --> 01:21:17,640
Vì vậy, đây là cú đánh của một trong những người tiền nhiệm vững chắc hơn của bạn.

1419
01:21:17,640 --> 01:21:20,670
Nó sẽ sử dụng tính năng lấy nét của máy ảnh\n

1420
01:21:20,671 --> 01:21:22,328
để đặt bên trong hình chữ nhật này.

1421
01:21:22,328 --> 01:21:24,661
Bạn đã bao giờ chơi trò chơi\nđập chuột chũi ở trò chơi điện tử chưa?

1422
01:21:25,470 --> 01:21:27,617
Vì vậy, đối với những người chưa biết,\nnhững nốt ruồi nhỏ này sẽ xuất hiện

1423
01:21:27,618 --> 01:21:29,701
và với một\nammer rất mờ nhạt, bạn gần như bị hạ gục.

1424
01:21:29,701 --> 01:21:31,493
Tuy nhiên, nếu bạn\nkhông phiền, bạn sẽ đi

1425
01:21:31,493 --> 01:21:34,121
sử dụng đầu của bạn để thực hiện việc này một cách ảo.

1426
01:21:34,121 --> 01:21:39,121
Vì vậy, hãy sắp xếp suy nghĩ của bạn với\n

1427
01:21:48,211 --> 01:21:50,400
Và bây giờ hãy đánh nốt ruồi bằng đầu của bạn.

1428
01:22:14,930 --> 01:22:16,850
Được rồi, một tràng pháo tay dành cho Sahar.

1429
01:22:24,600 --> 01:22:26,732
Vì vậy, ngoài việc có một\nmột chút niềm vui ở đây

1430
01:22:26,733 --> 01:22:28,440
mục tiêu là\chứng minh điều đó bằng cách sử dụng

1431
01:22:28,440 --> 01:22:31,890
một số khối xây dựng cơ bản, đơn giản, thô sơ

1432
01:22:31,890 --> 01:22:34,260
nhưng có thể tập hợp chúng theo một cách vui vẻ\nvới chút âm nhạc

1433
01:22:34,261 --> 01:22:37,781
một số trang phục hoặc tác phẩm nghệ thuật mới, bạn\n

1434
01:22:37,780 --> 01:22:40,841
Nhưng vào cuối ngày,\n

1435
01:22:40,841 --> 01:22:43,591
là những cái giống như những cái tôi vừa\n

1436
01:22:43,591 --> 01:22:45,311
vì rõ ràng có rất nhiều nốt ruồi.

1437
01:22:45,310 --> 01:22:49,290
Vì vậy, học sinh có thể đã tạo một vài\n

1438
01:22:49,291 --> 01:22:50,708
nhưng ít nhất có bốn nốt ruồi khác nhau.

1439
01:22:50,707 --> 01:22:53,457
Họ thích một số loại đồ họa\n

1440
01:22:54,600 --> 01:22:57,090
Có một số loại\nđồng hồ đếm giờ, có thể là một biến số

1441
01:22:57,091 --> 01:22:59,676
rằng mỗi giây đều đang đếm ngược.

1442
01:22:59,676 --> 01:23:02,551
Vì vậy, bạn có thể tưởng tượng việc lấy những gì trông\n

1443
01:23:02,551 --> 01:23:04,561
thoạt nhìn, và\ncó lẽ choáng ngợp

1444
01:23:04,560 --> 01:23:07,980
để tự giải quyết, nhưng hãy nghĩ về\n

1445
01:23:07,980 --> 01:23:12,360
Và có thể nói như vậy, mỗi lần hãy gỡ bỏ từng mảnh\ncủa câu đố.

1446
01:23:12,360 --> 01:23:15,100
Vì vậy, thực sự nếu chúng ta tua lại một chút.

1447
01:23:15,100 --> 01:23:17,880
Hãy để tôi tiếp tục\nvà giới thiệu một chương trình

1448
01:23:17,881 --> 01:23:20,521
mà chính tôi đã làm\nkhi còn học cao học

1449
01:23:20,520 --> 01:23:23,081
khi Scratch\nđược phát triển lần đầu tiên bởi MIT.

1450
01:23:23,081 --> 01:23:26,400
Hãy để tôi tiếp tục và mở\nở đây, cho tôi một giây thôi

1451
01:23:26,400 --> 01:23:30,630
thứ gì đó mà tôi đã gọi lại\vào ngày Oscar Giờ đó

1452
01:23:30,631 --> 01:23:32,761
trông hơi giống thế này.

1453
01:23:32,761 --> 01:23:34,591
Nếu tôi toàn màn hình và nhấn Play.

1454
01:23:34,591 --> 01:23:38,166
[ÂM NHẠC - ĐƯỜNG SESAME, "TÔI YÊU RÁC"]

1455
01:23:38,166 --> 01:23:40,041
OSCAR THE GROUCH:\n(Hát) Ồ, tôi thích rác rưởi.

1456
01:23:40,041 --> 01:23:42,458
DAVID Malan: Vậy là bạn sẽ nhận thấy\na một mảnh rác đang rơi xuống.

1457
01:23:42,457 --> 01:23:45,930
Tôi có thể nhấp vào nó và kéo và khi tôi nhận được\n

1458
01:23:45,930 --> 01:23:47,930
OSCAR THE GROUCH: (Hát)\nBất cứ thứ gì rách rưới hoặc--

1459
01:23:47,930 --> 01:23:49,820
DAVID Malan: Có vẻ như nó muốn đi vào.

1460
01:23:50,900 --> 01:23:52,400
OSCAR THE GROUCH: (Hát) Vâng, tôi--

1461
01:23:54,935 --> 01:23:56,600
OSCAR THE GROUCH: (Hát) Nếu bạn\n

1462
01:23:56,600 --> 01:23:57,740
DAVID Malan: Tôi cũng sẽ làm như vậy, hai điểm.

1463
01:23:57,740 --> 01:24:00,140
OSCAR THE GROUCH: (Hát) Tôi có đây\n

1464
01:24:00,140 --> 01:24:01,820
DAVID Malan: Có một\nsneaker từ trên trời rơi xuống

1465
01:24:01,820 --> 01:24:03,288
vì vậy một loại sprite khác.

1466
01:24:03,288 --> 01:24:05,246
OSCAR THE GROUCH: (Hát)\nDây giày bị rách rồi.

1467
01:24:07,070 --> 01:24:09,291
DAVID Malan: Tôi cũng\ncó thể lười biếng một chút

1468
01:24:09,291 --> 01:24:13,234
và cứ để chúng rơi vào\nthùng rác nếu tôi muốn.

1469
01:24:13,234 --> 01:24:15,651
Vì vậy bạn có thể thấy nó không liên quan\nđến con trỏ chuột của tôi

1470
01:24:15,650 --> 01:24:18,270
rõ ràng là nó có liên quan\nvới khoảng cách ở đây.

1471
01:24:18,270 --> 01:24:19,730
Chúng ta hãy lắng nghe thêm một chút.

1472
01:24:19,730 --> 01:24:23,300
Tôi nghĩ rằng một số thứ rác rưởi khác sắp xuất hiện.

1473
01:24:23,301 --> 01:24:26,871
Có lẽ có một loại biến số nào đó\n

1474
01:24:26,871 --> 01:24:28,371
OSCAR THE GROUCH: (Hát) Tôi yêu--

1475
01:24:28,371 --> 01:24:30,703
DAVID Malan: OK, hãy xem\nđoạn điệp khúc cuối cùng ở đây là gì.

1476
01:24:30,703 --> 01:24:32,720
OSCAR THE GROUCH:\n(Hát) Đồ thối tha.

1477
01:24:32,720 --> 01:24:35,810
Tôi có ở đây một số tờ báo, giòn và

1478
01:24:35,810 --> 01:24:37,790
DAVID Malan: Được rồi, và thế là anh ấy tiếp tục.

1479
01:24:37,791 --> 01:24:40,701
Và bài hát thực sự cứ tiếp tục lặp đi lặp lại

1480
01:24:40,701 --> 01:24:43,371
và tôi không có kỷ niệm đẹp\nvề việc thực hiện điều này và nghe thấy

1481
01:24:43,371 --> 01:24:46,400
bài hát này kéo dài khoảng 10\n giờ liền, nhưng nó

1482
01:24:46,400 --> 01:24:50,055
một ví dụ điển hình để xem xét\nchương trình này được soạn thảo như thế nào?

1483
01:24:50,055 --> 01:24:52,430
Lần đầu tiên tôi triển khai\nit như thế nào?

1484
01:24:52,430 --> 01:24:54,755
Và hãy để tôi tiếp tục\nmở một số chương trình ngay bây giờ

1485
01:24:54,756 --> 01:24:56,631
mà tôi đã viết trước\nchỉ để chúng ta có thể

1486
01:24:56,631 --> 01:24:58,911
xem những thứ này được lắp ráp như thế nào.

1487
01:24:58,911 --> 01:25:02,331
Thành thật mà nói, điều đầu tiên\ncó lẽ tôi đã làm là

1488
01:25:02,331 --> 01:25:04,730
để làm điều gì đó giống như thế này

1489
01:25:04,730 --> 01:25:07,161
Đây chỉ là một phiên bản\ncủa chương trình trong đó

1490
01:25:07,161 --> 01:25:09,860
Tôi bắt đầu giải quyết\nchỉ một vấn đề trước tiên

1491
01:25:09,860 --> 01:25:12,121
trồng cột đèn trong chương trình.

1492
01:25:12,621 --> 01:25:14,391
Tôi gần như đã có một tầm nhìn về những gì tôi muốn.

1493
01:25:14,390 --> 01:25:15,980
Bạn biết đấy, nó đã phát triển\không theo thời gian, chắc chắn là vậy

1494
01:25:15,980 --> 01:25:17,420
nhưng tôi biết tôi muốn\nthùng rác rơi xuống, tôi muốn

1495
01:25:17,421 --> 01:25:19,128
một Oscar\nthe Grouch nhỏ dễ thương sắp xuất hiện

1496
01:25:19,128 --> 01:25:22,041
về thùng rác và một số\nthứ khác, nhưng ồ, nhiều quá

1497
01:25:23,690 --> 01:25:26,570
Tôi sẽ bắt đầu dễ dàng, tải xuống\na hình ảnh cột đèn

1498
01:25:26,570 --> 01:25:30,951
rồi kéo và thả nó vào\n

1499
01:25:31,970 --> 01:25:33,740
Nó không có chức năng làm bất cứ điều gì.

1500
01:25:33,740 --> 01:25:36,831
Ý tôi là, theo nghĩa đen đó là\ncode mà tôi đã viết để thực hiện việc này.

1501
01:25:36,831 --> 01:25:38,990
Tất cả những gì tôi đã làm là sử dụng\ntính năng Phông nền

1502
01:25:38,990 --> 01:25:41,041
và kéo, thả và\ndi chuyển mọi thứ xung quanh

1503
01:25:41,041 --> 01:25:44,181
nhưng nó đã đưa tôi đến phiên bản\nkhông có chương trình nào của tôi.

1504
01:25:44,180 --> 01:25:46,010
Vậy thì phiên bản hai có thể là gì?

1505
01:25:46,011 --> 01:25:48,591
Vâng, tôi đã cân nhắc\nphần chức năng nào

1506
01:25:48,591 --> 01:25:52,083
thẳng thắn mà nói thì có lẽ là dễ nhất\n

1507
01:25:52,082 --> 01:25:54,290
Đó có vẻ là một phần chức năng khá\ncốt lõi.

1508
01:25:54,291 --> 01:25:56,551
Nó chỉ cần ngồi\nở đó hầu hết thời gian.

1509
01:25:56,551 --> 01:25:59,931
Vì vậy, điều tiếp theo có lẽ tôi đã làm là mở ra

1510
01:25:59,930 --> 01:26:05,600
ví dụ: phiên bản thùng rác\n

1511
01:26:06,113 --> 01:26:08,030
Vì vậy lần này tôi sẽ cho bạn thấy\ncó gì bên trong đây.

1512
01:26:08,030 --> 01:26:10,400
Có một số mã, nhưng không nhiều.

1513
01:26:10,400 --> 01:26:14,421
Lưu ý ở dưới cùng bên phải tôi thay đổi\n

1514
01:26:14,421 --> 01:26:17,451
thay vào đó, nhưng đó chính là\nnguyên tắc mà tôi có thể kiểm soát.

1515
01:26:17,451 --> 01:26:20,121
Và sau đó tôi đã thêm mã này vào đây.

1516
01:26:20,121 --> 01:26:23,030
Khi nhấp vào cờ xanh, hãy đổi trang phục

1517
01:26:23,030 --> 01:26:25,110
đến thứ mà tôi tùy tiện\ngọi là Oscar 1.

1518
01:26:25,110 --> 01:26:26,871
Vì vậy tôi đã tìm thấy một vài\nhình ảnh khác nhau

1519
01:26:26,871 --> 01:26:29,990
của một cái thùng rác, một cái trông như thế\n

1520
01:26:29,990 --> 01:26:32,150
và cuối cùng là giải Oscar sắp ra mắt

1521
01:26:32,150 --> 01:26:33,810
và tôi chỉ đặt cho chúng những cái tên khác nhau.

1522
01:26:33,810 --> 01:26:36,980
Vì vậy tôi đã nói Chuyển sang Oscar 1,\là giải pháp bị đóng theo mặc định

1523
01:26:36,980 --> 01:26:40,791
thì mãi mãi làm như sau:\nnếu chạm vào con trỏ chuột

1524
01:26:40,791 --> 01:26:45,711
sau đó chuyển trang phục sang\nOscar 2, nếu không thì chuyển sang Oscar 1.

1525
01:26:45,711 --> 01:26:49,311
Tức là tôi chỉ muốn\n

1526
01:26:49,310 --> 01:26:52,130
và kết thúc, ngay cả khi đó\không chính xác là điều tôi mong muốn cuối cùng

1527
01:26:52,131 --> 01:26:54,181
Tôi chỉ muốn đạt được một số tiến bộ.

1528
01:26:54,180 --> 01:26:59,940
Vì vậy, ở đây, khi tôi chạy chương trình này bằng\n

1529
01:26:59,940 --> 01:27:03,440
Chưa có gì, nhưng nếu tôi\nđến gần thùng rác hơn

1530
01:27:03,440 --> 01:27:07,310
nó thực sự bật mở vì\nit luôn lắng nghe

1531
01:27:07,310 --> 01:27:10,500
cho dù sprite,\nthùng rác trong trường hợp này

1532
01:27:10,501 --> 01:27:11,751
đang chạm vào con trỏ chuột.

1533
01:27:12,440 --> 01:27:15,501
Đó là phiên bản 2, nếu bạn muốn.

1534
01:27:15,501 --> 01:27:18,650
Nếu bây giờ tôi vào và thêm cái đèn\n

1535
01:27:18,650 --> 01:27:20,150
bây giờ chúng tôi đang bắt đầu đạt được tiến bộ.

1536
01:27:20,360 --> 01:27:22,940
Bây giờ nó sẽ trông giống chương trình hơn một chút\n

1537
01:27:22,940 --> 01:27:25,130
Cuối cùng tôi dự định tạo ra.

1538
01:27:25,131 --> 01:27:27,961
Có lẽ tôi đã cắn miếng nào sau đó?

1539
01:27:27,961 --> 01:27:30,231
Ồ, tôi nghĩ điều tôi đã làm\có lẽ tôi đã quyết định

1540
01:27:30,230 --> 01:27:33,740
hãy để tôi triển khai một trong những phần của\n

1541
01:27:34,350 --> 01:27:37,880
Trước tiên, hãy đảm bảo một phần\nthùng rác hoạt động chính xác.

1542
01:27:37,881 --> 01:27:40,280
Vì vậy, hãy để tôi tiếp tục và mở cái này.

1543
01:27:40,280 --> 01:27:43,850
Và một lần nữa, tất cả các ví dụ này sẽ\n

1544
01:27:43,850 --> 01:27:46,040
nên bạn cũng có thể xem tất cả\nnhững ví dụ này.

1545
01:27:46,041 --> 01:27:48,440
Nó không dài lắm,\ntôi chỉ thực hiện trước thôi

1546
01:27:48,440 --> 01:27:50,810
để chúng ta có thể lướt qua\nmột cách nhanh chóng.

1547
01:27:52,341 --> 01:27:56,151
Ở phía bên phải, tôi đã biến\nsprite của mình thành một thứ rác rưởi

1548
01:27:56,150 --> 01:27:58,770
lần này thay vì một con mèo,\thay vì một thùng rác

1549
01:27:58,770 --> 01:28:04,130
và tôi cũng đã tạo ra, với sự giúp đỡ của Carter,\n

1550
01:28:04,131 --> 01:28:07,191
Thực chất nó chỉ là một đường màu đen\nvì ban đầu tôi chỉ muốn

1551
01:28:07,190 --> 01:28:09,621
có một số khái niệm về\ntầng để tôi có thể phát hiện

1552
01:28:09,621 --> 01:28:12,141
nếu thùng rác chạm sàn.

1553
01:28:12,140 --> 01:28:15,411
Bây giờ chưa thấy mã,\nchỉ nghe mô tả đó

1554
01:28:15,411 --> 01:28:20,301
tại sao tôi lại muốn cái thứ hai\n

1555
01:28:20,301 --> 01:28:22,748
với cái thùng rác có ý định từ trên trời rơi xuống?

1556
01:28:22,747 --> 01:28:24,080
Tôi có thể đã nghĩ gì?

1557
01:28:24,081 --> 01:28:26,041
Chẳng hạn như\ntôi đang cố gắng giải quyết vấn đề gì?

1558
01:28:26,270 --> 01:28:28,730
ĐỐI TƯỢNG: Bạn không muốn nhân vật\nđầu tiên đi qua nó.

1559
01:28:28,730 --> 01:28:31,688
DAVID Malan: Vâng, bạn không muốn\n

1560
01:28:31,689 --> 01:28:34,280
đi qua, rồi bùm,\nbạn hoàn toàn mất nó.

1561
01:28:34,280 --> 01:28:36,932
Đó sẽ không phải là một điều rất hữu ích.

1562
01:28:36,932 --> 01:28:39,890
Hoặc có vẻ như nó sẽ ăn nhiều hơn\n

1563
01:28:39,890 --> 01:28:42,560
nếu thùng rác cứ liên tục\nrơi xuống và tôi không thể lấy nó.

1564
01:28:42,560 --> 01:28:44,331
Có thể hơi đau buồn\nnếu bạn cố gắng đạt được nó

1565
01:28:44,331 --> 01:28:46,873
và bạn không thể kéo nó ra\nvà bạn không thể sửa được chương trình.

1566
01:28:46,872 --> 01:28:48,548
Vì thế tôi chỉ muốn sự việc dừng lại.

1567
01:28:48,548 --> 01:28:50,091
Vậy làm thế nào tôi có thể thực hiện điều này?

1568
01:28:50,091 --> 01:28:51,740
Hãy nhìn vào mã ở bên trái.

1569
01:28:51,740 --> 01:28:56,360
Ở đây tôi có một chút ngẫu nhiên,\nnhư tôi đã đề xuất trước đó tồn tại.

1570
01:28:56,360 --> 01:28:59,240
Có chức năng\nmàu xanh này tên là Go To x

1571
01:28:59,240 --> 01:29:03,051
y cho phép tôi di chuyển a\nsprite tới bất kỳ vị trí nào

1572
01:29:03,051 --> 01:29:07,731
lên, xuống, trái, phải, tôi chọn ngẫu nhiên\n

1573
01:29:07,730 --> 01:29:12,470
âm 240 đến dương 240, rồi\n

1574
01:29:12,470 --> 01:29:14,220
Điều này chỉ làm cho\ntrò chơi trở nên thú vị hơn.

1575
01:29:14,220 --> 01:29:18,410
Sẽ khá khập khiễng nếu\n

1576
01:29:18,411 --> 01:29:21,650
Đây là một chút ngẫu nhiên,\n

1577
01:29:23,121 --> 01:29:26,694
Vì vậy bây giờ nếu tôi nhấp vào lá cờ xanh,\nbạn sẽ thấy nó rơi xuống

1578
01:29:26,694 --> 01:29:28,611
sẽ không có điều gì thú vị xảy ra, nhưng nó

1579
01:29:28,610 --> 01:29:33,050
không dừng lại khi chạm vào màu đen\n

1580
01:29:33,051 --> 01:29:37,821
Tôi luôn đặt ra câu hỏi nếu\n

1581
01:29:37,820 --> 01:29:41,550
là sàn lớn hơn\nhơn 0, không sao cả.

1582
01:29:41,551 --> 01:29:44,361
Thay đổi vị trí y bằng âm 3.

1583
01:29:44,360 --> 01:29:48,860
Vì vậy hãy di chuyển nó xuống 3 pixel, xuống 3\n

1584
01:29:48,860 --> 01:29:52,701
không lớn hơn 0, nó bằng 0\n

1585
01:29:52,701 --> 01:29:54,427
nó sẽ ngừng chuyển động hoàn toàn.

1586
01:29:54,427 --> 01:29:56,510
Có những cách khác mà chúng ta có thể\nđã triển khai việc này

1587
01:29:56,511 --> 01:29:58,731
nhưng điều này có vẻ là một cách tốt\nsạch sẽ và hợp lý, chỉ cần

1588
01:29:59,523 --> 01:30:03,711
Được rồi, bây giờ tôi có một số rác rơi xuống, tôi\n

1589
01:30:03,711 --> 01:30:08,211
Tôi có một cột đèn, bây giờ tôi đã hoàn thành được ba bước trong chương trình.

1590
01:30:09,411 --> 01:30:12,411
Nếu chúng ta xem xét một hoặc hai\nphần cuối cùng, một cái gì đó

1591
01:30:12,411 --> 01:30:17,570
giống như việc kéo thùng rác, để tôi\n

1592
01:30:17,570 --> 01:30:21,171
Kéo thùng rác yêu cầu\na loại câu hỏi khác.

1593
01:30:24,121 --> 01:30:26,900
Tôi chỉ cần một sprite, không có\nở đây vì tôi chỉ

1594
01:30:26,900 --> 01:30:29,720
muốn con người di chuyển nó lên,\nxuống, trái, phải và con người

1595
01:30:29,720 --> 01:30:32,750
về mặt vật lý sẽ không thể di chuyển nó ra ngoài thế giới.

1596
01:30:32,751 --> 01:30:36,480
Nếu chúng ta phóng to đoạn mã này,\n

1597
01:30:36,480 --> 01:30:40,670
Chúng tôi đang sử dụng từ kết hợp And\n

1598
01:30:40,671 --> 01:30:44,301
lá cờ xanh được nhấp vào, chúng ta\n

1599
01:30:44,301 --> 01:30:47,571
những câu hỏi này, số nhiều,\nnếu con chuột không hoạt động

1600
01:30:47,570 --> 01:30:53,211
và thùng rác đang chạm vào\ncon trỏ chuột, điều đó tương đương

1601
01:30:53,211 --> 01:30:55,521
một cách hợp lý để nhấp vào thùng rác.

1602
01:30:55,520 --> 01:30:58,831
Hãy tiếp tục và di chuyển\nthùng rác tới con trỏ chuột.

1603
01:30:58,831 --> 01:31:00,891
Vì vậy, một lần nữa cần có ý tưởng\nrất quen thuộc này

1604
01:31:00,890 --> 01:31:04,010
mà bạn và tôi coi đó là điều hiển nhiên\n

1605
01:31:06,621 --> 01:31:10,820
Chà, Mac OS hoặc Windows\ncó lẽ đang đặt câu hỏi.

1606
01:31:10,820 --> 01:31:15,320
Đối với mỗi biểu tượng, chuột có xuống không\n

1607
01:31:15,320 --> 01:31:19,461
Nếu vậy thì đi tới vị trí\ncủa chuột mãi

1608
01:31:19,461 --> 01:31:21,561
trong khi nút chuột được nhấn xuống.

1609
01:31:21,560 --> 01:31:23,720
Vậy thực tế hiện nay điều này diễn ra như thế nào?

1610
01:31:23,720 --> 01:31:25,970
Hãy để tôi tiếp tục và nhấp vào Play.

1611
01:31:25,970 --> 01:31:30,030
Lúc đầu không có gì xảy ra, nhưng nếu\n

1612
01:31:33,121 --> 01:31:36,871
Vì vậy bây giờ tôi cần phải kết hợp\n

1613
01:31:36,871 --> 01:31:39,604
nhưng tôi cá là tôi có thể bắt đầu\nchỉ sử dụng một chương trình duy nhất.

1614
01:31:39,604 --> 01:31:42,021
Hiện tại tôi đang sử dụng\nones riêng biệt để hiển thị các ý tưởng khác nhau

1615
01:31:42,020 --> 01:31:45,170
nhưng bây giờ đó lại là một\nvấn đề khác.

1616
01:31:45,171 --> 01:31:48,028
Nếu chúng ta làm điều cuối cùng,\nđiều gì đó giống như việc ghi điểm

1617
01:31:48,028 --> 01:31:51,110
thật thú vị, bởi vì nhớ lại rằng\n

1618
01:31:51,110 --> 01:31:54,661
vào trong hộp, Oscar lao ra\nvà cho chúng tôi biết tỷ số hiện tại.

1619
01:31:54,661 --> 01:31:59,240
Vậy hãy để tôi tiếp tục và tìm\ncái này, các biến Oscar

1620
01:31:59,240 --> 01:32:01,220
và để tôi phóng to cái này.

1621
01:32:01,220 --> 01:32:04,423
Cái này dài hơn vì chúng ta\nđã kết hợp tất cả các yếu tố này.

1622
01:32:04,423 --> 01:32:07,341
Vậy đây chính là thứ mà\n

1623
01:32:07,341 --> 01:32:09,861
Tôi không biết mình sẽ thực hiện điều này như thế nào

1624
01:32:09,860 --> 01:32:12,140
từ không có gì, từ đầu theo nghĩa đen.

1625
01:32:12,140 --> 01:32:16,490
Nhưng một lần nữa, nếu bạn nắm bắt\ntầm nhìn của mình và kết hợp nó

1626
01:32:16,490 --> 01:32:18,591
giải quyết những vấn đề nhỏ hơn,\ncó quy mô lớn này, bạn

1627
01:32:18,591 --> 01:32:21,021
có thể thực hiện những bước nhỏ\nnày, có thể nói như vậy, và sau đó

1628
01:32:21,020 --> 01:32:22,590
cùng nhau giải quyết mọi việc.

1629
01:32:22,591 --> 01:32:25,761
Vậy cái mới ở đây là cái dưới cùng này.

1630
01:32:25,761 --> 01:32:30,411
Mãi mãi làm như sau:\nnếu thùng rác chạm vào

1631
01:32:30,411 --> 01:32:33,860
Oscar, nhân vật khác\nchúng tôi hiện đã thêm vào chương trình

1632
01:32:35,841 --> 01:32:37,851
Đây là một quả cam và\thực sự nếu chúng ta ngó quanh

1633
01:32:37,850 --> 01:32:42,411
chúng ta sẽ thấy màu cam là một biến,\n

1634
01:32:42,411 --> 01:32:46,400
thay đổi nó có nghĩa là cộng 1 hoặc\nnếu nó âm trừ 1.

1635
01:32:46,400 --> 01:32:51,470
Sau đó, hãy tiếp tục và yêu cầu\nthùng rác đi chọn ngẫu nhiên.

1636
01:32:53,091 --> 01:32:56,941
Được rồi, để tôi chỉ cho bạn xem nó đang làm gì\n

1637
01:32:58,341 --> 01:33:01,490
Được rồi, nó đang rơi, tôi đang bấm\n

1638
01:33:02,774 --> 01:33:04,191
Được rồi, hãy để tôi làm lại một lần nữa.

1639
01:33:06,831 --> 01:33:13,371
Tại sao tôi lại có chức năng này ở\n

1640
01:33:13,371 --> 01:33:16,041
Giống như vấn đề này đang giải quyết ở đây là gì?

1641
01:33:18,132 --> 01:33:21,569
ĐỐI TƯỢNG: Cũng giống như vậy\nbản nhạc được dịch chuyển lên đầu

1642
01:33:21,569 --> 01:33:23,385
sau khi bạn bỏ nó vào thùng rác.

1643
01:33:24,511 --> 01:33:27,303
Mặc dù con người nhận thức được\n

1644
01:33:27,302 --> 01:33:29,270
từ trên trời,\thực ra nó là cùng một mảnh

1645
01:33:29,270 --> 01:33:32,150
rác, chỉ là\nđược di chuyển trở lại đầu một cách kỳ diệu

1646
01:33:33,650 --> 01:33:36,530
Ở đó, bạn cũng có\ný tưởng về mã có thể tái sử dụng.

1647
01:33:36,530 --> 01:33:40,161
Nếu bạn liên tục sao chép\nvà dán những mẩu rác của mình

1648
01:33:40,161 --> 01:33:43,190
và tạo ra 20 mẩu rác, 30\n

1649
01:33:43,190 --> 01:33:46,820
muốn trò chơi có nhiều như vậy\n

1650
01:33:46,820 --> 01:33:49,911
Sử dụng lại mã bạn đã viết,\nsử dụng lại các họa tiết bạn đã viết

1651
01:33:49,911 --> 01:33:54,681
và điều đó sẽ mang lại cho bạn không chỉ\n

1652
01:33:54,680 --> 01:33:57,665
Nào, chúng ta hãy xem một\nbộ khối xây dựng cuối cùng

1653
01:33:57,666 --> 01:33:59,541
mà cuối cùng chúng ta có thể kết hợp\thành một thứ gì đó

1654
01:33:59,541 --> 01:34:02,011
đặc biệt tương tác như sau.

1655
01:34:02,011 --> 01:34:03,921
Hãy để tôi tiếp tục và\thu nhỏ ra đây và để

1656
01:34:03,921 --> 01:34:08,570
tôi đề nghị chúng ta thực hiện điều gì đó\n

1657
01:34:09,990 --> 01:34:13,310
Vì vậy tôi muốn triển khai\nmột trò chơi dựa trên mê cung nào đó

1658
01:34:13,310 --> 01:34:15,060
thoạt nhìn thì như thế này.

1659
01:34:15,735 --> 01:34:18,110
Đây chưa phải là một trò chơi thú vị lắm,\nnhưng đây là một chút Harvard

1660
01:34:18,110 --> 01:34:22,190
cái khiên, một vài đường màu đen, cái này\n

1661
01:34:22,190 --> 01:34:24,230
nhưng lưu ý rằng bạn không thể\nthấy rõ bàn tay của tôi ở đây

1662
01:34:24,230 --> 01:34:28,948
nhưng tôi đang sử dụng phím mũi tên để đi xuống,\n

1663
01:34:28,948 --> 01:34:31,490
nhưng nếu tôi tiếp tục đi đúng, phải,\nđúng, phải, phải, phải

1664
01:34:31,490 --> 01:34:32,841
đúng là nó sẽ không đi đâu cả.

1665
01:34:32,841 --> 01:34:35,320
Và trái, trái, trái, trái, trái, trái,\n

1666
01:34:36,740 --> 01:34:41,240
Vì vậy, trước khi chúng ta xem xét mã,\nđiều này có thể hoạt động như thế nào?

1667
01:34:41,240 --> 01:34:44,990
Những loại kịch bản nào,\nbộ sưu tập các mảnh ghép

1668
01:34:44,990 --> 01:34:47,490
có thể cùng nhau\ngiúp chúng tôi thực hiện việc này không?

1669
01:34:57,671 --> 01:35:00,838
Có lẽ có một số câu hỏi\n

1670
01:35:00,838 --> 01:35:03,131
và nó tình cờ là một vài\nsprite, mỗi cái trong số đó

1671
01:35:03,131 --> 01:35:06,381
thực chất chỉ là một đường thẳng đứng màu đen\n

1672
01:35:07,451 --> 01:35:10,451
Khoảng cách tới nó\nbằng 0 hay gần bằng 0?

1673
01:35:10,451 --> 01:35:16,131
Và nếu vậy thì chúng ta bỏ qua bên trái\n

1674
01:35:16,871 --> 01:35:18,940
Nhưng ngược lại, nếu chúng ta\nkhông chạm vào tường

1675
01:35:18,940 --> 01:35:22,480
thay vào đó chúng ta có thể đang làm gì\thay vào đó mãi mãi ở đây?

1676
01:35:22,480 --> 01:35:24,820
Có lẽ phong trào đang hoạt động như thế nào?

1677
01:35:33,690 --> 01:35:35,564
DAVID Malan: Xin lỗi, nói to hơn một chút.

1678
01:35:35,564 --> 01:35:38,798
KHÁN GIẢ: Có lẽ là liên tục\n

1679
01:35:38,798 --> 01:35:40,190
và sau đó di chuyển khi bạn làm.

1680
01:35:41,065 --> 01:35:44,930
Nó liên tục, mãi mãi lắng nghe\n

1681
01:35:44,930 --> 01:35:47,270
và nếu mũi tên lên\nđược nhấn, có thể chúng ta

1682
01:35:47,270 --> 01:35:49,800
thay đổi y bằng một giá trị dương.

1683
01:35:49,801 --> 01:35:52,401
Nếu nhấn mũi tên xuống,\nchúng ta sẽ đi xuống y

1684
01:35:52,400 --> 01:35:54,090
và trái và phải tương ứng.

1685
01:35:54,091 --> 01:35:55,671
Vì vậy, chúng ta hãy thực sự có một cái nhìn nhanh chóng.

1686
01:35:55,671 --> 01:35:59,001
Nếu tôi thu nhỏ ở đây và nhìn qua\n

1687
01:35:59,001 --> 01:36:01,556
thoạt nhìn có rất nhiều điều đang diễn ra, nhưng hãy xem.

1688
01:36:01,555 --> 01:36:03,680
Trước hết, hãy để tôi kéo\nmột số thứ ra khỏi đường đi

1689
01:36:03,680 --> 01:36:05,840
vì thoạt nhìn nó có vẻ\nchoáng ngợp

1690
01:36:05,841 --> 01:36:09,291
đặc biệt nếu bạn, chẳng hạn, đã\n

1691
01:36:09,291 --> 01:36:11,934
0 chỉ để lấy cảm hứng,\nhầu hết các dự án hiện có

1692
01:36:11,934 --> 01:36:13,851
sẽ trông\tuyệt vời ngay từ cái nhìn đầu tiên

1693
01:36:13,850 --> 01:36:16,320
cho đến khi bạn bắt đầu tập trung vào những gì đang diễn ra.

1694
01:36:16,320 --> 01:36:19,581
Nhưng trong trường hợp này, chúng tôi đã\thực hiện một số khái niệm trừu tượng

1695
01:36:19,581 --> 01:36:22,730
từ đầu đến giải thích cho\n

1696
01:36:24,680 --> 01:36:29,100
Đây là chương trình có hai màu đen\n

1697
01:36:30,081 --> 01:36:33,801
Ban đầu nó đặt lá chắn\ở giữa, 0,0, sau đó

1698
01:36:33,801 --> 01:36:37,251
mãi mãi lắng nghe bàn phím,\nas tôi nghĩ bạn đang mô tả

1699
01:36:37,251 --> 01:36:40,461
và nó mang lại cảm giác cho những bức tường, như\ntôi nghĩ bạn đang mô tả.

1700
01:36:42,860 --> 01:36:46,400
Đây là các khối tùy chỉnh mà chúng tôi đã tạo\n

1701
01:36:46,400 --> 01:36:48,650
những chi tiết triển khai đó\nbởi vì thành thật mà nói đó là

1702
01:36:48,650 --> 01:36:50,130
tất cả những gì tôi cần biết ngay bây giờ.

1703
01:36:50,131 --> 01:36:52,851
Tuy nhiên, với tư cách là những lập trình viên đầy tham vọng,\nnếu bây giờ chúng tôi tò mò

1704
01:36:52,850 --> 01:36:55,460
hãy cuộn xuống phần triển khai\thực tế

1705
01:36:57,261 --> 01:36:59,701
Đây là cái bên trái\nvà nó hơi dài

1706
01:36:59,701 --> 01:37:02,461
nhưng nó có rất nhiều cấu trúc tương tự.

1707
01:37:02,461 --> 01:37:07,371
Chúng tôi đang thực hiện những việc sau, nếu lên\n

1708
01:37:08,030 --> 01:37:11,600
Nếu nhấn mũi tên xuống,\nthì thay đổi y bằng âm 1.

1709
01:37:12,341 --> 01:37:15,361
Mũi tên phải, mũi tên trái, thế là xong.

1710
01:37:15,360 --> 01:37:17,990
Vì vậy nó chỉ tập hợp tất cả\nnhững ý tưởng đó lại, kết hợp chúng lại

1711
01:37:17,990 --> 01:37:20,451
vào một khối mới chỉ vì\nit có vẻ quá áp đảo

1712
01:37:20,451 --> 01:37:22,680
chúng ta hãy triển khai nó\nmột lần và cất nó đi.

1713
01:37:22,680 --> 01:37:26,720
Và nếu bây giờ chúng ta cuộn qua\nchức năng Feel for Walls

1714
01:37:26,720 --> 01:37:30,080
bây giờ nó đang hỏi\ncâu hỏi như giả thuyết

1715
01:37:30,081 --> 01:37:35,001
nếu tôi chạm vào bức tường bên trái, hãy thay đổi\n của tôi

1716
01:37:35,720 --> 01:37:38,660
Nếu tôi chạm vào bên phải\ntường thì di chuyển x theo âm 1

1717
01:37:38,661 --> 01:37:40,592
di chuyển ra xa nó một chút.

1718
01:37:40,592 --> 01:37:42,050
Vì vậy, nó giống như bật ra khỏi tường.

1719
01:37:42,051 --> 01:37:47,451
Đề phòng trường hợp nó hơi trôi qua, chúng tôi\n

1720
01:37:47,451 --> 01:37:51,230
Được rồi, sau đây còn vài\nphần nữa để giới thiệu.

1721
01:37:51,230 --> 01:37:54,440
Điều gì sẽ xảy ra nếu chúng ta thực sự muốn thêm\n

1722
01:37:55,310 --> 01:38:02,030
Được rồi, hãy để tôi tiếp tục với cái này\n

1723
01:38:02,030 --> 01:38:05,458
chẳng hạn, có thể được thiết kế để\n

1724
01:38:05,458 --> 01:38:08,751
Đây giống như một mê cung và bạn đang cố gắng\n

1725
01:38:09,810 --> 01:38:14,360
Uh ồ, Yale đang cản đường và nó\n

1726
01:38:15,541 --> 01:38:16,791
Được rồi, để tôi hỏi người khác.

1727
01:38:19,251 --> 01:38:21,381
Đây là một ý tưởng mà bạn có,\nđây là một ý tưởng mà bạn thấy.

1728
01:38:21,381 --> 01:38:26,490
Hãy đảo ngược trong đầu bạn cách thức hoạt động của nó.

1729
01:38:28,935 --> 01:38:32,655
ĐỐI TƯỢNG: Nếu biểu tượng Yale là\n

1730
01:38:34,639 --> 01:38:36,431
DAVID Malan: Vâng, vậy\nnếu biểu tượng Yale là

1731
01:38:36,430 --> 01:38:39,130
chạm vào bức tường bên trái hoặc bên phải\n

1732
01:38:39,131 --> 01:38:41,756
Và thực sự chúng ta sẽ thấy có một\nmảnh ghép có thể làm được chính xác

1733
01:38:41,756 --> 01:38:44,066
về mặt kỹ thuật đó là điều vượt trội, như chúng ta sẽ thấy

1734
01:38:44,065 --> 01:38:45,690
nhưng có một cách khác chúng ta có thể làm điều này.

1735
01:38:46,751 --> 01:38:49,271
Cách mà chính chúng ta\ncó thể thực hiện một cách chính xác

1736
01:38:49,270 --> 01:38:52,010
việc nảy ra ý tưởng đó chỉ cần\nvới một chút logic.

1737
01:38:52,011 --> 01:38:54,581
Vì vậy đây là những gì phiên bản\ncủa chương trình này đang thực hiện.

1738
01:38:54,581 --> 01:38:58,721
Theo mặc định, nó đang chuyển Yale thành 0,0\n

1739
01:38:58,720 --> 01:39:03,250
hướng nó về hướng 90 độ,\n

1740
01:39:03,251 --> 01:39:06,490
và sau đó nó mãi mãi làm như vậy\nđiều này: nếu chạm vào bức tường bên trái

1741
01:39:06,490 --> 01:39:10,451
hoặc chạm vào bức tường bên phải,\nđây là cách dịch của chúng tôi về độ nảy.

1742
01:39:10,451 --> 01:39:11,953
Chúng ta đang quay ngoắt 180 độ.

1743
01:39:11,953 --> 01:39:13,661
Và điều tuyệt vời\nlà chúng tôi không

1744
01:39:13,661 --> 01:39:16,368
phải lo lắng nếu chúng ta đi từ\n

1745
01:39:16,368 --> 01:39:19,480
180 độ sẽ\ncó tác dụng trên cả hai bức tường.

1746
01:39:21,310 --> 01:39:24,670
Sau khi làm điều đó, chúng tôi chỉ di chuyển\không bước nào, từng pixel một

1747
01:39:24,671 --> 01:39:28,150
nhưng chúng tôi sẽ làm việc đó mãi mãi nên\nđiều gì đó đang xảy ra liên tục

1748
01:39:28,150 --> 01:39:30,640
và biểu tượng Yale\nnảy qua lại.

1749
01:39:30,640 --> 01:39:33,550
Vâng, phần cuối cùng\nđây, nếu bây giờ chúng ta

1750
01:39:33,551 --> 01:39:39,711
muốn một đối thủ khác, cao cấp hơn\n

1751
01:39:39,711 --> 01:39:44,831
đi và theo chúng tôi tới bất cứ nơi nào\nchúng tôi như vậy vào thời điểm này

1752
01:39:44,831 --> 01:39:51,161
chúng tôi muốn sprite kia\nkhông chỉ nảy qua lại

1753
01:39:51,161 --> 01:39:55,600
nhưng theo đúng nghĩa đen thì hãy theo chúng tôi\nbất kể chúng tôi đi đâu.

1754
01:39:55,600 --> 01:39:59,110
Làm thế nào điều này có thể được\nthực hiện trên màn hình?

1755
01:39:59,110 --> 01:40:01,541
Tôi cá đó là một khối vĩnh viễn\nkhác, nhưng bên trong có gì?

1756
01:40:01,541 --> 01:40:05,621
ĐỐI TƯỢNG: Vậy là mãi mãi nhận được\n

1757
01:40:05,621 --> 01:40:06,844
và tiến một bước về phía nó.

1758
01:40:06,844 --> 01:40:09,761
DAVID Malan: Vâng, mãi mãi chỉ vào\n

1759
01:40:11,140 --> 01:40:15,340
Chuyện này sẽ tiếp diễn mãi mãi nếu tôi\n

1760
01:40:15,341 --> 01:40:18,551
Chú ý rằng nó giống như co giật\nquay lại bởi vì nó chuyển động một lần

1761
01:40:18,551 --> 01:40:20,201
pixel rồi một pixel rồi một pixel.

1762
01:40:20,201 --> 01:40:21,911
Ở đây đang trong trạng thái điên cuồng.

1763
01:40:21,911 --> 01:40:25,421
Chúng ta vẫn chưa kết thúc trò chơi, nhưng nếu\n

1764
01:40:25,421 --> 01:40:28,121
Không mất nhiều thời gian để\nthực hiện ý tưởng đơn giản này.

1765
01:40:28,121 --> 01:40:30,911
Đi tới một vị trí ngẫu nhiên\nđể làm cho nó trở nên công bằng

1766
01:40:30,911 --> 01:40:33,740
ban đầu, sau đó mãi mãi\nhướng về Harvard

1767
01:40:33,740 --> 01:40:37,060
đó là cái mà chúng tôi gọi là Harvard\ncrest sprite, hãy di chuyển một bước.

1768
01:40:37,060 --> 01:40:39,701
Giả sử bây giờ chúng ta muốn\ntạo một cấp độ nâng cao hơn.

1769
01:40:39,701 --> 01:40:42,610
Một thay đổi nhỏ mà tôi có thể\nthực hiện một cách hợp lý đối với mã này chỉ là gì

1770
01:40:42,610 --> 01:40:45,037
để làm cho MIT tốt hơn nữa trong lĩnh vực này?

1771
01:40:45,037 --> 01:40:46,870
ĐỐI TƯỢNG: Thay đổi\nsố bước thành hai.

1772
01:40:46,871 --> 01:40:48,310
DAVID Malan: Được rồi, đổi số bước thành hai.

1773
01:40:49,390 --> 01:40:51,370
Vì vậy bây giờ họ đã nhanh gấp đôi.

1774
01:40:51,371 --> 01:40:53,751
Hãy để tôi tiếp tục và giải quyết vấn đề này.

1775
01:40:53,751 --> 01:40:56,841
Rất tiếc, hãy để tôi đấu tranh công bằng.

1776
01:40:58,310 --> 01:41:01,530
Được rồi, rất tiếc là tôi\nvẫn đang di chuyển từng pixel một

1777
01:41:01,530 --> 01:41:03,081
nên chuyện này sẽ không kết thúc tốt đẹp đâu.

1778
01:41:04,220 --> 01:41:10,230
Và nếu chúng ta thực sự hung hãn và\n

1779
01:41:11,930 --> 01:41:16,370
Chúa ơi, được rồi, đó là cách bạn có thể\n

1780
01:41:17,761 --> 01:41:20,694
Vì vậy, không phải ngẫu nhiên mà chúng tôi chọn những ví dụ cụ thể này

1781
01:41:20,694 --> 01:41:23,361
ở đây liên quan đến những\ntrường học cụ thể này vì chúng tôi có thêm một trường nữa

1782
01:41:23,360 --> 01:41:25,680
phần trình diễn mà chúng tôi nghĩ\nchúng tôi sẽ giới thiệu hôm nay

1783
01:41:25,680 --> 01:41:30,020
nếu chúng ta có thể mời một\ntình nguyện viên khác lên chơi

1784
01:41:30,020 --> 01:41:34,400
trò chơi được một trong những người tiền nhiệm của bạn gọi là Trò chơi khó nhất của Ivy.

1785
01:41:34,400 --> 01:41:35,661
Để xem nào, bạn ở giữa.

1786
01:41:40,161 --> 01:41:41,993
DAVID Malan: Thực ra, hãy đến gần hơn một chút.

1787
01:41:44,440 --> 01:41:47,067
Được rồi, một tràng pháo tay\nở đây nếu chúng ta có thể.

1788
01:41:53,237 --> 01:41:54,487
Được rồi, xin lỗi, tên bạn là gì?

1789
01:41:59,020 --> 01:42:02,680
Vì vậy, ở đây chúng ta có Trò chơi khó nhất của Ivy trên màn hình\nkhác này

1790
01:42:02,680 --> 01:42:04,750
được viết bởi một cựu sinh viên CS50.

1791
01:42:04,751 --> 01:42:07,451
Tôi nghĩ bạn sẽ thấy rằng nó\nkết hợp những nguyên tắc tương tự.

1792
01:42:07,451 --> 01:42:09,940
Mê cung rõ ràng là cao cấp hơn một chút.

1793
01:42:09,940 --> 01:42:14,320
Mục tiêu trước mắt là di chuyển ban đầu\n

1794
01:42:14,320 --> 01:42:17,108
đường bên phải để bạn\nbắt kịp anh ta trong trường hợp này

1795
01:42:17,108 --> 01:42:18,940
nhưng bạn sẽ thấy rằng\ncó nhiều cấp độ khác nhau

1796
01:42:18,940 --> 01:42:21,350
và mức độ phức tạp khác nhau.

1797
01:42:21,350 --> 01:42:24,820
Vì vậy, nếu bạn sẵn sàng, bạn chỉ có thể sử dụng\n

1798
01:42:24,820 --> 01:42:27,520
Bạn sẽ điều khiển\nHarvard sprite và nếu chúng tôi

1799
01:42:27,520 --> 01:42:32,291
có thể tăng âm lượng lên một chút\n

1800
01:42:32,291 --> 01:42:34,421
Chúng ta bắt đầu bằng cách nhấp vào lá cờ màu xanh lá cây.

1801
01:42:41,444 --> 01:42:43,194
[NHẠC - MC HAMMER, "U CAN\'T Touch\nTHIS"]

1802
01:42:43,194 --> 01:42:45,100
MC HAMMER: (Hát) Không thể chạm vào cái này được.

1803
01:42:57,591 --> 01:42:58,801
MC HAMMER: (Hát) khó quá.

1804
01:42:58,801 --> 01:43:00,551
Làm tôi muốn thốt lên, ôi Chúa ơi.

1805
01:43:03,520 --> 01:43:06,162
MC HAMMER: (Hát) Cảm thấy\nthật dễ chịu khi biết mình đang thất vọng.

1806
01:43:10,350 --> 01:43:12,520
MC HAMMER: (Hát)\nBạn không thể chạm vào cái này.

1807
01:43:17,859 --> 01:43:19,791
MC HAMMER: (Hát) Không thể chạm vào cái này được.

1808
01:43:23,618 --> 01:43:25,201
Bạn để tôi phá vỡ lời bài hát sôi nổi.

1809
01:43:27,314 --> 01:43:29,481
Bạn đã hiểu như vậy và\nbạn biết bạn muốn nhảy.

1810
01:43:29,480 --> 01:43:33,302
Vì vậy, hãy rời khỏi chỗ ngồi của bạn và bắt cô gái bay và bắt kịp nhịp điệu này.

1811
01:43:34,934 --> 01:43:38,283
Hãy bơm một chút và cho họ biết\n

1812
01:43:38,283 --> 01:43:39,740
Lạnh lùng trong một nhiệm vụ, vì vậy hãy lùi lại.

1813
01:43:39,740 --> 01:43:41,033
Hãy cho họ biết rằng bạn cũng--

1814
01:43:46,378 --> 01:43:48,798
MC HAMMER: (Hát) Không thể chạm vào cái này được.

1815
01:43:48,798 --> 01:43:50,251
Sao cậu lại đứng đó vậy?

1816
01:43:54,761 --> 01:43:58,316
Đưa cho tôi một bài hát hoặc nhịp điệu, tạo\n

1817
01:44:00,220 --> 01:44:02,553
Bạn nói về chiếc Búa khi\nbạn đang nói về một buổi biểu diễn.

1818
01:44:03,751 --> 01:44:06,601
Ca sĩ đổ mồ hôi nên họ\na lau hoặc thuần hóa để học.

1819
01:44:06,600 --> 01:44:08,110
DAVID Malan: Cấp độ thứ hai đến cấp độ cuối cùng.

1820
01:44:08,610 --> 01:44:10,451
MC HAMMER: (Hát) Biểu đồ đó hợp pháp.

1821
01:44:10,451 --> 01:44:13,201
Hoặc là làm việc chăm chỉ hoặc\nbạn cũng có thể bỏ cuộc.

1822
01:44:18,091 --> 01:44:20,391
MC HAMMER: (Hát)\nBạn không thể chạm vào cái này.

1823
01:44:20,390 --> 01:44:22,412
DAVID Malan: Anh gần đến đích rồi.

1824
01:44:22,412 --> 01:44:23,870
MC HAMMER: (Hát) Phá vỡ nó đi.

1825
01:44:36,161 --> 01:44:38,266
MC HAMMER: (Hát) Dừng lại, đến giờ Búa.

1826
01:44:38,266 --> 01:44:39,878
Hãy đi theo dòng chảy," người ta nói.

1827
01:44:39,878 --> 01:44:42,171
Nếu bạn không thể làm được điều này\nthì có lẽ bạn đã chết.

1828
01:44:42,171 --> 01:44:44,240
Vì vậy, hãy vẫy tay trong\nair, thực hiện vài động tác

1829
01:44:44,240 --> 01:44:45,140
luồn ngón tay qua tóc.

1830
01:44:46,621 --> 01:44:49,051
Hãy nhảy theo điệu này và bạn sẽ gầy đi.

1831
01:44:50,650 --> 01:44:53,305
Chỉ một phút thôi, tất cả chúng ta hãy thực hiện cú va chạm.

1832
01:45:03,400 --> 01:45:05,405
Được rồi, thế là xong cho CS50.

1833
01:46:29,360 --> 01:46:33,470
Và đây là tuần 1, tuần mà\n

1834
01:46:33,470 --> 01:46:36,350
là điều chúng tôi đã nói về mặt kỹ thuật\n

1835
01:46:36,350 --> 01:46:39,650
được chơi bằng ngôn ngữ đồ họa này\n

1836
01:46:41,331 --> 01:46:43,461
Nhưng hôm nay, như đã hứa,\nchúng ta chuyển sang một thứ gì đó

1837
01:46:43,461 --> 01:46:45,921
truyền thống hơn một chút\na dựa trên văn bản nhiều hơn một chút

1838
01:46:45,921 --> 01:46:48,501
không phải mảnh ghép hoặc\ndựa trên khối, được gọi là C.

1839
01:46:49,770 --> 01:46:50,978
Nó đã tồn tại trong nhiều thập kỷ.

1840
01:46:50,979 --> 01:46:54,501
Nhưng đó là ngôn ngữ làm nền tảng cho nên\n

1841
01:46:54,501 --> 01:46:57,261
trong số đó có thứ gọi là\nPython mà chúng tôi cũng sẽ

1842
01:46:57,261 --> 01:46:58,821
sẽ đến trong một vài tuần nữa.

1843
01:46:58,820 --> 01:47:00,921
Thật vậy, vào cuối học kỳ, mục tiêu

1844
01:47:00,921 --> 01:47:02,661
là để bạn cảm thấy rằng\nbạn chưa học Scratch

1845
01:47:02,661 --> 01:47:04,911
bạn chưa học C hoặc\nthậm chí Python, vì vấn đề đó

1846
01:47:04,911 --> 01:47:07,371
nhưng về cơ bản là bạn\nđã học cách lập trình.

1847
01:47:07,371 --> 01:47:09,801
Thật không may, khi bạn\nhọc cách lập trình

1848
01:47:09,801 --> 01:47:13,681
bằng ngôn ngữ truyền thống hơn như\n

1849
01:47:13,680 --> 01:47:17,090
Tuần trước tôi đã mô tả tất cả\n

1850
01:47:17,091 --> 01:47:19,881
mà bạn thấy trong này, giống như\n

1851
01:47:19,881 --> 01:47:22,761
dấu ngoặc đơn, dấu ngoặc nhọn,\ndấu gạch chéo ngược n, v.v.

1852
01:47:22,761 --> 01:47:26,791
Chà, hôm nay chúng ta sẽ không tiết lộ\n

1853
01:47:27,291 --> 01:47:31,461
Nhưng đến tuần sau, điều này sẽ không\n

1854
01:47:31,461 --> 01:47:35,391
đối với bạn, một ngôn ngữ mà có lẽ là\n

1855
01:47:36,320 --> 01:47:40,201
Nhưng để làm được điều đó, chúng ta sẽ khám phá một số\n

1856
01:47:40,201 --> 01:47:43,221
Vì vậy, hãy nhớ lại điều đó, thông qua Scratch-- và\ncó lẽ là thông qua tập bài tập 1--

1857
01:47:43,220 --> 01:47:46,580
chúng tôi đã xem xét những thứ được gọi là\n

1858
01:47:46,581 --> 01:47:49,310
Và liên quan đến các hàm\nlà các đối số như đầu vào.

1859
01:47:49,310 --> 01:47:52,760
Và liên quan đến một số hàm\nđược trả về các giá trị như kết quả đầu ra.

1860
01:47:52,761 --> 01:47:56,151
Sau đó chúng ta đã nói một chút về điều kiện,\n

1861
01:47:56,150 --> 01:47:59,541
các biểu thức Boolean\n

1862
01:47:59,541 --> 01:48:03,141
câu hỏi, vòng lặp cho phép bạn thực hiện\n

1863
01:48:03,140 --> 01:48:05,990
giống như trong toán học, điều đó cho phép bạn\nlưu trữ các giá trị tạm thời

1864
01:48:05,990 --> 01:48:07,671
và thậm chí cả những chủ đề khác nữa.

1865
01:48:07,671 --> 01:48:11,421
Vì vậy, nếu bạn thấy thoải mái\n

1866
01:48:11,421 --> 01:48:14,490
nhận ra rằng tất cả những chủ đề này\na sẽ vẫn còn với chúng ta.

1867
01:48:14,490 --> 01:48:18,230
Vì vậy, thực sự thì hôm nay chỉ là để đạt được\n

1868
01:48:18,230 --> 01:48:22,911
bạn dịch những ý tưởng đó sang,\n

1869
01:48:22,911 --> 01:48:25,698
một cú pháp mới, thành thật mà nói,\nđiều đó thực sự còn hơn thế nữa

1870
01:48:25,698 --> 01:48:27,740
về mặt nào đó đơn giản hơn\nngôn ngữ con người của bạn

1871
01:48:27,740 --> 01:48:31,422
dù là tiếng Anh hay thứ gì khác, bởi vì\n

1872
01:48:31,422 --> 01:48:33,380
Trên thực tế, bạn có thể có ít\ncú pháp hơn nhiều

1873
01:48:33,381 --> 01:48:35,451
có trong một ngôn ngữ điển hình của con người.

1874
01:48:35,451 --> 01:48:39,600
Nhưng bạn cần phải sử dụng những máy tính này\n

1875
01:48:39,600 --> 01:48:41,850
để\cuối cùng, bạn chính xác nhất

1876
01:48:41,850 --> 01:48:46,040
và cuối cùng sẽ xem xét mã của bạn\n

1877
01:48:46,621 --> 01:48:49,791
Vì vậy nếu bạn nghĩ về lần cuối cùng\n

1878
01:48:49,791 --> 01:48:51,980
biết bạn đang làm gì\cũng như gặp phải điều gì đó mới--

1879
01:48:51,980 --> 01:48:54,855
có thể cách đây chưa lâu,\n

1880
01:48:54,855 --> 01:48:58,460
lần đầu tiên, hoặc Old Campus hoặc tương tự,\n

1881
01:48:58,461 --> 01:49:01,823
bạn thực sự không cần phải biết cách\n

1882
01:49:01,823 --> 01:49:03,530
Bạn không cần\nbiết mọi người là ai

1883
01:49:03,530 --> 01:49:07,230
mọi thứ ở đâu, Harvard thế nào hay\n

1884
01:49:07,730 --> 01:49:10,855
Bạn gần như có được cuộc sống hàng ngày chỉ bằng cách\n

1885
01:49:10,855 --> 01:49:12,605
Và bất cứ điều gì bạn chưa thực sự hiểu

1886
01:49:12,605 --> 01:49:14,960
bạn gần như đã làm ngơ cho đến khi điều đó quan trọng.

1887
01:49:14,961 --> 01:49:16,761
Và đó thực sự là điều\nchúng ta sẽ làm ngày hôm nay.

1888
01:49:16,761 --> 01:49:18,636
Và thực sự, trong\nsvài tuần tới, chúng tôi sẽ

1889
01:49:18,636 --> 01:49:21,171
tập trung vào những chi tiết quan trọng ban đầu

1890
01:49:21,171 --> 01:49:24,342
và cố gắng vẫy tay, có thể nói như vậy,\n

1891
01:49:24,342 --> 01:49:25,800
chúng ta sẽ đến, có thể sẽ thú vị.

1892
01:49:25,801 --> 01:49:27,468
Nhưng hiện tại, chúng có thể gây phiền nhiễu.

1893
01:49:27,467 --> 01:49:29,900
Và do sự phân tâm, tôi thực sự muốn nói đến một số cú pháp đó

1894
01:49:31,501 --> 01:49:34,671
Vì vậy đến cuối ngày hôm nay-- và\n

1895
01:49:34,671 --> 01:49:37,400
có lẽ là bước đột phá đầu tiên của bạn\nvào ngôn ngữ này có tên là C--

1896
01:49:37,400 --> 01:49:39,171
bạn sẽ viết một số mã.

1897
01:49:39,171 --> 01:49:41,780
Và bạn sẽ tự hỏi--\nchúng tôi sẽ tự hỏi--

1898
01:49:43,161 --> 01:49:46,041
Chà, đầu tiên và quan trọng nhất, mỗi\ntuần trước, hãy diễn ra trong Scratch

1899
01:49:46,041 --> 01:49:51,591
hoặc dạng danh bạ điện thoại, mã cuối cùng\n

1900
01:49:51,591 --> 01:49:53,541
Bạn muốn vấn đề\nđược giải quyết một cách chính xác.

1901
01:49:53,541 --> 01:49:55,490
Vì vậy, đó là một loại đi mà không cần phải nói.

1902
01:49:55,490 --> 01:49:59,511
Và trong suốt học kỳ này, chúng ta sẽ\n

1903
01:49:59,511 --> 01:50:02,746
nên bạn không cần phải ngồi đó\n

1904
01:50:02,746 --> 01:50:05,371
kiểm tra đầu ra, thử\nanother đầu vào, kiểm tra đầu ra.

1905
01:50:05,371 --> 01:50:07,161
Có rất nhiều công cụ\ntự động hóa trong thế giới thực--

1906
01:50:07,161 --> 01:50:09,201
và trong lớp này và\nnhững lớp khác thích nó-- lớp đó

1907
01:50:09,201 --> 01:50:13,011
sẽ giúp bạn dễ dàng trả lời\n

1908
01:50:13,011 --> 01:50:15,901
đúng, theo\nthông số kỹ thuật của chúng tôi hoặc tương tự.

1909
01:50:15,900 --> 01:50:18,440
Nhưng rồi điều gì đó sẽ mất nhiều thời gian hơn

1910
01:50:18,440 --> 01:50:21,860
và bạn có thể sẽ không cảm thấy\n

1911
01:50:21,860 --> 01:50:24,890
trong những tuần đầu tiên, chỉ là\nmã của bạn được thiết kế tốt như thế nào.

1912
01:50:24,890 --> 01:50:27,613
Nói\ntiếng Anh hoặc viết tiếng Anh là một chuyện

1913
01:50:27,613 --> 01:50:30,030
nhưng đó là vấn đề khác-- hoặc\nbất kỳ ngôn ngữ nào.

1914
01:50:30,030 --> 01:50:32,190
Nhưng nói hay viết hay lại là chuyện khác.

1915
01:50:32,190 --> 01:50:35,148
Và chúng ta dành ngần ấy năm ở giữa\n

1916
01:50:35,149 --> 01:50:38,601
viết giấy tờ và các tài liệu khác,\n

1917
01:50:38,600 --> 01:50:41,810
về việc bạn đã xây dựng công thức tốt như thế nào

1918
01:50:41,810 --> 01:50:43,019
bài báo của bạn và những thứ tương tự.

1919
01:50:43,020 --> 01:50:44,971
Và có ý tưởng tương tự trong lập trình.

1920
01:50:44,970 --> 01:50:49,590
Điều đó không nhất thiết phải quan trọng\n

1921
01:50:49,591 --> 01:50:53,615
Nếu mã của bạn hoàn toàn không có hình ảnh\nlộn xộn hoặc nếu nó quá dài

1922
01:50:53,615 --> 01:50:55,490
nó sẽ thực sự\nkhó khăn đối với người khác

1923
01:50:55,490 --> 01:50:59,121
để họ suy nghĩ xem mã của bạn là gì\n

1924
01:51:00,201 --> 01:51:04,011
Và thành thật mà nói, bạn-- sáng hôm sau, năm sau

1925
01:51:04,011 --> 01:51:07,551
lần tới khi bạn nhìn vào\nmã đó-- có thể bạn không biết

1926
01:51:07,551 --> 01:51:09,381
chính bạn đã nghĩ gì.

1927
01:51:09,381 --> 01:51:13,731
Nhưng bạn sẽ làm được nếu bạn tập trung\nvào việc thiết kế mã tốt

1928
01:51:13,730 --> 01:51:16,640
giúp thuật toán của bạn hoạt động hiệu quả\n

1929
01:51:16,640 --> 01:51:19,161
và thậm chí đảm bảo\ncode của bạn trông đẹp mắt, điều này

1930
01:51:19,161 --> 01:51:20,881
chúng tôi mô tả như một vấn đề về phong cách.

1931
01:51:20,881 --> 01:51:24,514
Vì vậy, trong thế giới con người được viết ra, có\n

1932
01:51:24,514 --> 01:51:27,181
viết hoa và những thứ tương tự--\ncách bạn viết một bài luận

1933
01:51:27,180 --> 01:51:29,220
nhưng không nhất thiết\nsgửi tin nhắn văn bản--

1934
01:51:29,220 --> 01:51:31,420
liên quan đến phong cách, ví dụ.

1935
01:51:31,421 --> 01:51:33,360
Và phong cách tốt trong\ncode sẽ có

1936
01:51:33,360 --> 01:51:36,961
một vài trong số những đặc điểm này\n

1937
01:51:36,961 --> 01:51:41,981
Nhưng bạn chỉ cần bắt đầu tham gia\n

1938
01:51:41,980 --> 01:51:44,940
Vì vậy, có thể nói, ba trục này\n

1939
01:51:44,940 --> 01:51:48,121
thực sự là mục tiêu bao quát khi viết mã

1940
01:51:48,121 --> 01:51:50,201
cuối cùng sẽ trông như thế này

1941
01:51:50,201 --> 01:51:52,201
Vậy chương trình này mà chúng tôi\n phỏng đoán tuần trước thực hiện được

1942
01:51:52,201 --> 01:51:56,863
điều gì sẽ xảy ra nếu bạn chạy nó trên máy Mac hoặc\nPC hoặc ở nơi nào khác?

1943
01:52:00,261 --> 01:52:02,136
DAVID J. Malan: Nó chỉ in\n, Xin chào thế giới.

1944
01:52:02,136 --> 01:52:04,311
Và thành thật mà nói, điều đó thật tàn bạo khi bạn

1945
01:52:04,310 --> 01:52:08,060
cần nhấn phím trên bàn phím của bạn\n

1946
01:52:08,060 --> 01:52:09,740
để có được một chương trình nói "Xin chào thế giới".

1947
01:52:09,740 --> 01:52:11,990
Vì vậy, phần tiết lộ nội dung-- trong thời gian\nvài tuần nữa khi chúng tôi

1948
01:52:11,990 --> 01:52:14,451
giới thiệu các ngôn ngữ\nhiện đại hơn khác, như Python

1949
01:52:14,451 --> 01:52:18,631
bạn có thể chắt lọc logic này\nthành một dòng mã theo đúng nghĩa đen.

1950
01:52:18,631 --> 01:52:20,301
Và cuối cùng thì chúng ta cũng đang đến đó.

1951
01:52:20,301 --> 01:52:23,294
Nhưng sẽ rất hữu ích nếu hiểu\nđiều gì đang diễn ra ở đây

1952
01:52:23,293 --> 01:52:25,461
bởi vì mặc dù đây\là một cú pháp khá khó hiểu

1953
01:52:25,461 --> 01:52:28,101
không có gì sau tuần này và,\n

1954
01:52:28,100 --> 01:52:30,920
thậm chí có thể hiểu được về\nđiều gì đó mà lúc này trông có vẻ

1955
01:52:30,921 --> 01:52:32,311
một chút gì đó như thế này.

1956
01:52:33,644 --> 01:52:35,811
Chà, tôi đã cho chúng ta một số câu trả lời cho một vấn đề.

1957
01:52:35,810 --> 01:52:37,728
Làm cách nào để in dòng chữ Hello,\nworld trên màn hình?

1958
01:52:37,728 --> 01:52:39,177
Vậy tôi phải làm gì với mã này?

1959
01:52:39,177 --> 01:52:42,260
Chà, chúng ta thường có thói quen\n

1960
01:52:43,911 --> 01:52:48,030
Và vâng, tôi có thể mở Word hoặc\n

1961
01:52:48,030 --> 01:52:50,780
và chỉ phiên âm theo nghĩa đen\nký tự đó cho ký tự

1962
01:52:50,780 --> 01:52:53,390
hãy lưu nó lại và bùm, tôi có một chương trình.

1963
01:52:53,390 --> 01:52:56,630
Nhưng vấn đề ở tuần trước là\n

1964
01:52:56,631 --> 01:52:59,164
có thể nói ngôn ngữ nào khác?

1965
01:53:00,081 --> 01:53:02,310
DAVID J. Malan: Vâng, vậy\nnhị phân, số không và số một.

1966
01:53:02,310 --> 01:53:04,310
Và rõ ràng đây không phải là số không và số một.

1967
01:53:04,310 --> 01:53:07,040
Vì vậy, nó không thành vấn đề nếu tôi đặt nó vào\n

1968
01:53:07,632 --> 01:53:10,050
Máy tính sẽ không\nhiểu được nó cho đến khi tôi bằng cách nào đó

1969
01:53:10,050 --> 01:53:11,570
dịch nó thành số không và số một.

1970
01:53:11,570 --> 01:53:14,121
Và thành thật mà nói, không có\ncông cụ nào mà tôi đã sử dụng

1971
01:53:14,121 --> 01:53:15,980
thực sự thích hợp cho việc lập trình.

1972
01:53:16,551 --> 01:53:19,011
Chà, chúng có các tính năng\nnhư in đậm và in nghiêng

1973
01:53:19,011 --> 01:53:22,881
và những thứ mềm mại, thẩm mỹ\n

1974
01:53:22,881 --> 01:53:24,631
bạn đang cố gắng thực hiện với mã của mình.

1975
01:53:24,631 --> 01:53:26,661
Và họ không có\nkhả năng, điều đó sẽ

1976
01:53:26,661 --> 01:53:29,661
dường như, để chuyển đổi mã đó\cuối cùng thành số không và số một.

1977
01:53:29,661 --> 01:53:32,451
Nhưng những công cụ có\nkhả năng này có thể

1978
01:53:32,451 --> 01:53:36,350
được gọi là Phát triển Tích hợp\nMôi trường hoặc IDE

1979
01:53:36,350 --> 01:53:38,180
hoặc đơn giản hơn là trình soạn thảo văn bản.

1980
01:53:38,180 --> 01:53:42,560
Trình soạn thảo văn bản có lẽ là một công cụ mà\nlập trình viên sử dụng hàng ngày

1981
01:53:44,030 --> 01:53:46,850
Và đó là một chương trình đơn giản-- đây,\n

1982
01:53:46,850 --> 01:53:49,542
được gọi là Visual Studio Code hoặc VS Code.

1983
01:53:49,542 --> 01:53:51,500
Và ở trên cùng ở đây, bạn\nthấy rằng tôi thực sự đã

1984
01:53:51,501 --> 01:53:56,391
được tạo trước trước lớp a rất\n

1985
01:53:57,020 --> 01:54:00,740
Vâng, .c chỉ ra theo quy ước rằng\n

1986
01:54:01,640 --> 01:54:06,050
Đó không phải là .docx, có nghĩa là trong\n

1987
01:54:08,060 --> 01:54:12,621
Đây là .c, có nghĩa là trong tệp này là\n

1988
01:54:12,621 --> 01:54:16,070
C. Số 1 ở đây chỉ là một\n

1989
01:54:16,070 --> 01:54:18,440
tôi theo dõi xem chương trình này dài hay ngắn.

1990
01:54:18,440 --> 01:54:21,050
Và con trỏ\nnhấp nháy ở đó, chờ đợi

1991
01:54:21,051 --> 01:54:23,030
để tôi bắt đầu gõ một số mã.

1992
01:54:23,030 --> 01:54:26,030
Vâng, hãy để tôi tiếp tục và gõ\nout mã giống hệt nhau.

1993
01:54:26,030 --> 01:54:28,260
Đối với tôi, nó xuất hiện khá\nmột cách thoải mái từ trí nhớ.

1994
01:54:28,261 --> 01:54:31,791
Vì vậy tôi sẽ tiếp tục và đưa vào\n

1995
01:54:32,961 --> 01:54:37,221
Tôi sẽ gõ int\n một cách kỳ diệu

1996
01:54:37,220 --> 01:54:38,610
chúng ta sẽ quay lại vấn đề đó sau--

1997
01:54:38,610 --> 01:54:43,560
một trong những dấu ngoặc nhọn này và sau đó là\n

1998
01:54:43,560 --> 01:54:46,610
Sau đó tôi sẽ nhấn Tab\nđể thụt lề một vài khoảng trắng.

1999
01:54:46,610 --> 01:54:52,850
Và sau đó tôi sẽ gõ chứ không in,\n

2000
01:54:52,850 --> 01:54:55,850
dấu ngoặc kép đóng,\ndấu ngoặc đơn đóng, dấu chấm phẩy.

2001
01:54:55,850 --> 01:55:00,050
Và tôi dám nói điều này về cơ bản là\n

2002
01:55:01,220 --> 01:55:03,291
Tôi viết nó để nói: "Xin chào, CS50.

2003
01:55:03,291 --> 01:55:06,201
Bây giờ nó chỉ nói là chuẩn hơn,\n

2004
01:55:08,390 --> 01:55:11,240
Và tất cả những gì tôi cần làm bây giờ\ncó thể nhấn Command-S hoặc Control-S

2005
01:55:12,110 --> 01:55:15,081
Và thì đấy, tôi là một lập trình viên.

2006
01:55:15,081 --> 01:55:17,828
Tuy nhiên, điều đáng chú ý là\nOK, làm cách nào để tôi chạy cái này?

2007
01:55:17,828 --> 01:55:19,911
Giống như trên máy Mac hoặc PC,\nbạn chạy chương trình như thế nào?

2008
01:55:19,911 --> 01:55:21,411
Vâng, thường bấm đúp vào một biểu tượng.

2009
01:55:21,411 --> 01:55:23,121
Trên điện thoại, bạn nhấn vào một biểu tượng.

2010
01:55:23,121 --> 01:55:26,810
Trong môi trường mà chúng tôi đang sử dụng\n

2011
01:55:26,810 --> 01:55:31,670
nói rằng hầu hết các lập trình viên-- sử dụng, bạn không\n

2012
01:55:32,511 --> 01:55:35,734
Điều đó rất thân thiện với người dùng,\nnhưng không cần thiết lắm.

2013
01:55:35,734 --> 01:55:38,151
Đặc biệt là khi bạn cảm thấy\nthoải mái hơn với việc lập trình

2014
01:55:38,150 --> 01:55:41,030
bạn sẽ muốn gõ lệnh\n

2015
01:55:42,020 --> 01:55:43,853
Và bạn sắp\nmuốn tự động hóa mọi thứ

2016
01:55:43,854 --> 01:55:46,791
sẽ dễ dàng hơn nhiều nếu như vậy\n

2017
01:55:46,791 --> 01:55:49,131
chuột và chuyển động cơ bắp.

2018
01:55:49,131 --> 01:55:52,011
Và ở đây tôi có chương trình của mình.

2019
01:55:52,011 --> 01:55:54,591
Nó nằm trong tập tin này có tên là "hello.c.

2020
01:55:54,591 --> 01:55:58,131
Tuy nhiên, bây giờ tôi cần phải chuyển đổi nó thành số không và số một.

2021
01:55:58,131 --> 01:56:02,331
Chà, tôi phải làm thế nào để thực hiện việc này,\n

2022
01:56:03,680 --> 01:56:06,470
hoặc mã nguồn, như\nthường được gọi--

2023
01:56:06,470 --> 01:56:11,040
với cái này, những số không và những số đó\n

2024
01:56:11,041 --> 01:56:13,490
Các số 0 và số 1 từ tuần trước\nkhông chỉ có thể được sử dụng

2025
01:56:13,490 --> 01:56:18,751
để biểu thị số và chữ cái,\n

2026
01:56:18,751 --> 01:56:24,051
Nó cũng có thể đại diện cho các hướng dẫn tới một\n

2027
01:56:24,051 --> 01:56:26,091
hoặc xóa một tập tin, hoặc lưu một tập tin.

2028
01:56:26,091 --> 01:56:28,761
Bằng cách nào đó, tất cả những điều cơ bản\ncủa một chiếc máy tính

2029
01:56:28,761 --> 01:56:32,361
có thể được biểu diễn bằng các mẫu số 0 và số 1 khác.

2030
01:56:32,360 --> 01:56:34,934
Và cũng giống như tuần trước,\nit phụ thuộc vào ngữ cảnh

2031
01:56:34,934 --> 01:56:36,351
trong đó những con số này được lưu trữ.

2032
01:56:36,350 --> 01:56:39,680
Đôi khi chúng được hiểu là\nsố, như trong bảng tính.

2033
01:56:39,680 --> 01:56:41,390
Đôi khi chúng được hiểu là màu sắc.

2034
01:56:41,390 --> 01:56:46,040
Đôi khi chúng được hiểu là\n

2035
01:56:46,041 --> 01:56:50,820
để thực hiện các thao tác ở mức rất thấp,\n

2036
01:56:50,820 --> 01:56:55,610
May mắn thay, định nghĩa của tuần trước\n

2037
01:56:55,610 --> 01:56:58,020
là một hình mẫu tinh thần tốt đẹp cho\chính xác mục tiêu trước mắt.

2038
01:56:58,020 --> 01:57:00,800
Tôi có một số đầu vào, mã nguồn AKA.

2039
01:57:00,801 --> 01:57:05,001
Cuối cùng tôi muốn xuất ra\nmã máy, các số 0 và 1.

2040
01:57:05,001 --> 01:57:07,581
Tôi chắc chắn không muốn thực hiện\nloại quy trình này bằng tay.

2041
01:57:07,581 --> 01:57:11,181
Vậy nên hy vọng là có một thuật toán\n

2042
01:57:12,626 --> 01:57:14,751
Và những người trong số các bạn đã có một số kinh nghiệm trước đó

2043
01:57:14,751 --> 01:57:16,947
chương trình này có thể được gọi là?

2044
01:57:18,150 --> 01:57:20,150
Vì vậy, một số bạn thực sự đã lập trình trước đó.

2045
01:57:20,150 --> 01:57:21,831
Không phải tất cả các ngôn ngữ đều sử dụng trình biên dịch.

2046
01:57:21,831 --> 01:57:24,351
Trên thực tế, C là một ngôn ngữ\nsử dụng trình biên dịch.

2047
01:57:24,350 --> 01:57:27,680
Và vì vậy tôi chỉ cần tìm thấy chính mình--

2048
01:57:27,680 --> 01:57:31,280
trên máy tính của tôi ở đâu đó,\ncó lẽ-- cái gọi là trình biên dịch

2049
01:57:31,280 --> 01:57:35,730
một chương trình có mục đích trong cuộc sống\n

2050
01:57:35,730 --> 01:57:40,460
Và mã nguồn được viết dưới dạng văn bản\n

2051
01:57:41,661 --> 01:57:44,490
Mã máy là\ncác số 0 và số 1 tương ứng.

2052
01:57:44,490 --> 01:57:48,261
Vì vậy, hãy để tôi quay lại môi trường lập trình\nđược gọi là

2053
01:57:48,261 --> 01:57:50,421
Mã Visual Studio hoặc Mã VS.

2054
01:57:50,421 --> 01:57:53,541
Đây thường là một chương trình mà bạn\n

2055
01:57:53,541 --> 01:57:57,351
có thể tải xuống máy Mac của riêng họ hoặc\n

2056
01:57:57,350 --> 01:57:59,750
máy tính bạn sở hữu đang viết một số mã.

2057
01:57:59,751 --> 01:58:02,181
Tuy nhiên, nhược điểm của cách tiếp cận đó là tất cả chúng ta

2058
01:58:02,180 --> 01:58:04,790
có các phiên bản\nhơi khác nhau của máy Mac hoặc PC.

2059
01:58:04,791 --> 01:58:07,371
Chúng tôi có các phiên bản\nhệ điều hành hơi khác nhau.

2060
01:58:07,371 --> 01:58:08,931
Họ có thể hoặc không thể cập nhật.

2061
01:58:08,930 --> 01:58:13,020
Đó chỉ là cơn ác mộng của bộ phận hỗ trợ kỹ thuật\n

2062
01:58:13,020 --> 01:58:15,831
đặc biệt là phần giới thiệu\n

2063
01:58:15,831 --> 01:58:19,201
ở cùng một trang để chúng tôi có thể giúp bạn thiết lập và chạy nhanh chóng.

2064
01:58:19,201 --> 01:58:23,180
Và vì vậy tôi thực sự đang sử dụng một ứng dụng dựa trên đám mây\n

2065
01:58:23,180 --> 01:58:25,970
mà bạn chỉ cần có trình duyệt để truy cập.

2066
01:58:25,970 --> 01:58:28,760
Sau đó, bạn có thể sử dụng bất kỳ\nmáy tính nào, hôm nay hoặc ngày mai.

2067
01:58:28,761 --> 01:58:32,341
Đến cuối học kỳ, chúng ta\n

2068
01:58:32,341 --> 01:58:36,021
có thể nói, bằng cách tốt nhất chúng tôi có thể và\n đưa bạn đến máy Mac hoặc PC của riêng bạn

2069
01:58:36,020 --> 01:58:39,530
để sau lớp học này, đặc biệt nếu\n

2070
01:58:39,530 --> 01:58:43,131
bạn cảm thấy mình có thể tiếp tục\n

2071
01:58:45,270 --> 01:58:47,960
Nhưng hiện tại, thật tuyệt vời, phiên bản\ntrình duyệt của VS Code

2072
01:58:47,961 --> 01:58:51,793
có lẽ khá giống nhau\n

2073
01:58:51,792 --> 01:58:53,000
phiên bản tương tự sẽ được.

2074
01:58:53,001 --> 01:58:55,521
Và bạn sẽ thấy trong bài tập\nset 1 cách truy cập cái này

2075
01:58:55,520 --> 01:58:58,791
và cách tự mình bắt đầu\nvới các chương trình đầu tiên của mình.

2076
01:58:58,791 --> 01:59:01,641
Nhưng tôi chưa đề cập đến\nphần dưới cùng của màn hình này

2077
01:59:01,640 --> 01:59:03,140
phần dưới cùng của màn hình này.

2078
01:59:03,140 --> 01:59:06,570
Và đây là lĩnh vực mà chúng tôi có\n

2079
01:59:06,570 --> 01:59:10,400
Vậy đây là loại công nghệ cổ điển\n

2080
01:59:10,400 --> 01:59:15,380
để tương tác với máy tính mọi lúc mọi nơi\n

2081
01:59:15,381 --> 01:59:17,601
hoặc thậm chí, trong trường hợp này là trên đám mây.

2082
01:59:17,600 --> 01:59:20,150
Vì vậy, ở phần trên cùng\ncủa màn hình này

2083
01:59:20,150 --> 01:59:24,740
là trình soạn thảo văn bản của tôi, giống như tab\n

2084
01:59:24,740 --> 01:59:26,930
Tôi chỉ có thể tạo tập tin và viết mã.

2085
01:59:26,930 --> 01:59:30,050
Đây là phần dưới cùng của màn hình,\ncái gọi là cửa sổ đầu cuối của tôi

2086
01:59:30,051 --> 01:59:33,141
cho tôi khả năng\nchạy các lệnh trên máy chủ

2087
01:59:33,140 --> 01:59:35,600
mà hiện tại tôi có\quyền truy cập độc quyền.

2088
01:59:35,600 --> 01:59:39,680
Vì tôi đã đăng nhập vào VS\nCode bằng tài khoản của mình trực tuyến

2089
01:59:39,680 --> 01:59:44,451
Tôi có loại ảo của riêng mình\n

2090
01:59:44,451 --> 01:59:46,701
còn được gọi là, trong\nngữ cảnh này, một thùng chứa.

2091
01:59:46,701 --> 01:59:49,770
Cái này có hệ điều hành riêng\nđối với tôi, có ổ cứng riêng

2092
01:59:49,770 --> 01:59:52,640
nếu bạn muốn, nơi tôi có thể lưu\nvà tạo các tập tin của riêng mình

2093
01:59:52,640 --> 01:59:54,990
tách biệt với bạn và ngược lại.

2094
01:59:54,990 --> 01:59:57,381
Và tại dấu nhắc rất\nđơn giản này,

2095
01:59:57,381 --> 02:00:00,218
theo quy ước-- nhưng không phải luôn luôn--\n

2096
02:00:00,217 --> 02:00:01,550
không liên quan gì đến tiền tệ.

2097
02:00:01,551 --> 02:00:03,644
Nó chỉ có nghĩa là, gõ lệnh của bạn ở đây.

2098
02:00:03,644 --> 02:00:05,811
Đây là nơi tôi sẽ\ncó thể gõ lệnh

2099
02:00:05,810 --> 02:00:09,871
như biên dịch mã nguồn\ncode của tôi thành mã máy.

2100
02:00:09,871 --> 02:00:15,523
Vì vậy, đó là Giao diện dòng lệnh hoặc\n

2101
02:00:15,523 --> 02:00:18,230
mà có thể bạn chưa từng sử dụng\n

2102
02:00:19,220 --> 02:00:23,730
Hầu như tất cả chúng ta đều có mặt trong căn phòng này\n

2103
02:00:23,730 --> 02:00:26,990
nhưng tất cả chúng ta sẽ bắt đầu sử dụng\n

2104
02:00:26,990 --> 02:00:30,140
nằm trong họ hệ điều hành\n

2105
02:00:30,140 --> 02:00:33,230
giao diện dòng, nhưng không được sử dụng\n

2106
02:00:33,230 --> 02:00:35,850
các trang web và phát triển\nứng dụng và những thứ tương tự.

2107
02:00:35,850 --> 02:00:40,290
Và quả thực, nó rất quen thuộc và rất\n

2108
02:00:40,291 --> 02:00:45,801
Vậy làm cách nào để biến tệp\n, hello.c này thành một chương trình?

2109
02:00:45,801 --> 02:00:48,740
Không có biểu tượng nào để bấm đúp,\nnhưng có một lệnh.

2110
02:00:48,740 --> 02:00:54,140
Tôi có thể gõ chữ, chào hỏi với đồng đô la này\n

2111
02:00:54,140 --> 02:00:56,300
và dường như không có gì xảy ra.

2112
02:00:57,533 --> 02:00:59,490
Và như chúng ta sẽ thấy trong\nlập trình, hầu như luôn luôn

2113
02:00:59,490 --> 02:01:02,661
nếu bạn không thấy có gì sai sót,\n

2114
02:01:02,661 --> 02:01:04,400
Vì vậy, điều này ban đầu sẽ rất hiếm

2115
02:01:04,400 --> 02:01:07,490
nhưng đây là một điều tốt mà dường như chẳng làm được gì cả.

2116
02:01:07,490 --> 02:01:11,661
Nhưng bây giờ có trong thư mục\n trong tài khoản của tôi

2117
02:01:11,661 --> 02:01:15,261
trong tệp trên đám mây\na này có tên là "hello.

2118
02:01:15,261 --> 02:01:18,771
Và đó là một lệnh hơi kỳ lạ,\n

2119
02:01:19,581 --> 02:01:22,581
. chỉ có nghĩa là đi vào thư mục hiện tại của tôi.

2120
02:01:22,581 --> 02:01:28,371
/xin chào có nghĩa là chạy chương trình có tên\n

2121
02:01:28,371 --> 02:01:32,871
Vì vậy, ./hello, rồi Enter, và thì đấy,\n

2122
02:01:40,110 --> 02:01:42,770
Tôi sẽ tiếp tục và mở\nup thanh bên của chương trình này

2123
02:01:42,770 --> 02:01:44,911
và bạn sẽ thấy trong bài tập\nbộ 1 cách thực hiện việc này.

2124
02:01:44,911 --> 02:01:48,051
Và điều này có thể trông hơi khác\n

2125
02:01:48,051 --> 02:01:51,191
Ngay cả cách phối màu tôi đang sử dụng cũng có thể\n

2126
02:01:51,190 --> 02:01:52,940
vì nó hỗ trợ một chủ đề đầy màu sắc.

2127
02:01:52,940 --> 02:01:56,720
Vì vậy, bạn có thể có các màu sắc\nand độ sáng khác nhau tùy thuộc vào

2128
02:01:56,720 --> 02:01:58,250
vào tâm trạng của bạn hoặc thời gian trong ngày.

2129
02:01:58,251 --> 02:02:01,641
Tuy nhiên, thứ tôi đã mở ở đây là\n

2130
02:02:01,640 --> 02:02:04,278
và đây chỉ là tất cả\ntệp trong tài khoản đám mây của tôi.

2131
02:02:04,279 --> 02:02:05,571
Và hiện tại không có nhiều.

2132
02:02:06,576 --> 02:02:09,081
Một là tệp có tên\nhello.c và nó được đánh dấu

2133
02:02:09,081 --> 02:02:10,851
bởi vì tôi đã mở nó ngay tại đó.

2134
02:02:10,850 --> 02:02:14,330
Và tệp còn lại có tên\n"hello", tệp này hoàn toàn mới

2135
02:02:14,331 --> 02:02:17,331
và được tạo khi tôi chạy lệnh đó.

2136
02:02:17,331 --> 02:02:21,431
Và điều đáng chú ý bây giờ là\n

2137
02:02:22,780 --> 02:02:26,140
Giống như ở phía bên trái, bạn có\n

2138
02:02:26,140 --> 02:02:30,275
Nhưng ở phía dưới đây, một lần nữa, bạn\n

2139
02:02:30,275 --> 02:02:32,650
Đây chỉ là những cách khác nhau\nđể tương tác với máy tính

2140
02:02:32,650 --> 02:02:34,193
và bạn sẽ cảm thấy thoải mái với cả hai.

2141
02:02:34,193 --> 02:02:37,451
Và thành thật mà nói, bạn chắc chắn đã quen thuộc\n

2142
02:02:37,451 --> 02:02:40,911
vì vậy đây là dòng lệnh\n mà chúng ta sẽ dành chút thời gian cho nó.

2143
02:02:40,911 --> 02:02:43,600
Bây giờ giả sử rằng tôi\nmuốn làm điều gì đó

2144
02:02:43,600 --> 02:02:45,438
hơn là biên dịch chương trình này.

2145
02:02:45,439 --> 02:02:47,231
Giả sử tôi muốn tiếp tục và loại bỏ nó.

2146
02:02:47,230 --> 02:02:48,701
Giống như, ừm, không, tôi đã phạm sai lầm.

2147
02:02:48,701 --> 02:02:51,070
Tôi muốn nói "Xin chào\nCS50" chứ không phải "Xin chào thế giới.

2148
02:02:51,070 --> 02:02:55,121
Tôi chỉ có thể di chuột lên đây, như trong\n

2149
02:02:55,121 --> 02:02:57,881
và tôi có thể tìm kiếm xung quanh và\nở đó, xóa vĩnh viễn.

2150
02:02:57,881 --> 02:03:00,371
Vì vậy, hầu hết chúng ta có thể có\nbản năng đó trên máy Mac hoặc PC.

2151
02:03:00,371 --> 02:03:02,801
Bạn nhấp chuột phải hoặc nhấp chuột Control,\nvà bạn tìm kiếm xung quanh.

2152
02:03:02,801 --> 02:03:05,951
Nhưng trong giao diện dòng lệnh,\nhãy để tôi làm điều này.

2153
02:03:05,951 --> 02:03:08,440
Lệnh xóa\cũng như xóa tệp

2154
02:03:08,440 --> 02:03:12,100
trong thế giới Linux, hệ điều hành\nother này

2155
02:03:12,100 --> 02:03:16,330
chỉ là loại rm để xóa,\nvà sau đó "xin chào," Enter.

2156
02:03:16,331 --> 02:03:19,091
Đó là một sự xác nhận có phần khó hiểu\n

2157
02:03:19,961 --> 02:03:21,761
Tôi sẽ tiếp tục\nvà gõ Y cho Có.

2158
02:03:21,761 --> 02:03:24,191
Và bây giờ khi tôi nhấn\nEnter, hãy xem điều gì xảy ra

2159
02:03:24,190 --> 02:03:28,240
ở trên cùng bên trái trong Explorer,\nGUI, giao diện đồ họa.

2160
02:03:30,789 --> 02:03:32,980
Không thú vị lắm,\nnhưng điều này chỉ có nghĩa là

2161
02:03:32,980 --> 02:03:35,539
đây là phiên bản đồ họa\ncủa những gì chúng ta đang thấy ở đây.

2162
02:03:35,539 --> 02:03:38,800
Và trên thực tế, nếu bạn muốn\nkhông bao giờ sử dụng GUI nữa--

2163
02:03:38,800 --> 02:03:41,690
Tôi sẽ tiếp tục và đóng nó\nbằng phím tắt ở đây--

2164
02:03:41,690 --> 02:03:45,430
bạn có thể mãi mãi chỉ cần gõ\nls cho danh sách và nhấn Enter.

2165
02:03:45,430 --> 02:03:48,100
Và bạn sẽ thấy trong giao diện dòng lệnh\ncommand

2166
02:03:48,100 --> 02:03:50,617
tất cả các tập tin trong thư mục hiện tại của bạn.

2167
02:03:50,618 --> 02:03:52,451
Vì vậy, bất cứ điều gì bạn có thể làm\nvới chuột, bạn đều có thể

2168
02:03:52,451 --> 02:03:54,039
làm với giao diện dòng lệnh này.

2169
02:03:54,039 --> 02:03:57,411
Và thực sự, chúng ta sẽ thấy nhiều\nđiều khác mà bạn có thể làm.

2170
02:03:57,411 --> 02:04:01,091
Nhưng những người phát minh ra cái này, cái này\n

2171
02:04:02,291 --> 02:04:04,360
Giống như, lệnh là rm để xóa.

2172
02:04:07,390 --> 02:04:10,480
Bởi vì nó chỉ gõ nhanh hơn.

2173
02:04:10,480 --> 02:04:14,260
Vì vậy, trước khi chúng ta bắt tay vào việc tạo ra\n

2174
02:04:14,261 --> 02:04:16,181
chỉ là "Xin chào thế giới,"\nhãy để tôi tạm dừng ở đây để xem

2175
02:04:16,180 --> 02:04:19,420
nếu có thắc mắc về\nmã nguồn hoặc máy

2176
02:04:19,421 --> 02:04:24,221
mã hoặc trình biên dịch hoặc giao diện dòng lệnh\n này.

2177
02:04:26,628 --> 02:04:28,921
DAVID J. Malan:\nCâu hỏi thực sự hay, và hãy để tôi tóm tắt lại.

2178
02:04:28,921 --> 02:04:30,751
Nếu tôi thực hiện\ncác thay đổi đối với chương trình

2179
02:04:30,751 --> 02:04:33,871
chạy nó, sau đó có thể thực hiện\ncác thay đổi khác và thử chạy lại nó

2180
02:04:33,871 --> 02:04:37,028
liệu những thay đổi đó có được phản ánh không,\n

2181
02:04:37,860 --> 02:04:39,961
Mình đã gỡ bỏ bản cũ rồi.

2182
02:04:39,961 --> 02:04:43,530
Vậy hãy để tôi tiếp tục và chỉ ra rằng\nnếu tôi làm vậy ./hello bây giờ

2183
02:04:43,530 --> 02:04:47,760
Tôi sắp thấy một số lỗi\n

2184
02:04:47,761 --> 02:04:50,431
Không có tập tin hoặc thư mục như vậy nên\nit không thân thiện lắm với người dùng

2185
02:04:50,430 --> 02:04:51,960
nhưng nó cho biết vấn đề là gì.

2186
02:04:51,961 --> 02:04:55,231
Hãy để tôi tiếp tục và làm lại\nit bằng cách gõ make hello.

2187
02:04:55,230 --> 02:04:59,911
Bây giờ nếu tôi gõ ls, tôi sẽ không thấy cái nào\n

2188
02:04:59,911 --> 02:05:03,615
thậm chí còn có màu xanh lục với một dấu hoa thị nhỏ\n

2189
02:05:03,615 --> 02:05:05,490
Đó là một dạng\nphiên bản văn bản của một cái gì đó

2190
02:05:05,490 --> 02:05:07,251
bạn có thể nhấp đúp vào\thế giới con người của chúng ta.

2191
02:05:07,251 --> 02:05:10,501
Vì vậy, tất nhiên bây giờ, nếu tôi chạy hello, chúng ta\n

2192
02:05:10,501 --> 02:05:15,811
Nhưng bây giờ giả sử tôi đổi nó thành\n

2193
02:05:15,810 --> 02:05:21,000
Hãy để tôi tiếp tục và lưu tệp với\n

2194
02:05:21,001 --> 02:05:23,681
để tôi chạy lại ./hello, và thì đấy.

2195
02:05:25,171 --> 02:05:27,431
Vậy hãy để tôi nhờ người khác\ntrả lời câu hỏi đó.

2196
02:05:29,011 --> 02:05:31,051
Tại sao nó không nói "Xin chào CS50.

2197
02:05:33,171 --> 02:05:35,240
DAVID J. Malan: Vâng, vậy nên\ntôi đã không biên soạn lại nó.

2198
02:05:35,240 --> 02:05:38,421
Vì vậy, đây là lỗi của người mới, bạn sẽ tham gia\n

2199
02:05:38,990 --> 02:05:42,051
Nhưng bây giờ hãy để tôi tiếp tục\nvà làm lại xin chào, hãy vào.

2200
02:05:42,051 --> 02:05:45,171
Có vẻ như nó sẽ tạo ra cùng một chương trình.

2201
02:05:45,171 --> 02:05:49,431
Nhưng lần này khi tôi chạy\nit, nó là "Xin chào, CS50.

2202
02:05:49,430 --> 02:05:53,180
Bạn có câu hỏi nào khác về một số\nkhối xây dựng này không?

2203
02:05:53,180 --> 02:05:56,580
Và chúng ta sẽ quay lại với tất cả cú pháp\nđiên rồ mà tôi đã gõ trước đó.

2204
02:05:56,581 --> 02:05:58,881
Nhưng hiện tại, chúng tôi đang tập trung\không chỉ vào đầu ra.

2205
02:06:00,853 --> 02:06:02,560
DAVID J. Malan: Khi\ntôi tiếp tục chạy

2206
02:06:02,560 --> 02:06:05,510
nó tạo ra một phiên bản mới\ncủa mã máy.

2207
02:06:05,511 --> 02:06:09,490
Vì vậy nó liên tục thay đổi chương trình xin chào\n

2208
02:06:09,490 --> 02:06:12,599
Không có tập tin make nào cả.

2209
02:06:13,634 --> 02:06:15,051
DAVID J. Malan: Câu hỏi hay, không.

2210
02:06:15,051 --> 02:06:18,141
Nếu tôi mở thư mục đó, bạn sẽ\n

2211
02:06:18,140 --> 02:06:21,230
Và không quan trọng\n bao nhiêu lần tôi chạy chào--

2212
02:06:21,230 --> 02:06:25,251
ba, bốn, năm-- nó cứ\ntiếp tục ghi đè lên bản gốc.

2213
02:06:25,251 --> 02:06:28,753
Vì vậy, nó giống như việc lưu vào\n

2214
02:06:29,461 --> 02:06:31,003
Nhưng hôm nay có thêm một bước nữa.

2215
02:06:31,002 --> 02:06:36,280
Sau đó chúng ta phải chuyển đổi các từ của tôi thành\n

2216
02:06:38,541 --> 02:06:40,730
DAVID J. Malan: Ồ, chuyện gì xảy ra nếu tôi chạy hello.c?

2217
02:06:40,730 --> 02:06:45,081
Vậy hãy để tôi tiếp tục và thực hiện ./hello.c,\n

2218
02:06:48,801 --> 02:06:50,961
Đây là nơi thông báo lỗi\ncó ý nghĩa gì đó

2219
02:06:50,961 --> 02:06:53,661
tới những người đã thiết kế hệ điều hành\n

2220
02:06:53,661 --> 02:06:55,701
Không phải là bạn không có quyền truy cập vào tệp.

2221
02:06:55,701 --> 02:06:57,411
Nó có nghĩa là nó không thể thực thi được.

2222
02:06:57,411 --> 02:07:00,201
Đây không phải là thứ bạn\ncó quyền chạy

2223
02:07:00,201 --> 02:07:04,743
nhưng bạn có quyền đọc\n

2224
02:07:06,520 --> 02:07:08,228
DAVID J. Malan: Ồ,\ncâu hỏi thực sự hay.

2225
02:07:08,229 --> 02:07:11,801
Vậy nếu tôi đã đặt tên cho tập tin của mình, xin chào\n

2226
02:07:11,801 --> 02:07:15,761
dấu chấm C, trong số những việc\nMake thực hiện là tự động

2227
02:07:18,911 --> 02:07:20,711
chúng ta sẽ thảo luận vấn đề này nhiều hơn một chút vào tuần tới.

2228
02:07:20,711 --> 02:07:23,711
Tự tạo ra-- là loại\nlời nói dối trắng trợn đầu tiên ngày nay--

2229
02:07:25,480 --> 02:07:30,820
Đó là một chương trình biết cách tìm\n

2230
02:07:30,820 --> 02:07:33,161
và tự động tạo chương trình.

2231
02:07:33,161 --> 02:07:37,091
Nếu tôi sử dụng, như chúng ta sẽ thảo luận tiếp theo\n

2232
02:07:37,091 --> 02:07:41,081
Tôi phải gõ một chuỗi dài hơn nhiều\n

2233
02:07:41,081 --> 02:07:43,270
tôi muốn tên\ncủa chương trình của tôi là gì.

2234
02:07:43,270 --> 02:07:45,310
Make là một chương trình hay,\nđặc biệt là trong tuần 1

2235
02:07:45,310 --> 02:07:47,661
bởi vì nó chỉ tự động\ntất cả việc đó cho chúng tôi.

2236
02:07:47,661 --> 02:07:51,221
Và ở đây, bây giờ chúng ta có một\nchương trình in rất đơn giản

2237
02:07:52,220 --> 02:07:54,790
Vì vậy chúng ta đừng đặt điều này\nvào bối cảnh ở đâu

2238
02:07:54,791 --> 02:07:58,871
lần trước chúng ta đã dừng lại trong bối cảnh\n

2239
02:07:58,871 --> 02:08:01,961
Vì vậy, tất nhiên, lần cuối cùng chúng ta thảo luận về các hàm và đối số.

2240
02:08:01,961 --> 02:08:07,011
Một lần nữa, chức năng là những hành động đó và\n

2241
02:08:07,011 --> 02:08:09,403
Và các đối số là\đầu vào của các hàm đó

2242
02:08:09,403 --> 02:08:11,860
nói chung là trong những hình chữ nhật nhỏ màu trắng mà trong Scratch, bạn

2243
02:08:11,860 --> 02:08:13,961
có thể gõ từ hoặc số vào.

2244
02:08:13,961 --> 02:08:16,961
Chúng ta sẽ thấy, trong tất cả các ngôn ngữ\nchúng ta sẽ thấy thuật ngữ này

2245
02:08:18,283 --> 02:08:20,990
Và hãy bắt đầu dịch\n

2246
02:08:20,990 --> 02:08:24,911
Vì vậy, ví dụ, hãy đặt\nchương trình tương tự này vào C

2247
02:08:26,110 --> 02:08:29,621
Hello, World trông như thế này\n

2248
02:08:29,621 --> 02:08:32,530
Tất nhiên, tuần này\nit trông giống như bản in.

2249
02:08:32,530 --> 02:08:34,990
Và sau đó,\nlưu ý rằng các dấu ngoặc đơn là loại

2250
02:08:34,990 --> 02:08:38,679
được thiết kế có chủ đích trong thế giới\n

2251
02:08:38,679 --> 02:08:40,721
Mặc dù đây là\nhình bầu dục màu trắng nhưng bạn vẫn có thể hiểu được

2252
02:08:40,720 --> 02:08:45,400
rằng nó gợi lên ý tưởng tương tự với dấu ngoặc đơn.

2253
02:08:45,400 --> 02:08:49,180
Về mặt kỹ thuật hàm\nin C, nó không được gọi là say.

2254
02:08:51,671 --> 02:08:55,061
F là viết tắt của định dạng, nhưng chúng ta sẽ\n

2255
02:08:55,060 --> 02:08:57,610
Nhưng printf là hàm\nalogous gần nhất

2256
02:08:57,610 --> 02:09:00,881
chẳng hạn như trong thế giới của\nC. Tuy nhiên, hãy chú ý nếu bạn

2257
02:09:00,881 --> 02:09:05,501
muốn in nội dung nào đó như\nHello, World hoặc Hello CS50 trong C

2258
02:09:05,501 --> 02:09:08,980
bạn không chỉ viết\ntừ như chúng tôi đã làm tuần trước.

2259
02:09:08,980 --> 02:09:11,411
Bạn cũng có một phần bổ sung,\nnếu bạn đã nhận thấy

2260
02:09:11,411 --> 02:09:13,360
phiên bản này còn thiếu gì

2261
02:09:13,360 --> 02:09:15,680
Vâng, vậy dấu ngoặc kép\không phải bên trái và bên phải.

2262
02:09:15,680 --> 02:09:20,998
Vì vậy, điều đó là cần thiết trong C bất cứ khi nào\nbạn có một chuỗi từ.

2263
02:09:20,998 --> 02:09:22,541
Và tôi đang cố tình sử dụng từ đó.

2264
02:09:22,541 --> 02:09:26,831
Bất cứ khi nào bạn có nhiều từ\n

2265
02:09:27,461 --> 02:09:30,971
Và bạn phải đặt nó trong dấu ngoặc kép\n, không phải dấu ngoặc đơn.

2266
02:09:30,970 --> 02:09:32,680
Bạn phải đặt nó trong dấu ngoặc kép.

2267
02:09:32,680 --> 02:09:36,880
Còn một điều ngu ngốc\nmà chúng ta cần có trong mã C của mình

2268
02:09:36,881 --> 02:09:40,971
để thực hiện được chức năng này\n

2269
02:09:41,841 --> 02:09:44,240
Vì vậy, giống như trong thế giới\ncon người của chúng ta, cuối cùng bạn

2270
02:09:44,240 --> 02:09:47,270
đã có thói quen sử dụng, lúc\n

2271
02:09:47,270 --> 02:09:50,690
Dấu chấm phẩy thường là thứ\nbạn sử dụng để kết thúc suy nghĩ của mình

2272
02:09:50,690 --> 02:09:53,780
trong thế giới lập trình với C.

2273
02:09:53,780 --> 02:09:55,911
Được rồi, vậy là chúng ta đã có\nchức năng đó.

2274
02:09:55,911 --> 02:09:59,661
Bây giờ, cái này thực sự phù hợp với cái gì\n

2275
02:09:59,661 --> 02:10:01,070
Vâng, các hàm lấy đối số.

2276
02:10:01,070 --> 02:10:04,760
Và hóa ra các hàm có thể có nhiều loại kết quả đầu ra khác nhau.

2277
02:10:04,761 --> 02:10:07,071
Và chúng tôi thực sự đã thấy\ncả hai vào tuần trước.

2278
02:10:07,070 --> 02:10:11,360
Một loại đầu ra từ một hàm\n

2279
02:10:11,360 --> 02:10:13,430
Và nó thường ám chỉ\nđiều gì đó trực quan

2280
02:10:13,430 --> 02:10:17,570
giống như thứ gì đó xuất hiện trên màn hình\n

2281
02:10:17,570 --> 02:10:20,211
Đó là một loại tác dụng phụ của\nchức năng đang thực hiện công việc của nó.

2282
02:10:20,211 --> 02:10:24,231
Và thực sự, tuần trước chúng tôi đã thấy điều này trong\n

2283
02:10:24,230 --> 02:10:27,180
như Hello, World as\ninput cho hàm say.

2284
02:10:27,180 --> 02:10:31,040
Và chúng tôi thấy trên màn hình Xin chào,\n

2285
02:10:32,930 --> 02:10:35,840
Bạn thực sự không thể làm bất cứ điều gì\nvới kết quả trực quan đó

2286
02:10:35,841 --> 02:10:38,581
ngoài việc tiêu thụ nó,\nbằng trực quan, bằng mắt người.

2287
02:10:38,581 --> 02:10:43,251
Nhưng đôi khi, hãy nhớ lại tuần trước, chúng ta\n

2288
02:10:43,251 --> 02:10:44,961
thực sự đã trả lại cho tôi một số giá trị.

2289
02:10:44,961 --> 02:10:47,001
Hãy nhớ câu hỏi, tên bạn là gì.

2290
02:10:47,001 --> 02:10:50,684
Nó trả lại cho tôi bất cứ\ncâu trả lời nào mà con người đã gõ vào.

2291
02:10:50,684 --> 02:10:52,851
Nó không chỉ hiển thị tùy ý\ntrên màn hình.

2292
02:10:52,850 --> 02:10:55,190
Con mèo không nhất thiết phải nói điều đó trên màn hình.

2293
02:10:55,190 --> 02:11:01,640
Thay vào đó, nó được lưu trữ trong gói đặc biệt\n

2294
02:11:01,640 --> 02:11:05,510
Bởi vì một số hàm không có tác dụng phụ mà trả về giá trị.

2295
02:11:05,511 --> 02:11:09,321
Họ trao lại cho bạn một kết quả\nmà bạn có thể sử dụng và tái sử dụng

2296
02:11:09,320 --> 02:11:11,961
không giống như tác dụng phụ,\nại hiển thị và thế là xong.

2297
02:11:11,961 --> 02:11:14,461
Bạn không thể bắt\nit và giữ nó.

2298
02:11:14,461 --> 02:11:17,601
Vì vậy, trong bối cảnh\ntuần trước, chúng tôi đã gặp phải khối yêu cầu.

2299
02:11:17,600 --> 02:11:20,270
Và nó có giá trị trả về\ncâu trả lời đặc biệt này.

2300
02:11:20,270 --> 02:11:22,970
Trong C, chúng ta sẽ\nxem ngay sau đây

2301
02:11:22,970 --> 02:11:25,400
chúng ta có thể dịch điều này như sau.

2302
02:11:25,400 --> 02:11:29,001
Trận đấu gần nhất mà tôi có thể\nđề xuất cho khối hỏi

2303
02:11:29,001 --> 02:11:31,581
là một hàm mà chúng ta sẽ\nbắt đầu gọi get string.

2304
02:11:31,581 --> 02:11:34,730
Chuỗi lại là một từ, một\ntập hợp các từ, giống như một cụm từ

2305
02:11:34,730 --> 02:11:36,710
hoặc một câu trong lập trình.

2306
02:11:36,711 --> 02:11:41,331
Nó cũng là một chức năng trong chừng mực\n

2307
02:11:41,331 --> 02:11:43,551
điều này không phải lúc nào cũng đúng--\nnhưng rất thường xuyên khi

2308
02:11:43,551 --> 02:11:48,261
bạn có một từ trong C theo sau là một từ mở\n

2309
02:11:48,261 --> 02:11:50,961
rất có thể đó là tên của một hàm.

2310
02:11:50,961 --> 02:11:53,461
Và chúng ta sẽ thấy rằng\ncó một số trường hợp ngoại lệ.

2311
02:11:53,461 --> 02:11:55,791
Nhưng hiện tại, điều này thực sự\ncó vẻ giống như một chức năng

2312
02:11:55,791 --> 02:11:57,201
vì nó phù hợp với mẫu đó.

2313
02:11:57,201 --> 02:12:00,668
Nếu tôi muốn hỏi câu hỏi,\ntên bạn là gì, dấu chấm hỏi--

2314
02:12:00,668 --> 02:12:03,711
và tôi thậm chí còn cố tình\n

2315
02:12:03,711 --> 02:12:07,161
con trỏ hơi chếch lên một chút để\n

2316
02:12:08,190 --> 02:12:10,201
Vì vậy, đó chỉ là thẩm mỹ nitpicky.

2317
02:12:10,201 --> 02:12:14,480
Đây có lẽ là cách tương tự\n gần nhất với việc đặt câu hỏi đó.

2318
02:12:14,480 --> 02:12:18,680
Nhưng vì khối hỏi\n trả về một giá trị

2319
02:12:18,680 --> 02:12:22,020
ở đây, chuỗi tương tự bị quên là\nnó cũng trả về một giá trị.

2320
02:12:22,020 --> 02:12:23,960
Nó không chỉ in đầu vào của con người.

2321
02:12:23,961 --> 02:12:28,131
Nó trao lại cho bạn dưới dạng\n

2322
02:12:28,131 --> 02:12:30,501
mà sau đó tôi có thể sử dụng và tái sử dụng.

2323
02:12:30,501 --> 02:12:33,471
Bây giờ, lý tưởng nhất là nó\nđơn giản như thế này theo nghĩa đen

2324
02:12:33,470 --> 02:12:36,890
nói câu trả lời ở bên trái bằng.

2325
02:12:36,890 --> 02:12:38,780
Và đây\nmọi thứ bắt đầu khác đi

2326
02:12:38,780 --> 02:12:40,640
từ toán học và thế giới con người của chúng ta.

2327
02:12:40,640 --> 02:12:44,210
Dấu bằng này từ nay trở đi\không phải là dấu bằng.

2328
02:12:44,211 --> 02:12:46,521
Đây là toán tử gán.

2329
02:12:46,520 --> 02:12:50,030
Gán một giá trị có nghĩa là\nlưu trữ một giá trị trong một biến nào đó.

2330
02:12:50,030 --> 02:12:53,640
Và bạn đọc những điều này,\nthật kỳ lạ, từ phải sang trái.

2331
02:12:53,640 --> 02:12:55,820
Vì vậy, đây là một hàm gọi là lấy chuỗi.

2332
02:12:55,820 --> 02:12:58,310
Tôi khẳng định rằng nó\nsẽ quay trở lại với bạn dù thế nào đi nữa

2333
02:12:58,310 --> 02:13:00,411
con người gõ vào tên của họ.

2334
02:13:00,411 --> 02:13:03,320
Nó sẽ được lưu trữ\nover ở đây bên trái bởi vì

2335
02:13:03,320 --> 02:13:06,331
của cái gọi là nhiệm vụ này\n

2336
02:13:06,331 --> 02:13:08,581
Nhưng nó không có nghĩa\sự bất bình đẳng trong bối cảnh này.

2337
02:13:10,171 --> 02:13:14,961
Nhưng nó làm được điều đó bằng cách sao chép giá trị trên\n

2338
02:13:14,961 --> 02:13:16,940
Thật không may, chúng tôi vẫn chưa hoàn thành xong việc với C.

2339
02:13:16,940 --> 02:13:19,670
Và đây cũng là lúc ban đầu bạn thấy hơi khó chịu

2340
02:13:19,671 --> 02:13:23,780
nơi Scratch để chúng tôi bày tỏ\n

2341
02:13:23,780 --> 02:13:27,110
Trong C khi bạn có một\nbiến bạn không chỉ

2342
02:13:27,110 --> 02:13:29,001
đặt tên cho nó giống như bạn đã làm trong Scratch.

2343
02:13:29,001 --> 02:13:33,051
Bạn cũng phải báo trước cho máy tính biết loại giá trị nào

2344
02:13:34,310 --> 02:13:37,340
Chuỗi là một loại giá trị như vậy.

2345
02:13:37,341 --> 02:13:40,070
Int, đối với số nguyên, sẽ là một số khác.

2346
02:13:40,070 --> 02:13:42,860
Và thậm chí còn nhiều hơn thế\nchúng ta sẽ thấy hôm nay và hơn thế nữa.

2347
02:13:42,860 --> 02:13:46,070
Và đây một phần là câu trả lời cho\n

2348
02:13:46,070 --> 02:13:49,970
tuần trước, máy tính hoạt động như thế nào\n

2349
02:13:51,320 --> 02:13:55,518
Giống như đây là một chữ cái, một con số,\na màu sắc, một đoạn video.

2350
02:13:55,518 --> 02:13:58,350
Và tôi vừa tuyên bố vào tuần trước rằng\n

2351
02:14:00,871 --> 02:14:04,190
Nhưng trong những\nchương trình đó, điều đó thường phụ thuộc vào

2352
02:14:04,190 --> 02:14:08,810
về những gì mà lập trình viên con người\nnói về loại giá trị.

2353
02:14:08,810 --> 02:14:10,850
Nếu điều này chỉ rõ\nchuỗi đó, có nghĩa là

2354
02:14:10,850 --> 02:14:12,890
giải thích những\nsố 0 sau đây và những số 0

2355
02:14:12,890 --> 02:14:16,640
nói chung được lưu trữ trong chương trình của tôi dưới dạng\ntừ hoặc chữ cái.

2356
02:14:16,640 --> 02:14:20,960
Nếu nó là một int cho số nguyên thì nó sẽ\n

2357
02:14:20,961 --> 02:14:24,981
coi các số 0 và\none sau đây trong chương trình của tôi là một số

2358
02:14:26,791 --> 02:14:29,661
Đây là nơi diễn ra\ntuần này, không giống như Scratch

2359
02:14:29,661 --> 02:14:33,081
đó là cách để tìm ra những gì bạn\n

2360
02:14:33,081 --> 02:14:36,201
bạn phải tỏ ra thông thái như vậy\nvà nói cho nó biết ý bạn là gì.

2361
02:14:36,201 --> 02:14:39,721
Vẫn còn một điều ngu ngốc\nthiếu trong mã của tôi ở đây.

2362
02:14:42,150 --> 02:14:44,230
DAVID J. Malan: Và chúng ta vẫn\n cần dấu chấm phẩy ngu ngốc.

2363
02:14:44,230 --> 02:14:45,648
Và tôi đang nghi ngờ nó ở đây.

2364
02:14:45,648 --> 02:14:48,060
Bởi vì thành thật mà nói, đây\nlà những sai lầm ngu ngốc

2365
02:14:48,060 --> 02:14:50,701
bạn sẽ thực hiện hôm nay,\nngày mai, cuối tuần này, tuần tới

2366
02:14:50,701 --> 02:14:54,480
vài tuần kể từ bây giờ, cho đến khi bạn\n

2367
02:14:54,480 --> 02:14:58,440
cũng như bạn nói tiếng Anh hoặc\nbất kỳ ngôn ngữ nói nào của bạn.

2368
02:15:00,511 --> 02:15:03,031
Giả sử tôi trộn táo và cam, có thể nói như vậy

2369
02:15:03,030 --> 02:15:06,421
và tôi cố gắng đặt một chuỗi vào\nan int hoặc int vào một chuỗi

2370
02:15:06,421 --> 02:15:08,581
trình biên dịch sẽ khiếu nại.

2371
02:15:08,581 --> 02:15:10,841
Vì vậy, khi tôi chạy lệnh make\n như tôi đã làm trước đó

2372
02:15:10,841 --> 02:15:14,893
nó sẽ không tốt đẹp và hạnh phúc\n

2373
02:15:14,893 --> 02:15:17,100
Nó sắp hét vào mặt tôi\nvới một giọng nói rất khó hiểu

2374
02:15:17,100 --> 02:15:20,350
tìm kiếm thông báo lỗi cho đến khi chúng tôi nhận được\n

2375
02:15:23,100 --> 02:15:24,990
À, chuyện gì đã xảy ra với dấu gạch chéo ngược n.

2376
02:15:24,990 --> 02:15:26,820
Vì vậy, chúng ta sẽ quay lại vấn đề đó\n trong giây lát, nếu có thể.

2377
02:15:26,820 --> 02:15:29,778
Bởi vì tôi đã cố tình bỏ qua\n

2378
02:15:29,779 --> 02:15:32,311
Và chúng ta sẽ thấy hành vi\nkhác sau một giây nữa.

2379
02:15:37,470 --> 02:15:39,720
Đây là những thứ\nquan trọng.

2380
02:15:39,720 --> 02:15:43,710
Và sẽ mất thời gian để nhận ra\n

2381
02:15:43,711 --> 02:15:48,306
Mọi thứ tôi đã gõ ở đây ngoại trừ,\n

2382
02:15:48,305 --> 02:15:50,430
Và chữ W được viết hoa\nchỉ vì nó là tiếng Anh.

2383
02:15:50,430 --> 02:15:51,900
Mọi thứ khác đều là chữ thường.

2384
02:15:51,900 --> 02:15:54,510
Và loại này thay đổi tùy theo\nngôn ngữ cũng như bối cảnh.

2385
02:15:54,511 --> 02:15:58,621
Vì vậy, trong nhiều ngôn ngữ, quy ước\n

2386
02:16:00,060 --> 02:16:02,440
Các ngôn ngữ khác cũng có thể sử dụng\nmột số chữ hoa.

2387
02:16:02,440 --> 02:16:04,050
Nhưng chúng ta sẽ nói về điều đó sớm thôi.

2388
02:16:04,051 --> 02:16:05,951
Nhưng đây mới là điều quan trọng

2389
02:16:05,951 --> 02:16:09,480
và ban đầu rất khó nhìn thấy, đặc biệt\n

2390
02:16:09,480 --> 02:16:12,930
khác khi chữ S viết hoa trên màn hình\nmáy tính xách tay nhỏ bé của bạn.

2391
02:16:12,930 --> 02:16:15,850
Nhưng bạn sẽ bắt đầu\nphát triển những bản năng này.

2392
02:16:15,850 --> 02:16:18,060
Được rồi, ngoài\nkhối đặc biệt này

2393
02:16:18,060 --> 02:16:22,180
hãy tiếp tục và xem xét cách chúng ta có thể\n

2394
02:16:22,180 --> 02:16:24,300
Vì vậy, hãy để tôi chuyển về Mã VS ở đây.

2395
02:16:24,301 --> 02:16:26,081
Đây là chương trình tôi đã có trước đó.

2396
02:16:26,081 --> 02:16:28,891
Và hãy để tôi tiếp tục\nhoàn tác việc thay đổi CS50 của tôi.

2397
02:16:30,720 --> 02:16:35,251
Chạy lại Make on Hello bằng bản gốc\n

2398
02:16:35,251 --> 02:16:37,230
Vào đi, có vẻ như không có gì xấu\nxảy ra.

2399
02:16:37,230 --> 02:16:40,740
Vì vậy hãy gạch chéo dấu chấm Hello, nhập Hello, World.

2400
02:16:40,740 --> 02:16:43,140
Bây giờ, nếu bạn tò mò,\nđây là một bản năng tốt

2401
02:16:43,140 --> 02:16:45,558
để bắt đầu hiểu điều gì sẽ xảy ra nếu tôi loại bỏ điều này.

2402
02:16:45,558 --> 02:16:47,850
Chà, có lẽ tôi sẽ không làm hỏng mọi thứ quá tệ.

2403
02:16:48,781 --> 02:16:51,240
Hãy để tôi tiếp tục và thực hiện Make Hello.

2404
02:16:52,331 --> 02:16:53,980
Vì vậy, đó không phải là một sai lầm thực sự tồi tệ.

2405
02:16:53,980 --> 02:16:56,700
Vậy hãy để tôi tiếp tục\nchạy dấu gạch chéo Xin chào.

2406
02:16:58,921 --> 02:17:01,560
Vâng, bạn thấy điều gì khác biệt?

2407
02:17:01,560 --> 02:17:05,091
Vâng, ký hiệu đô la, cái gọi là\n của tôi

2408
02:17:05,630 --> 02:17:08,780
Chà, có lẽ bây giờ chúng ta có thể suy ra rằng dấu gạch chéo ngược

2409
02:17:08,781 --> 02:17:12,531
n là một ký hiệu lạ mắt\nnói rằng tạo một dòng mới

2410
02:17:12,531 --> 02:17:14,881
di chuyển con trỏ để\nnói, tới dòng tiếp theo.

2411
02:17:14,880 --> 02:17:18,770
Lưu ý rằng con trỏ sẽ di chuyển đến\n

2412
02:17:18,771 --> 02:17:20,781
Nếu tôi tiếp tục đánh nó,\nit sẽ tự động

2413
02:17:20,781 --> 02:17:22,371
theo bản chất là nhấn enter phải không.

2414
02:17:22,370 --> 02:17:25,310
Nhưng sẽ thật ngu ngốc nếu khi\n

2415
02:17:25,310 --> 02:17:28,310
đơn giản như vậy, nếu\nlệnh tiếp theo bây giờ là

2416
02:17:28,310 --> 02:17:31,770
cách nhau một cách kỳ lạ ở giữa\n

2417
02:17:33,111 --> 02:17:35,061
Nó thực sự chỉ là một lập luận thẩm mỹ.

2418
02:17:35,060 --> 02:17:40,940
Và lưu ý rằng điều đó không được chấp nhận hoặc\n

2419
02:17:40,941 --> 02:17:43,441
Tuy nhiên, hãy để tôi tiếp tục và lưu dữ liệu đó\nvà xem điều gì sẽ xảy ra.

2420
02:17:43,441 --> 02:17:47,001
Bây giờ hãy để tôi tiếp tục và\nchạy Make Hello.

2421
02:17:49,161 --> 02:17:53,390
Điều này giống như 10 dòng\nlỗi cho một chương trình một dòng.

2422
02:17:53,390 --> 02:17:56,390
Và đây là nơi bạn sẽ bắt đầu\n

2423
02:17:57,380 --> 02:18:00,530
Những loại công cụ này, như\ncông cụ biên dịch mà chúng tôi đang sử dụng

2424
02:18:00,531 --> 02:18:03,861
không nhất thiết được thiết kế\nvới mục đích thân thiện với người dùng.

2425
02:18:03,861 --> 02:18:06,081
Điều đó đã thay đổi qua\nthập kỷ, nhưng chắc chắn là sớm

2426
02:18:06,081 --> 02:18:09,810
trên đó nó thực sự chỉ có ý nghĩa như vậy\n

2427
02:18:11,150 --> 02:18:13,941
Thiếu ký tự kết thúc\nđóng trích dẫn

2428
02:18:13,941 --> 02:18:17,061
Tóm lại, khi\nbạn có một chuỗi trong C

2429
02:18:17,060 --> 02:18:20,511
dấu ngoặc kép của bạn chỉ cần\n

2430
02:18:20,511 --> 02:18:22,049
Bây giờ, có một lời nói dối trắng trợn.

2431
02:18:23,091 --> 02:18:29,631
Nhưng cách tốt nhất là\n

2432
02:18:29,630 --> 02:18:32,390
Để thoát khỏi cái gì đó nói chung có nghĩa là\nđặt dấu gạch chéo ngược, sau đó

2433
02:18:32,390 --> 02:18:34,710
một ký hiệu đặc biệt như n cho dòng mới.

2434
02:18:34,710 --> 02:18:39,510
Và đây chỉ là cách đã thống nhất\n

2435
02:18:39,511 --> 02:18:42,650
Được rồi, bạn không chỉ nhấn phím enter.

2436
02:18:42,650 --> 02:18:46,941
Thay vào đó, bạn đặt dấu gạch chéo ngược n\nand để báo cho máy tính biết

2437
02:18:46,941 --> 02:18:49,471
để di chuyển con trỏ đến dòng mới.

2438
02:18:50,977 --> 02:18:52,310
Nhưng một khi bạn biết điều đó, thế là xong.

2439
02:18:52,310 --> 02:18:55,470
Nó chỉ là một từ\ntrong từ vựng của chúng tôi.

2440
02:18:55,470 --> 02:18:58,550
Vậy bây giờ hãy để tôi chuyển sang làm\n

2441
02:18:58,550 --> 02:19:00,140
Thay vì chỉ nói\nXin chào thế giới, hãy để tôi

2442
02:19:00,140 --> 02:19:02,015
thay đổi nó giống như tuần trước\nđể nói Xin chào, David

2443
02:19:02,015 --> 02:19:04,320
hoặc bất cứ ai đang tương tác\nvới chương trình.

2444
02:19:04,320 --> 02:19:07,851
Vì vậy tôi sẽ thực hiện chuỗi\nanswer get, get string

2445
02:19:07,851 --> 02:19:11,256
trích dẫn không trích dẫn, tên bạn là gì.

2446
02:19:11,255 --> 02:19:13,130
Tôi sẽ không bận tâm\nvới một dòng mới ở đây.

2447
02:19:13,730 --> 02:19:15,181
Đây bây giờ chỉ là một cuộc gọi phán xét.

2448
02:19:15,181 --> 02:19:17,889
Tôi cố tình muốn con người\n

2449
02:19:20,790 --> 02:19:22,970
Vâng tuần trước nhớ lại chúng tôi đã sử dụng nói.

2450
02:19:22,970 --> 02:19:25,251
Và sau đó chúng tôi sử dụng khối\nother được gọi là tham gia.

2451
02:19:25,251 --> 02:19:27,681
Vì vậy, ý tưởng ở đây là như nhau.

2452
02:19:27,681 --> 02:19:30,181
Nhưng cú pháp tuần này\nsẽ khác một chút.

2453
02:19:30,181 --> 02:19:33,871
Nó sẽ là printf,\nin nội dung nào đó lên màn hình.

2454
02:19:33,870 --> 02:19:38,090
Tôi sẽ tiếp tục\nvà nói Xin chào bằng dấu phẩy.

2455
02:19:38,091 --> 02:19:43,070
Và hãy để tôi bắt đầu với điều này ban đầu\n

2456
02:19:43,070 --> 02:19:46,700
Hãy để tôi tiếp tục và biên dịch lại mã của tôi.

2457
02:19:46,700 --> 02:19:50,292
Rất tiếc, chết tiệt, nó vẫn không hoạt động.

2458
02:19:50,292 --> 02:19:51,501
Và hãy nhìn vào tất cả những lỗi này.

2459
02:19:51,501 --> 02:19:54,441
Có nhiều lỗi hơn mã tôi đã viết.

2460
02:19:56,431 --> 02:19:58,881
Chà, đây thực ra là\nmột lỗi gì đó, bạn sẽ thấy

2461
02:19:58,880 --> 02:20:01,130
hơi thường xuyên, ít nhất là lúc đầu.

2462
02:20:01,130 --> 02:20:03,270
Và hãy bắt đầu tìm hiểu\nđiều gì đang diễn ra ở đây.

2463
02:20:03,271 --> 02:20:06,921
Vì vậy, ở đây, nếu tôi nhìn vào cái đầu tiên\n

2464
02:20:06,921 --> 02:20:09,921
nên mặc dù nó nhảy xuống\nmàn hình khá nhanh

2465
02:20:09,921 --> 02:20:12,831
Tôi đã viết Make Hello ở\nký hiệu đô la, nhắc nhở.

2466
02:20:12,831 --> 02:20:14,361
Và đây là lỗi đầu tiên.

2467
02:20:17,120 --> 02:20:21,020
về mặt kỹ thuật là ký tự 5, nhưng nhìn chung\n

2468
02:20:21,021 --> 02:20:24,951
có lỗi, hãy sử dụng chuỗi định danh\nundeclared.

2469
02:20:28,101 --> 02:20:30,361
Và đây không phải là một giải pháp rõ ràng lúc đầu.

2470
02:20:30,361 --> 02:20:34,161
Nhưng bạn sẽ bắt đầu nhận ra\nnhững mẫu này trong thông báo lỗi.

2471
02:20:34,161 --> 02:20:39,740
Hóa ra là nếu tôi muốn sử dụng\n

2472
02:20:39,740 --> 02:20:43,879
Tôi phải thêm một thư viện khác\nup vào đây, một dòng mã khác

2473
02:20:43,879 --> 02:20:46,460
đúng hơn là gọi là CS50\ndot H. Chúng tôi sẽ quay lại

2474
02:20:46,460 --> 02:20:48,300
điều này có ý nghĩa gì chỉ trong chốc lát.

2475
02:20:48,300 --> 02:20:54,560
Nhưng nếu bây giờ tôi nói ngược lại,\n

2476
02:20:55,670 --> 02:20:59,720
Trước khi tôi thêm dòng mới đó,\nI/O tiêu chuẩn đang làm gì?

2477
02:20:59,720 --> 02:21:01,670
Chà, nếu bạn nghĩ\nquay lại Scratch, ở đó

2478
02:21:01,670 --> 02:21:07,761
là một vài ví dụ về máy ảnh và\n

2479
02:21:07,761 --> 02:21:10,281
Hãy nhớ rằng tôi đã phải tìm kiếm\n nút tiện ích mở rộng.

2480
02:21:10,281 --> 02:21:12,110
Và sau đó tôi phải tải nó vào Scratch.

2481
02:21:12,110 --> 02:21:14,240
Nó không có sẵn trong Scratch.

2482
02:21:15,920 --> 02:21:18,170
Một số chức năng đi kèm với ngôn ngữ.

2483
02:21:18,170 --> 02:21:22,161
Nhưng phần lớn, nếu bạn muốn\n

2484
02:21:22,161 --> 02:21:26,570
giống như printf, bạn phải tải\ntiện ích mở rộng đó, có thể nói như vậy

2485
02:21:26,570 --> 02:21:29,361
theo truyền thống\nis được gọi là thư viện.

2486
02:21:29,361 --> 02:21:35,121
Vậy là có thư viện I/O\n chuẩn, I/O STD, I/O chuẩn

2487
02:21:35,120 --> 02:21:37,350
trong đó I/O chỉ có nghĩa là đầu vào và đầu ra.

2488
02:21:37,351 --> 02:21:39,441
Điều đó có nghĩa là, giống như\nin Thế giới của MIT, ở đó

2489
02:21:39,441 --> 02:21:43,161
là một tiện ích mở rộng để thực hiện văn bản\n

2490
02:21:43,161 --> 02:21:45,470
Trong C, có phần mở rộng, a.k.a.

2491
02:21:45,470 --> 02:21:49,230
một thư viện để thực hiện việc nhập và xuất theo tiêu chuẩn.

2492
02:21:49,230 --> 02:21:53,450
Và vì vậy nếu bạn muốn sử dụng bất kỳ chức năng nào\n

2493
02:21:53,450 --> 02:21:58,130
giống như văn bản từ bàn phím, bạn\nphải bao gồm dấu chấm I/O tiêu chuẩn

2494
02:21:58,130 --> 02:22:02,360
H. Và sau đó bạn có thể sử dụng printf.

2495
02:22:03,890 --> 02:22:08,690
Nhận chuỗi, hóa ra là một\n

2496
02:22:08,691 --> 02:22:10,971
Và như chúng ta sẽ thấy\ntrong những tuần tới, nó chỉ

2497
02:22:10,970 --> 02:22:14,780
giúp việc nhận thông tin đầu vào từ người dùng trở nên dễ dàng hơn.

2498
02:22:14,781 --> 02:22:18,111
C rất tốt với printf khi in ra trên màn hình.

2499
02:22:18,111 --> 02:22:21,411
C làm cho nó thực sự khó chịu và\n

2500
02:22:21,411 --> 02:22:23,191
để chỉ nhận đầu vào từ người dùng.

2501
02:22:23,191 --> 02:22:25,820
Vì vậy chúng tôi đã viết một hàm\ngọi là get_string

2502
02:22:25,820 --> 02:22:29,240
nhưng cách duy nhất bạn có thể sử dụng\nđó là tải tiện ích mở rộng

2503
02:22:29,240 --> 02:22:32,271
hay còn gọi là tải thư viện có tên CS50.

2504
02:22:32,271 --> 02:22:35,841
Và chúng ta sẽ quay lại đúng lúc, như,\n

2505
02:22:35,841 --> 02:22:39,291
Nhưng hiện tại, chuẩn\nI/O là một thư viện

2506
02:22:39,290 --> 02:22:42,540
cung cấp cho bạn quyền truy cập vào các nội dung liên quan đến printf và\ninput- và đầu ra.

2507
02:22:42,540 --> 02:22:45,110
CS50 là thư viện thứ hai\ncung cấp cho bạn

2508
02:22:45,111 --> 02:22:48,441
có quyền truy cập vào các chức năng\nkhông đi kèm với C

2509
02:22:48,441 --> 02:22:51,501
bao gồm những thứ như get_string.

2510
02:22:51,501 --> 02:22:55,191
Như đã nói, chúng ta\nbây giờ đã có chút trêu chọc nhau

2511
02:22:55,191 --> 02:22:58,171
ở mức cao những dòng\n2 và bây giờ 1 đang làm.

2512
02:22:58,171 --> 02:23:00,380
Hãy để tôi tiếp tục và chạy lại câu chào.

2513
02:23:01,611 --> 02:23:05,099
Vì vậy, tất cả các thông báo lỗi điên rồ\nđã được giải quyết chỉ bằng một lần sửa

2514
02:23:05,099 --> 02:23:07,640
vì vậy điều quan trọng cần rút ra là đừng để bị choáng ngợp bởi con số tuyệt đối

2515
02:23:08,581 --> 02:23:13,521
Bây giờ hãy để tôi thực hiện ./hello và nếu tôi gõ\n

2516
02:23:19,470 --> 02:23:24,091
Vâng, xin chào câu trả lời, bởi vì\n

2517
02:23:24,091 --> 02:23:26,671
Và hóa ra là nếu\nbạn chỉ viết "xin chào

2518
02:23:26,671 --> 02:23:29,611
trả lời" tất cả trong dấu ngoặc kép,\nbạn thực sự chỉ đang vượt qua

2519
02:23:29,611 --> 02:23:32,551
Tiếng Anh làm đầu vào\ncho hàm printf

2520
02:23:32,550 --> 02:23:34,470
bạn không thực sự\nchuyển vào biến.

2521
02:23:34,470 --> 02:23:37,320
Và thật không may là trong\nC, nó không hoàn toàn như vậy

2522
02:23:37,320 --> 02:23:40,861
dễ dàng cắm mọi thứ vào\nnhững thứ khác mà bạn đã nhập.

2523
02:23:40,861 --> 02:23:43,111
Hãy nhớ rằng trong Scratch\nkhông chỉ có khối Lưu

2524
02:23:43,111 --> 02:23:45,661
nhưng khối Tham gia,\nkhá đẹp

2525
02:23:45,661 --> 02:23:47,460
bạn có thể kết hợp táo và cam--

2526
02:23:48,900 --> 02:23:52,640
Sau đó chúng tôi đổi nó thành hello và sau đó\n

2527
02:23:52,640 --> 02:23:54,765
Trong C, cú pháp sẽ\nkhác một chút.

2528
02:23:54,765 --> 02:23:59,850
Bạn nói với máy tính bên trong\n của bạn

2529
02:23:59,851 --> 02:24:05,191
một phần giữ chỗ ở đó, cái gọi là\n

2530
02:24:05,191 --> 02:24:08,041
cuối cùng đặt một chuỗi ở đây.

2531
02:24:08,040 --> 02:24:12,661
Sau đó, ngoài dấu ngoặc kép của bạn, bạn\n

2532
02:24:12,661 --> 02:24:18,421
trong bất kỳ biến nào bạn muốn\n

2533
02:24:19,230 --> 02:24:23,671
Vì vậy, %s là mã định dạng\nđóng vai trò giữ chỗ.

2534
02:24:23,671 --> 02:24:26,431
Và bây giờ hàm printf\nđã được con người thiết kế từ nhiều năm nay

2535
02:24:26,431 --> 02:24:28,650
trước để tìm ra cách\nlàm quả táo và quả chuối

2536
02:24:28,650 --> 02:24:30,972
việc nối hai từ lại với nhau.

2537
02:24:30,972 --> 02:24:33,181
Nó gần như không thân thiện với người dùng\na như trong Scratch

2538
02:24:33,181 --> 02:24:35,701
nhưng đó là một mô hình rất phổ biến.

2539
02:24:35,700 --> 02:24:38,880
Vậy hãy để tôi thử chạy lại\ncái này ngay bây giờ. chào hỏi.

2540
02:24:42,630 --> 02:24:45,780
Nếu tôi gõ Enter bây giờ thì bây giờ là hello.

2541
02:24:46,351 --> 02:24:48,810
Và printf, đây là F trong printf.

2542
02:24:48,810 --> 02:24:53,581
Nó định dạng đầu vào cho bạn bằng cách sử dụng\n

2543
02:24:53,581 --> 02:24:58,201
chuỗi, được biểu thị lại bằng %s.

2544
02:24:58,200 --> 02:25:02,650
Vậy một câu hỏi nhanh nhé, nếu tôi tập trung\n

2545
02:25:02,650 --> 02:25:09,480
và thậm chí phóng to ở đây, bao nhiêu\n

2546
02:25:09,480 --> 02:25:13,501
Một lúc trước, tôi sẽ thừa nhận rằng đó là\n

2547
02:25:14,790 --> 02:25:19,980
Bạn có thể suy đoán rằng hiện tại printf đang sử dụng bao nhiêu đầu vào?

2548
02:25:20,521 --> 02:25:25,201
Và nó được ngụ ý bởi dấu phẩy ở đây,\n

2549
02:25:25,200 --> 02:25:29,310
trích dẫn, bỏ trích dẫn, "xin chào, %s"\ntừ câu thứ hai, trả lời.

2550
02:25:29,310 --> 02:25:32,730
Và sau đó chỉ để đảm bảo an toàn nhanh\nhãy kiểm tra ở đây, tại sao lại không phải là 3?

2551
02:25:32,730 --> 02:25:35,320
Vì rõ ràng có\nhai dấu phẩy ở đây.

2552
02:25:35,320 --> 02:25:38,280
Tại sao nó thực sự không phải là\n3 đối số hoặc đầu vào?

2553
02:25:43,001 --> 02:25:46,210
Dấu phẩy ở bên trái thực ra\nlà một phần ngữ pháp tiếng Anh của tôi

2554
02:25:47,693 --> 02:25:50,110
Và một lần nữa, đây chính là điểm\nviệc lập trình có thể gây nhầm lẫn

2555
02:25:50,111 --> 02:25:52,901
sớm vì chúng tôi đang sử dụng\n

2556
02:25:52,900 --> 02:25:55,730
những thứ khác nhau, nó chỉ\nphụ thuộc vào ngữ cảnh.

2557
02:25:55,730 --> 02:25:57,970
Và bây giờ thực sự là thời điểm tốt để chỉ ra

2558
02:25:57,970 --> 02:26:01,751
tất cả những màu sắc khá đẹp đó\n

2559
02:26:02,290 --> 02:26:06,040
mặc dù tôi không định chuyển sang một định dạng\n

2560
02:26:06,040 --> 02:26:08,990
Tôi chắc chắn không đổi\nmọi thứ thành màu đỏ, xanh hay gì đó--

2561
02:26:08,990 --> 02:26:13,900
đó là vì một trình soạn thảo văn bản như\n

2562
02:26:13,900 --> 02:26:17,050
Đây là một tính năng của rất nhiều tính năng khác nhau\n

2563
02:26:18,640 --> 02:26:23,020
Nếu trình soạn thảo văn bản của bạn hiểu được\n

2564
02:26:24,320 --> 02:26:28,700
nó làm nổi bật các màu khác nhau\n

2565
02:26:28,700 --> 02:26:31,870
Vì vậy, ví dụ: chuỗi và\ncâu trả lời ở đây có màu đen

2566
02:26:31,870 --> 02:26:35,827
nhưng get_string thì một hàm có dạng\nmàu vàng nâu khó chịu như thế này

2567
02:26:35,827 --> 02:26:38,411
ở đây ngay bây giờ, nhưng đó chỉ là\ncách nó hiển thị trên màn hình.

2568
02:26:38,411 --> 02:26:41,111
Tuy nhiên, sợi dây màu đỏ ở đây dường như đang nhảy vào tôi

2569
02:26:41,111 --> 02:26:42,791
và điều đó hơi hữu ích.

2570
02:26:44,113 --> 02:26:46,280
Điều đó thật tuyệt, bởi vì\nó đang lao vào tôi.

2571
02:26:46,281 --> 02:26:49,601
Vì vậy, nó chỉ sử dụng các màu khác\n

2572
02:26:49,601 --> 02:26:53,021
bật lên để bạn có thể tập trung vào\nnhững ý tưởng này liên quan với nhau như thế nào

2573
02:26:53,021 --> 02:26:55,121
và thành thật mà nói, khi bạn có thể mắc sai lầm.

2574
02:26:55,120 --> 02:26:58,030
Ví dụ: hãy để tôi vô tình\nbỏ lại câu trích dẫn này ở đây.

2575
02:26:58,031 --> 02:27:03,011
Và bây giờ đột nhiên,\nđể ý xem tôi có xóa trích dẫn không

2576
02:27:03,011 --> 02:27:05,711
màu sắc bắt đầu hơi lệch một chút.

2577
02:27:05,710 --> 02:27:09,640
Nhưng nếu tôi quay lại đó và đặt nó\n

2578
02:27:09,640 --> 02:27:11,470
Tính năng khác\ncủa trình soạn thảo văn bản này là gì?

2579
02:27:11,470 --> 02:27:15,251
Lưu ý khi con trỏ của tôi ở cạnh\ndấu ngoặc đơn này,

2580
02:27:15,251 --> 02:27:18,111
phân định điểm cuối của\đầu vào của hàm

2581
02:27:18,111 --> 02:27:21,611
thông báo được đánh dấu bằng màu xanh lá cây\n

2582
02:27:22,150 --> 02:27:24,237
Nó chỉ là một thứ hữu ích\nvề mặt hình ảnh, đặc biệt là khi

2583
02:27:24,237 --> 02:27:26,320
bạn bắt đầu viết ngày càng nhiều\nmã hơn, chỉ để tạo ra

2584
02:27:26,320 --> 02:27:28,240
chắc chắn dấu ngoặc đơn của bạn đang xếp hàng.

2585
02:27:28,240 --> 02:27:31,390
Và điều đó đúng với những dấu ngoặc nhọn này\n

2586
02:27:31,390 --> 02:27:33,011
Chúng ta sẽ quay lại với những điều đó trong giây lát.

2587
02:27:33,011 --> 02:27:36,820
Nếu tôi đặt con trỏ ở đó, bạn có thể\n

2588
02:27:37,700 --> 02:27:40,600
Vì vậy, nó không có gì trong mã của bạn\nvề cơ bản, nó chỉ là trình soạn thảo

2589
02:27:40,601 --> 02:27:42,911
đang cố gắng giúp đỡ bạn, con người, chương trình.

2590
02:27:42,911 --> 02:27:45,251
Và bạn thậm chí có thể nhìn thấy nó,\nmặc dù nó hơi khó nhìn thấy--

2591
02:27:45,251 --> 02:27:48,130
bạn có thấy bốn dấu chấm này ở đây\nvà bốn dấu chấm này ở đây không?

2592
02:27:49,691 --> 02:27:53,531
Tôi đã định cấu hình Mã VS thành\nindent bằng bốn dấu cách,

2593
02:27:54,761 --> 02:27:58,091
Bất cứ khi nào tôi nhấn phím Tab, điều này\ncũng có thể giúp bạn đảm bảo--

2594
02:27:58,091 --> 02:28:00,941
khi chúng ta có nhiều chương trình thú vị hơn\nvà dài hơn--

2595
02:28:00,941 --> 02:28:04,121
rằng mọi thứ đều được sắp xếp đẹp đẽ và gọn gàng.

2596
02:28:05,380 --> 02:28:07,390
Được rồi, bạn có câu hỏi\nvề printf hoặc nhiều hơn nữa không?

2597
02:28:08,653 --> 02:28:11,122
KHÁN GIẢ: [? Sẽ ?]\nprintf [KHÔNG NGHE ĐƯỢC]??

2598
02:28:11,122 --> 02:28:12,831
DAVID J. Malan: Câu trả lời ngắn gọn, vâng. printf

2599
02:28:12,831 --> 02:28:16,130
có thể xử lý nhiều\nloại biến hoặc giá trị.

2600
02:28:17,240 --> 02:28:20,671
Chúng ta sẽ thấy %i là một cái khác\nđể cắm một số nguyên.

2601
02:28:20,671 --> 02:28:24,261
Bạn có thể có nhiều i, nhiều\n

2602
02:28:24,261 --> 02:28:26,150
Chúng ta sẽ quay lại vấn đề đó\n một chút.

2603
02:28:26,150 --> 02:28:29,841
printf có thể cần nhiều\đối số hơn chỉ hai đối số này.

2604
02:28:29,841 --> 02:28:32,150
Điều này chỉ có nghĩa là mang tính đại diện.

2605
02:28:34,191 --> 02:28:36,201
Bạn có thể khai báo các biến\ntrong printf không?

2606
02:28:37,611 --> 02:28:39,651
Biến duy nhất tôi\nsử dụng ngay bây giờ là câu trả lời

2607
02:28:39,650 --> 02:28:43,251
và nó phải được thực hiện bên ngoài\n

2608
02:28:43,251 --> 02:28:46,310
Câu hỏi hay, chúng ta sẽ sớm thấy\nnhiều điều đó hơn.

2609
02:28:49,744 --> 02:28:51,911
DAVID J. Malan: Chúng ta\ntải xuống thư viện CS50 bằng cách nào?

2610
02:28:51,911 --> 02:28:55,091
Vì vậy, chúng tôi sẽ chỉ cho bạn trong các bài tập\nbộ 1 chính xác cách thực hiện điều đó.

2611
02:28:55,091 --> 02:28:58,421
Việc này sẽ tự động được thực hiện cho bạn trong\n

2612
02:28:58,421 --> 02:29:01,810
Cuối cùng, nếu bạn tự lập trình\n

2613
02:29:01,810 --> 02:29:03,700
bật, nó cũng có thể cài đặt trực tuyến.

2614
02:29:03,700 --> 02:29:07,073
Nhưng nếu bạn muốn hỏi điều đó\nqua trực tuyến hoặc sau đó

2615
02:29:07,074 --> 02:29:08,740
chúng tôi có thể chỉ cho bạn đi đúng hướng.

2616
02:29:13,341 --> 02:29:16,970
DAVID J. MALAN: Chuỗi là loại\n

2617
02:29:16,970 --> 02:29:19,100
kiểu dữ liệu của biến.

2618
02:29:19,101 --> 02:29:22,281
int là một từ khóa khác mà tôi đã ám chỉ\n

2619
02:29:22,281 --> 02:29:26,191
int, đối với số nguyên, sẽ là\n

2620
02:29:26,191 --> 02:29:27,441
KHÁN GIẢ: Được rồi. [? Cảm ơn. ?]

2621
02:29:29,691 --> 02:29:31,108
DAVID J. Malan: Ồ, câu hỏi hay.

2622
02:29:31,108 --> 02:29:34,970
Tôi có thể tiếp tục\ncắm chức năng này được không

2623
02:29:34,970 --> 02:29:39,261
giống như chúng tôi đã làm trong Scratch,\n

2624
02:29:39,261 --> 02:29:42,470
và chỉ cần làm điều này,\nnhớ lại, gợi nhớ đến những gì

2625
02:29:42,470 --> 02:29:45,921
Tôi đã thực hiện trong Scratch bằng cách đặt\nblock lên trên khối trên khối?

2626
02:29:48,271 --> 02:29:50,230
Tôi có thể đặt chuỗi trước get_string không?

2627
02:29:50,730 --> 02:29:53,700
Bạn chỉ đặt từ string\nin trước một biến

2628
02:29:55,200 --> 02:29:57,870
Và mặc dù có vẻ như tôi\nđã trả lời sai câu hỏi

2629
02:29:57,870 --> 02:30:01,710
hãy để tôi tiếp tục và thu nhỏ,\nslưu cái này, chào lại lần nữa.

2630
02:30:03,450 --> 02:30:06,180
Nếu tôi chạy ./hello, hãy nhập David, thì đấy.

2631
02:30:07,450 --> 02:30:10,390
Và thực ra thì hãy đi xuống\n

2632
02:30:10,390 --> 02:30:12,210
Rõ ràng là nó vẫn đúng--

2633
02:30:12,210 --> 02:30:14,610
ít nhất, dựa trên thử nghiệm hạn chế của tôi.

2634
02:30:14,611 --> 02:30:18,001
Cái này có được thiết kế tốt hơn hay được thiết kế tệ hơn không?

2635
02:30:18,001 --> 02:30:20,130
Hãy mở câu hỏi đó\nnhư chúng ta đã làm tuần trước.

2636
02:30:21,480 --> 02:30:23,820
Vâng, tôi đồng ý với điều đó.

2637
02:30:23,820 --> 02:30:26,011
Những người hợp lý có thể\không đồng ý, nhưng tôi thì có

2638
02:30:26,011 --> 02:30:29,970
đồng ý rằng việc này có vẻ khó hơn\n

2639
02:30:29,970 --> 02:30:32,438
nhưng đợi một chút. get_string\nis sẽ được sử dụng đầu tiên

2640
02:30:32,438 --> 02:30:34,271
và sau đó nó sẽ trả lại cho tôi một giá trị.

2641
02:30:34,271 --> 02:30:37,501
Vì vậy, vâng, có vẻ như sẽ hay hơn nếu đọc từ trên xuống dưới

2642
02:30:40,615 --> 02:30:44,611
Và điều này rất hữu ích nếu tôi chỉ muốn\n

2643
02:30:44,611 --> 02:30:47,774
Nếu tôi muốn sử dụng nó sau này trong một\nchương trình dài hơn thì tôi không gặp may rồi

2644
02:30:47,773 --> 02:30:49,440
và vì vậy tôi chưa lưu nó vào một biến.

2645
02:30:49,441 --> 02:30:53,041
Vì vậy, tôi nghĩ, nói tóm lại, chúng ta có thể tranh luận về vấn đề này cả ngày.

2646
02:30:53,040 --> 02:30:56,150
Nhưng trong trường hợp này, ồ, nếu bạn có thể\nđưa ra một lập luận hợp lý

2647
02:30:56,150 --> 02:30:59,240
Bằng cách này hay cách khác, đó\nlà một nền tảng khá vững chắc để đứng vững.

2648
02:30:59,240 --> 02:31:01,101
Nhưng, luôn luôn,\nnhững người có lý trí sẽ đi

2649
02:31:01,101 --> 02:31:05,641
không đồng ý, dù là lần đầu tiên\n

2650
02:31:05,640 --> 02:31:09,740
Vì vậy, hãy trình bày ví dụ cuối cùng này\n

2651
02:31:09,740 --> 02:31:11,380
việc lấy đầu vào và đầu ra.

2652
02:31:11,380 --> 02:31:13,130
Tất cả các chức năng mà chúng ta\nđã nói đến

2653
02:31:13,130 --> 02:31:17,720
lấy đầu vào, hay còn gọi là\n

2654
02:31:18,531 --> 02:31:21,740
Đó chỉ là từ ưa thích\nđể chỉ đầu vào của một hàm.

2655
02:31:21,740 --> 02:31:25,046
Và một số chức năng có\ntác dụng phụ, như chúng ta đã thấy--

2656
02:31:25,046 --> 02:31:27,171
in điều gì đó, nói\nđiều gì đó trên màn hình

2657
02:31:27,171 --> 02:31:28,911
về mặt trực quan hoặc nghe thấy--

2658
02:31:28,911 --> 02:31:33,921
hoặc chúng trả về một giá trị, đó là một\n

2659
02:31:35,251 --> 02:31:39,261
Nếu chúng ta nhìn lại những gì chúng ta đã làm lần trước\n

2660
02:31:39,261 --> 02:31:41,810
đầu vào là\ntên của bạn là gì, hàm này là hỏi

2661
02:31:41,810 --> 02:31:44,780
và giá trị trả về là câu trả lời.

2662
02:31:44,781 --> 02:31:49,521
Và bây giờ chúng ta hãy xem khối này,\n

2663
02:31:49,521 --> 02:31:51,266
phiên bản của những gì chúng tôi vừa làm với %s.

2664
02:31:51,266 --> 02:31:54,921
Tuần trước chúng tôi đã nói lưu, sau đó\ntham gia, sau đó xin chào và trả lời.

2665
02:31:54,921 --> 02:31:58,581
Nhưng điều thú vị ở đó\n

2666
02:31:58,581 --> 02:32:03,021
Thực tế là trong Scratch\n2, đầu ra của một hàm

2667
02:32:03,021 --> 02:32:08,150
giống như phép nối màu xanh lá cây, có thể trở thành\nđầu vào cho một hàm khác

2668
02:32:09,501 --> 02:32:12,470
Cú pháp trong C được thừa nhận là khá khác biệt

2669
02:32:12,470 --> 02:32:14,480
nhưng về cơ bản thì ý tưởng là giống nhau.

2670
02:32:14,480 --> 02:32:18,380
Tuy nhiên, ở đây chúng ta có\nhello, một phần giữ chỗ

2671
02:32:18,380 --> 02:32:21,890
nhưng chúng ta phải, trong thế giới\ncủa C này, nói với printf

2672
02:32:21,890 --> 02:32:25,110
những gì chúng tôi muốn thêm vào\ncho phần giữ chỗ đó.

2673
02:32:25,980 --> 02:32:27,147
Nhưng đó là cách để làm điều đó.

2674
02:32:27,147 --> 02:32:29,690
Khi chúng ta tiếp cận Python và\ncác ngôn ngữ khác trong học kỳ này

2675
02:32:29,691 --> 02:32:31,521
thực sự có nhiều cách dễ dàng hơn để làm điều này.

2676
02:32:31,521 --> 02:32:34,311
Nhưng đây là một mô hình\nrất phổ biến, đặc biệt khi

2677
02:32:34,310 --> 02:32:37,490
bạn muốn định dạng\ndữ liệu của mình theo một cách nào đó.

2678
02:32:37,490 --> 02:32:40,050
Được rồi, hãy quay lại nơi chúng ta đã bắt đầu

2679
02:32:40,050 --> 02:32:43,700
cùng với toàn bộ\nchương trình đó, có phần bao gồm

2680
02:32:43,700 --> 02:32:47,630
và nó có int main(void) và\nall của cú pháp khó hiểu khác này.

2681
02:32:47,630 --> 02:32:51,350
Bài cào này tuần trước\ngiống như một trò chơi bắt đầu

2682
02:32:51,351 --> 02:32:53,869
bất cứ khi nào bạn muốn có một\nphần chính trong chương trình của mình.

2683
02:32:53,869 --> 02:32:55,911
Đây không phải là cách duy nhất để\nbắt đầu chương trình Scratch.

2684
02:32:55,911 --> 02:32:59,181
Bạn có thể nghe tiếng nhấp chuột hoặc tiếng khác\n

2685
02:32:59,181 --> 02:33:03,831
Nhưng đây có lẽ là cái phổ biến nhất\n

2686
02:33:03,831 --> 02:33:07,478
Trong C, cách tương tự gần nhất\nlà viết ra điều này theo đúng nghĩa đen.

2687
02:33:07,478 --> 02:33:10,520
Cũng giống như tuần trước, nếu bạn\n

2688
02:33:10,521 --> 02:33:13,101
khi cờ xanh được nhấp vào,\na là lập trình viên C

2689
02:33:13,101 --> 02:33:15,771
điều đầu tiên bạn sẽ làm là\nsau khi tạo một tập tin trống

2690
02:33:15,771 --> 02:33:18,621
giống như tôi đã làm với hello.c,\nbạn có thể gõ int

2691
02:33:18,620 --> 02:33:22,040
main(void) mở xoăn\nbrace, đóng ngoặc nhọn

2692
02:33:22,040 --> 02:33:26,100
và sau đó bạn có thể đặt tất cả\n của mình

2693
02:33:26,101 --> 02:33:29,211
Giống như Scratch có\nbản chất từ tính này

2694
02:33:29,210 --> 02:33:33,530
tới đó nơi các mảnh ghép sẽ vỡ ra\n

2695
02:33:33,531 --> 02:33:38,240
có xu hướng sử dụng những dấu ngoặc nhọn này, một\n

2696
02:33:38,240 --> 02:33:41,480
Và bất cứ thứ gì bên trong\ncác dấu ngoặc nhọn đó, có thể nói như vậy

2697
02:33:41,480 --> 02:33:44,570
là một phần của mảnh ghép này, hay còn gọi là

2698
02:33:47,450 --> 02:33:50,840
Chúng ta đã đi xuống cái hang thỏ này cách đây không lâu\n

2699
02:33:50,841 --> 02:33:52,674
mặc dù tôi không gọi họ bằng cái tên này.

2700
02:33:52,674 --> 02:33:56,856
Nhưng, thực sự, khi chúng ta có cả\n

2701
02:33:56,855 --> 02:33:59,480
Chỉ cần nhấp vào một lá cờ xanh\nvà sau đó nói xin chào thế giới.

2702
02:34:00,681 --> 02:34:03,351
Xét cho cùng, nó phải rất thân thiện với người dùng và có đồ họa.

2703
02:34:03,351 --> 02:34:09,531
Tuy nhiên, trong C, về mặt kỹ thuật bạn không thể\n

2704
02:34:10,700 --> 02:34:16,340
Bởi vì, một lần nữa, bạn cần phải nói\n

2705
02:34:16,341 --> 02:34:22,041
mã mà người khác đã viết-- vậy nên\n

2706
02:34:22,040 --> 02:34:24,980
Bạn phải tải thư viện\nCS50 bất cứ khi nào

2707
02:34:24,980 --> 02:34:28,280
bạn muốn sử dụng các hàm get_string hoặc\nother, như get_int

2708
02:34:29,630 --> 02:34:32,690
Nếu không, trình biên dịch sẽ không biết get_string là gì.

2709
02:34:32,691 --> 02:34:35,011
Bạn chỉ cần làm theo cách này.

2710
02:34:35,011 --> 02:34:37,341
Tên tệp cụ thể\nTôi đang đề cập ở đây

2711
02:34:37,341 --> 02:34:44,310
stdio.h, cs50.h, là thứ mà các lập trình viên C\n

2712
02:34:44,310 --> 02:34:46,831
Cuối cùng chúng ta sẽ xem\bên trong những tệp đó có gì.

2713
02:34:46,831 --> 02:34:51,060
Nhưng tóm lại, nó giống như một cái thực đơn\n

2714
02:34:51,060 --> 02:34:54,560
Vì vậy, trong cs50.h, có một menu\nđề cập đến get_string, get_int

2715
02:34:56,150 --> 02:35:01,790
Và trong stdio.h, có một menu\n

2716
02:35:01,790 --> 02:35:04,640
Và menu đó\nchuẩn bị cho trình biên dịch

2717
02:35:04,640 --> 02:35:08,945
để biết cách triển khai\ncác chức năng tương tự.

2718
02:35:08,945 --> 02:35:10,310
Được rồi, tôi xin tạm dừng ở đây.

2719
02:35:16,960 --> 02:35:20,560
Một thư viện cung cấp tất cả\nchức năng mà chúng ta đang nói đến.

2720
02:35:20,560 --> 02:35:25,720
Tệp tiêu đề rất cụ thể\n

2721
02:35:25,720 --> 02:35:27,770
Và chúng ta sẽ thảo luận thêm về vấn đề này vào tuần tới.

2722
02:35:27,771 --> 02:35:30,161
Hiện tại, về cơ bản chúng\ngiống nhau nhưng chúng ta sẽ thảo luận

2723
02:35:30,161 --> 02:35:32,800
sắc thái giữa hai tuần tới.

2724
02:35:32,800 --> 02:35:36,460
Vâng, thư viện sẽ là tiêu chuẩn\nI/O. Thư viện sẽ CS50.

2725
02:35:36,460 --> 02:35:41,720
Tệp tiêu đề\n tương ứng là stdio.h, cs50.h.

2726
02:35:50,480 --> 02:35:54,230
cực kỳ phổ biến trong thế giới\n

2727
02:35:54,230 --> 02:35:59,300
nhưng trong C thì về mặt kỹ thuật thì không có\n

2728
02:35:59,300 --> 02:36:02,216
Chúng tôi đã nghĩ ra cách\nđể đơn giản hóa vài tuần đầu tiên.

2729
02:36:02,216 --> 02:36:05,091
Đó là bánh xe tập luyện mà chúng ta sẽ\n

2730
02:36:05,091 --> 02:36:09,411
lấy đi và chúng ta sẽ biết tại sao chúng ta\n

2731
02:36:09,411 --> 02:36:14,161
Bởi vì C làm ra mọi thứ\n

2732
02:36:14,161 --> 02:36:16,191
điều đó sẽ mang lại ích lợi lớn hơn cho chúng tôi.

2733
02:36:20,570 --> 02:36:23,480
Ngay từ đầu, bạn sẽ phải sử dụng bất cứ thứ gì\n

2734
02:36:23,480 --> 02:36:24,950
Điều đó sẽ bao gồm các chức năng của CS50.

2735
02:36:24,950 --> 02:36:28,190
Tóm lại là bạn đã giới thiệu, tôi\n

2736
02:36:28,191 --> 02:36:30,981
được gọi là scanf, chúng ta sẽ không nói về nó trong vài tuần.

2737
02:36:30,980 --> 02:36:36,710
Tóm lại, trong C thì khá dễ\n

2738
02:36:36,710 --> 02:36:40,310
Điều đáng chú ý là thực sự dễ dàng thực hiện điều đó một cách nguy hiểm.

2739
02:36:40,310 --> 02:36:45,110
Và C, vì đó là ngôn ngữ cũ\ncấp thấp hơn, có thể nói như vậy

2740
02:36:45,111 --> 02:36:49,431
điều đó mang lại cho bạn khá nhiều điều tuyệt vời\n

2741
02:36:49,431 --> 02:36:51,621
Rất dễ mắc sai lầm.

2742
02:36:51,620 --> 02:36:55,100
Và quả thực, đó cũng là lý do\ntại sao chúng tôi sử dụng thư viện

2743
02:36:55,101 --> 02:36:58,541
để mã của bạn không bị lỗi ngoài ý muốn.

2744
02:36:58,540 --> 02:37:01,620
Được rồi, với ý nghĩ này, chúng ta hiện đã lập bản đồ này

2745
02:37:01,620 --> 02:37:03,370
giữa phiên bản Scratch\n và phiên bản khác.

2746
02:37:03,370 --> 02:37:06,537
Hãy để tôi giới thiệu nhanh cho bạn\n

2747
02:37:06,538 --> 02:37:10,240
những loại mà học sinh sẽ bắt đầu coi là\n

2748
02:37:10,240 --> 02:37:13,511
Trong thế giới Linux, đây\nis là một danh sách không đầy đủ

2749
02:37:13,511 --> 02:37:16,810
các lệnh mà bạn sẽ nhận được\n

2750
02:37:16,810 --> 02:37:18,040
bằng cách chơi với các bộ vấn đề.

2751
02:37:18,040 --> 02:37:22,783
Cho đến nay, chúng tôi chỉ thấy hai trong số này\n, ls cho danh sách, rm cho những cái khác.

2752
02:37:22,783 --> 02:37:24,700
Nhưng tôi đề cập đến chúng bây giờ\nchỉ để nó không xảy ra

2753
02:37:24,700 --> 02:37:30,340
cảm thấy quá xa lạ khi bạn nhìn thấy họ\n

2754
02:37:30,341 --> 02:37:32,411
cp sẽ đại diện cho bản sao.

2755
02:37:32,411 --> 02:37:35,710
mkdir sẽ đại diện\ncho thư mục tạo. mv là

2756
02:37:35,710 --> 02:37:38,470
sẽ đại diện cho việc di chuyển hoặc đổi tên.

2757
02:37:38,470 --> 02:37:44,470
rmdir sẽ bị xóa thư mục,\n

2758
02:37:44,470 --> 02:37:46,960
và để tôi cho bạn xem cái này\ncái cuối cùng ở đây trước tiên

2759
02:37:46,960 --> 02:37:49,510
chỉ vì đó là thứ\nbạn sẽ sử dụng thường xuyên.

2760
02:37:49,511 --> 02:37:53,681
Nếu tôi quay lại mã của mình ở đây vào\n

2761
02:37:53,681 --> 02:37:58,091
và mở lại GUI nhỏ trên\n

2762
02:37:58,091 --> 02:38:01,451
tiết lộ rằng tôi có hai\ntệp, hello và hello.c

2763
02:38:01,450 --> 02:38:02,950
vì vậy không có gì thay đổi kể từ đó.

2764
02:38:02,950 --> 02:38:05,800
Giả sử bây giờ\na đã đến lớp được vài tuần

2765
02:38:05,800 --> 02:38:07,661
và tôi muốn bắt đầu\sắp xếp mã tôi đang

2766
02:38:07,661 --> 02:38:10,511
viết để tôi có một thư mục\ncho tuần này hoặc tuần tới

2767
02:38:10,511 --> 02:38:13,421
hoặc có thể là một thư mục cho\nbộ vấn đề 1, bộ vấn đề 2.

2768
02:38:15,130 --> 02:38:18,190
Trong GUI, tôi có thể lên\nđây và làm những gì hầu hết các bạn

2769
02:38:18,191 --> 02:38:19,961
sẽ thực hiện theo bản năng trên máy Mac hoặc PC.

2770
02:38:19,960 --> 02:38:22,450
Bạn tìm kiếm một\nbiểu tượng thư mục, bạn nhấp vào nó

2771
02:38:22,450 --> 02:38:25,960
rồi bạn đặt tên cho thư mục\n như PSet1, Enter.

2772
02:38:25,960 --> 02:38:28,690
Thì đấy, bạn đã có một thư mục có tên PSet1.

2773
02:38:28,691 --> 02:38:34,701
Tôi có thể xác nhận càng nhiều càng tốt bằng lệnh của mình\n

2774
02:38:34,700 --> 02:38:36,890
Làm cách nào tôi có thể liệt kê những gì có trong thư mục của mình?

2775
02:38:39,504 --> 02:38:41,421
và nó có màu xanh lá cây với\nasterisk vì đó là

2776
02:38:41,421 --> 02:38:43,581
chương trình có thể chạy được của tôi--

2777
02:38:43,581 --> 02:38:46,701
hello.c, đó là nguồn\ncode của tôi và bây giờ là PSet1 với dấu gạch chéo

2778
02:38:46,700 --> 02:38:50,030
ở cuối, điều này chỉ ngụ ý\nrằng đó thực sự là một thư mục.

2779
02:38:50,031 --> 02:38:52,321
Được rồi, tôi thực sự không muốn làm theo cách đó.

2780
02:38:52,320 --> 02:38:53,870
Tôi muốn làm điều đó cao cấp hơn.

2781
02:38:53,870 --> 02:38:57,530
Vì vậy, hãy để tôi tiếp tục và nhấp chuột phải\non PSet1, xóa vĩnh viễn.

2782
02:38:57,531 --> 02:38:59,711
Tôi nhận được một thông báo lỗi\nkhông thể đảo ngược đáng sợ.

2783
02:38:59,710 --> 02:39:01,460
Nhưng không có gì\ntrong đó nên không sao cả.

2784
02:39:01,460 --> 02:39:03,560
Bây giờ tôi đã xóa nó bằng GUI.

2785
02:39:03,560 --> 02:39:08,851
Nhưng bây giờ hãy để tôi tiếp tục và bắt đầu thực hiện\n

2786
02:39:08,851 --> 02:39:11,060
Và nếu bạn đang thắc mắc tại sao\nmọi thứ cứ biến mất

2787
02:39:11,060 --> 02:39:15,290
nếu bạn nhấn Control-L trong thiết bị đầu cuối của mình\n

2788
02:39:15,290 --> 02:39:18,470
nó sẽ xóa mọi thứ trước đó của bạn\n

2789
02:39:18,470 --> 02:39:20,595
Trong thực tế, bạn không cần\nlàm việc này thường xuyên.

2790
02:39:20,595 --> 02:39:23,480
Tôi làm điều đó chỉ để chúng ta\ntập trung vào các lệnh mới nhất của mình.

2791
02:39:23,480 --> 02:39:26,962
Nếu tôi làm vậy-- lệnh\nđể tạo một thư mục mới là gì?

2792
02:39:28,320 --> 02:39:30,540
DAVID J. Malan: Vâng, vậy\nmkdir, hãy tạo thư mục.

2793
02:39:32,251 --> 02:39:34,621
Và để ý ở bên trái, có PSet1 của tôi.

2794
02:39:34,620 --> 02:39:37,210
Nếu tôi muốn trở nên quá nhiệt tình một chút, hãy lên kế hoạch cho tuần tới

2795
02:39:39,120 --> 02:39:44,722
Giả sử bây giờ tôi muốn mở chúng\n

2796
02:39:44,722 --> 02:39:46,681
Tôi có thể nhấp đúp vào\nit như thế này và bạn sẽ

2797
02:39:46,681 --> 02:39:48,408
hãy xem mũi tên nhỏ này đang chuyển động.

2798
02:39:48,407 --> 02:39:51,490
Nó không làm gì cả vì có\n

2799
02:39:51,490 --> 02:39:55,050
Nhưng giả sử một lần nữa tôi muốn nhận được nhiều hơn\n

2800
02:39:55,050 --> 02:39:59,130
Lưu ý nếu bây giờ tôi gõ ls, tôi\nsẽ thấy cả bốn nội dung giống nhau.

2801
02:39:59,130 --> 02:40:05,820
Hãy để tôi thay đổi thư mục\nvới khoảng trống cd PSet1 Enter.

2802
02:40:05,820 --> 02:40:08,460
Và bây giờ hãy chú ý hai điều\nsẽ xảy ra.

2803
02:40:08,460 --> 02:40:14,070
Thứ nhất, lời nhắc của tôi đã thay đổi\nmột chút để nhắc nhở tôi đang ở đâu

2804
02:40:14,070 --> 02:40:17,730
chỉ để giữ cho tôi tỉnh táo để tôi không\n

2805
02:40:17,730 --> 02:40:21,610
Vì vậy, đây chỉ là lời nhắc nhở bằng hình ảnh\n

2806
02:40:21,611 --> 02:40:26,911
Nếu bây giờ tôi gõ ls,\ntôi sẽ thấy gì sau khi nhấn Enter?

2807
02:40:26,911 --> 02:40:29,591
Không có gì, vì cho đến nay tôi chỉ\ntạo các thư mục trống.

2808
02:40:31,050 --> 02:40:35,490
Nếu tôi muốn tạo một thư mục có tên\n

2809
02:40:35,490 --> 02:40:37,890
được gọi là Mario tuần này, tôi có thể làm điều đó.

2810
02:40:37,890 --> 02:40:40,530
Bây giờ nếu tôi gõ ls, có Mario.

2811
02:40:40,531 --> 02:40:42,871
Bây giờ nếu tôi thực hiện cd Mario,\nhãy chú ý rằng lời nhắc của tôi đang diễn ra

2812
02:40:42,870 --> 02:40:44,520
để thay đổi cho chính xác hơn một chút.

2813
02:40:47,191 --> 02:40:49,051
Và chú ý những gì đang xảy ra ở phía trên bên trái.

2814
02:40:49,050 --> 02:40:51,150
Hiện tại không có gì vì các\nthư mục này đã được thu gọn.

2815
02:40:51,150 --> 02:40:54,390
Nhưng nếu tôi nhấp vào hình tam giác\nnhỏ, tôi sẽ thấy Mario ở đó.

2816
02:40:54,390 --> 02:40:56,911
Không có gì xảy ra trong đó\nvì chưa có tệp nào.

2817
02:40:56,911 --> 02:41:00,810
Nhưng giả sử bây giờ tôi muốn\ntạo một tệp tên là mario.c.

2818
02:41:00,810 --> 02:41:04,770
Tôi có thể lên đây, tôi có thể nhấp vào\n

2819
02:41:04,771 --> 02:41:07,591
Hoặc tôi chỉ cần gõ mã mario.c.

2820
02:41:08,220 --> 02:41:10,082
Điều đó tạo ra một tab mới cho tôi.

2821
02:41:10,083 --> 02:41:13,291
Tôi sẽ không viết bất kỳ mã nào ở đây\n

2822
02:41:13,290 --> 02:41:16,950
Và bây giờ ở trên cùng bên trái, bạn sẽ\nthấy mario.c xuất hiện.

2823
02:41:16,950 --> 02:41:19,492
Vì vậy, tại một thời điểm nào đó, bạn có thể\cuối cùng chỉ cần đóng Explorer.

2824
02:41:19,493 --> 02:41:22,158
Bởi vì, một lần nữa, nó không cung cấp cho bạn bất kỳ thông tin mới nào.

2825
02:41:22,158 --> 02:41:23,970
Nó có thể thân thiện với\nngười dùng hơn, nhưng có

2826
02:41:23,970 --> 02:41:27,960
không có gì bạn không thể làm theo lệnh\n

2827
02:41:27,960 --> 02:41:29,880
Được rồi, nhưng bây giờ tôi đang bị mắc kẹt.

2828
02:41:29,880 --> 02:41:32,220
Làm cách nào để thoát khỏi thư mục này?

2829
02:41:32,220 --> 02:41:34,020
Trong thế giới Mac hoặc PC của tôi,\ncó lẽ tôi sẽ nhấp vào

2830
02:41:34,021 --> 02:41:37,320
nút Quay lại hoặc thứ gì đó tương tự\n

2831
02:41:37,320 --> 02:41:42,181
Trong cửa sổ terminal,\nTôi có thể thực hiện lệnh cd dot dot.

2832
02:41:42,181 --> 02:41:46,650
Dấu chấm là biệt hiệu, nếu bạn muốn, cho thư mục mẹ.

2833
02:41:46,650 --> 02:41:48,101
Đó là, thư mục trước đó.

2834
02:41:48,101 --> 02:41:52,601
Vì vậy nếu bây giờ tôi nhấn Enter, hãy chú ý rằng tôi\n

2835
02:41:52,601 --> 02:41:56,131
hay còn gọi là thư mục và\nbây giờ tôi quay lại PSet1.

2836
02:41:56,130 --> 02:42:00,240
Hoặc, nếu tôi muốn sang trọng, hãy để tôi\n

2837
02:42:00,240 --> 02:42:03,300
Nếu tôi gõ ls, sẽ có\nmario.c, chỉ để định hướng cho chúng tôi.

2838
02:42:03,300 --> 02:42:06,458
Nếu tôi muốn làm nhiều việc\na cùng một lúc, tôi có thể làm cd../..

2839
02:42:09,271 --> 02:42:13,021
tất cả sẽ đi từ cha mẹ tôi đến ông bà tôi chỉ trong một hơi thở.

2840
02:42:13,021 --> 02:42:16,541
Và thì đấy, bây giờ tôi đã trở lại thư mục\nmặc định của mình, nếu bạn muốn.

2841
02:42:16,540 --> 02:42:20,911
Và một mẹo nhỏ cuối cùng của\n

2842
02:42:20,911 --> 02:42:24,181
cách đây một lúc và bạn\nchỉ cảm thấy mệt mỏi với tất cả các thao tác điều hướng

2843
02:42:24,181 --> 02:42:26,881
nếu bạn chỉ cần gõ cd và\nhấn Enter, nó sẽ chuyển cho bạn

2844
02:42:26,880 --> 02:42:29,070
quay lại thư mục\n mặc định của bạn và bạn không có

2845
02:42:29,070 --> 02:42:31,320
phải lo lắng về việc đến đó bằng tay.

2846
02:42:31,320 --> 02:42:38,521
Tuy nhiên, hãy nhớ lại cách đây một chút rằng tôi\n

2847
02:42:38,521 --> 02:42:42,751
Nếu dấu chấm ám chỉ cha mẹ tôi,\ncó lẽ suy ra ở đây theo cú pháp

2848
02:42:42,751 --> 02:42:46,720
thay vào đó một dấu chấm có nghĩa là gì?

2849
02:42:46,720 --> 02:42:49,480
Nó có nghĩa là thư mục này,\nthư mục hiện tại của bạn.

2850
02:42:50,900 --> 02:42:52,993
Nó chỉ làm cho máy tính trở nên siêu\nrõ ràng

2851
02:42:52,993 --> 02:42:55,451
rằng tôi muốn chương trình có tên\nhello được cài đặt ở đây

2852
02:42:55,450 --> 02:42:59,500
có thể nói như vậy, không phải trong một thư mục ngẫu nhiên nào khác\không phải ổ cứng của tôi.

2853
02:42:59,501 --> 02:43:02,425
Thay vào đó tôi muốn cái ở ngay đây.

2854
02:43:02,425 --> 02:43:04,300
Được rồi, ngoài\nnhững lệnh này, còn có

2855
02:43:04,300 --> 02:43:06,452
sẽ là những người khác\nmà chúng ta gặp phải theo thời gian.

2856
02:43:06,452 --> 02:43:07,661
Đó là những điều cơ bản.

2857
02:43:07,661 --> 02:43:11,710
Điều đó cho phép bạn cai sữa\n

2858
02:43:11,710 --> 02:43:14,470
và bắt đầu sử dụng thoải mái hơn,\nvới sự luyện tập và thời gian

2859
02:43:14,470 --> 02:43:16,360
thay vào đó là giao diện dòng lệnh.

2860
02:43:16,361 --> 02:43:19,631
Vậy còn những\nloại khác, giờ đã quay lại thế giới của C thì sao?

2861
02:43:19,630 --> 02:43:23,950
Những lệnh đó không phải là C. Đó là\n

2862
02:43:23,950 --> 02:43:28,300
giao diện, giống như trong Linux,\n

2863
02:43:28,300 --> 02:43:30,310
Đó là một giải pháp thay thế\ncho Mac OS và Windows.

2864
02:43:30,310 --> 02:43:34,810
Trở lại thế giới của C bây giờ, chúng ta đã thấy các chuỗi, đó là các từ.

2865
02:43:34,810 --> 02:43:38,351
Tôi đã đề cập đến int hoặc số nguyên,\nnhưng còn có những thứ khác nữa.

2866
02:43:38,351 --> 02:43:42,581
Trong thế giới của C, chúng ta đã thấy chuỗi, chúng ta sẽ thấy int.

2867
02:43:42,581 --> 02:43:46,031
Nếu bạn muốn số nguyên lớn hơn thì có\n

2868
02:43:46,031 --> 02:43:49,451
Nếu bạn muốn có một ký tự đơn,\ncó một thứ gọi là ký tự.

2869
02:43:49,450 --> 02:43:53,680
Nếu bạn muốn một giá trị Boolean,\ntrue hay false, thì có một bool.

2870
02:43:53,681 --> 02:43:56,111
Và nếu bạn muốn một giá trị dấu phẩy động--

2871
02:43:56,111 --> 02:43:59,781
một cách nói hoa mỹ về số thực,\n

2872
02:43:59,781 --> 02:44:03,201
đó là cái mà C và\ncác ngôn ngữ khác gọi là float.

2873
02:44:03,200 --> 02:44:06,610
Và nếu bạn muốn nhiều số hơn nữa\nsau dấu thập phân

2874
02:44:06,611 --> 02:44:10,211
chính xác hơn, bạn có thể\nsử dụng thứ gọi là double.

2875
02:44:10,210 --> 02:44:14,020
Điều đó có nghĩa là, đây là một ví dụ\nan trong lập trình

2876
02:44:14,021 --> 02:44:17,681
bây giờ bạn có quyền cung cấp ở đâu\n

2877
02:44:17,681 --> 02:44:21,640
nó sẽ dựa vào đó để biết cái gì\n

2878
02:44:23,331 --> 02:44:26,621
Đó có phải là âm thanh, hình ảnh, màu sắc hay những thứ tương tự không?

2879
02:44:26,620 --> 02:44:30,970
Đây là các loại kiểu dữ liệu\n

2880
02:44:30,970 --> 02:44:35,800
Các chức năng đi kèm là gì\n

2881
02:44:35,800 --> 02:44:39,251
Chúng ta đã nói về I/O tiêu chuẩn và\n

2882
02:44:39,251 --> 02:44:42,911
Trong thư viện CS50, bạn có thể\nthấy nó tuân theo một mẫu.

2883
02:44:42,911 --> 02:44:45,581
Thư viện C50 phần lớn tồn tại\ntrong vài tuần đầu tiên

2884
02:44:45,581 --> 02:44:50,997
của lớp học để làm cho cuộc sống của chúng ta dễ dàng hơn\n

2885
02:44:50,997 --> 02:44:53,831
Vì vậy, nếu bạn muốn lấy một chuỗi,\n

2886
02:44:54,700 --> 02:44:57,742
Nếu bạn muốn lấy một số nguyên từ\n

2887
02:44:57,743 --> 02:45:01,091
Khi bạn muốn nhận được bất kỳ thứ gì trong số đó\n

2888
02:45:03,861 --> 02:45:06,221
Và thực sự chúng đều là\nchữ thường theo quy ước.

2889
02:45:07,331 --> 02:45:10,630
Nếu bây giờ chúng tôi có khả năng\nlưu trữ các loại dữ liệu khác nhau

2890
02:45:10,630 --> 02:45:13,751
và chúng tôi có các hàm\nđể lấy các loại dữ liệu khác nhau

2891
02:45:13,751 --> 02:45:16,841
bạn có thể in\ncác loại dữ liệu khác nhau bằng cách nào?

2892
02:45:16,841 --> 02:45:23,800
Chà, chúng ta đã thấy %s cho chuỗi,\n%i cho số nguyên, %c cho char

2893
02:45:23,800 --> 02:45:30,130
%f cho số float hoặc số double, những cái đó\n

2894
02:45:30,130 --> 02:45:33,760
và sau đó là %li cho số nguyên dài.

2895
02:45:33,761 --> 02:45:36,281
Đây là\nví dụ đầu tiên về sự không nhất quán.

2896
02:45:36,281 --> 02:45:38,981
Trong một thế giới lý tưởng, đó\nchỉ là %l và chúng ta sẽ tiếp tục.

2897
02:45:38,980 --> 02:45:42,940
Thay vào đó là %li trong trường hợp này.

2898
02:45:42,941 --> 02:45:45,701
Đó là printf và một số mã định dạng của nó.

2899
02:45:49,511 --> 02:45:51,858
không có ý định chơi chữ-- có cả đống toán tử.

2900
02:45:51,858 --> 02:45:54,191
Và thực sự, máy tính, một trong những điều đầu tiên họ làm

2901
02:45:54,191 --> 02:45:57,941
có rất nhiều phép toán và tính toán, vì vậy\n

2902
02:45:57,941 --> 02:46:01,161
Máy tính, và đến lượt C, thực sự giỏi về cộng, trừ

2903
02:46:01,161 --> 02:46:04,191
phép nhân, phép chia\nvà thậm chí cả dấu phần trăm

2904
02:46:04,191 --> 02:46:05,740
đó là toán tử còn lại.

2905
02:46:05,740 --> 02:46:08,650
Có một ký hiệu đặc biệt\nin C và các ngôn ngữ khác

2906
02:46:08,650 --> 02:46:13,161
chỉ để lấy phần còn lại, khi\n

2907
02:46:13,161 --> 02:46:18,911
Có những tính năng khác trên thế giới\n

2908
02:46:18,911 --> 02:46:22,931
Và còn có cả những gì\n

2909
02:46:22,931 --> 02:46:27,371
dần dần khiến việc viết ít ký tự hơn trở nên dễ dàng hơn\n

2910
02:46:27,370 --> 02:46:29,090
nhưng bày tỏ suy nghĩ của bạn như nhau.

2911
02:46:29,091 --> 02:46:33,470
Vì vậy, chỉ là một ví dụ\nvề điều này, như một ví dụ duy nhất

2912
02:46:33,470 --> 02:46:37,331
hãy xem xét việc sử dụng biến\na này vào tuần trước.

2913
02:46:37,331 --> 02:46:41,740
Trong Scratch đây là cách bạn có thể\n

2914
02:46:41,740 --> 02:46:43,960
Trong C, nó sẽ tương tự.

2915
02:46:43,960 --> 02:46:46,240
Nếu bạn muốn biến\nđược gọi là bộ đếm

2916
02:46:46,240 --> 02:46:49,540
bạn viết từ đếm theo đúng nghĩa đen,\n

2917
02:46:49,540 --> 02:46:53,350
Sau đó, bạn sử dụng phép gán\nooperator, hay còn gọi là dấu bằng

2918
02:46:53,351 --> 02:46:56,931
và bạn gán nó bất kể tên viết tắt của nó\n

2919
02:46:56,931 --> 02:47:01,001
Vì vậy, một lần nữa, số 0 sẽ được sao chép\n

2920
02:47:01,001 --> 02:47:02,990
vì dấu bằng duy nhất đó.

2921
02:47:02,990 --> 02:47:05,831
Nhưng thế này vẫn chưa đủ\nin C. Còn gì nữa

2922
02:47:05,831 --> 02:47:08,890
hiện đang bị thiếu ở phía bên phải\ntheo bản năng?

2923
02:47:08,890 --> 02:47:11,485
Ngay cả khi bạn chưa từng\nlập trình điều này trước đây.

2924
02:47:13,150 --> 02:47:14,775
DAVID J. Malan: Một dấu chấm phẩy ở cuối.

2925
02:47:14,775 --> 02:47:16,941
Và một điều nữa, tôi nghĩ, có lẽ còn thiếu.

2926
02:47:18,414 --> 02:47:19,581
DAVID J. Malan: Một kiểu dữ liệu.

2927
02:47:19,581 --> 02:47:22,671
Vậy nếu chúng ta có thể tiếp tục đi\nquay lại ở đây

2928
02:47:22,671 --> 02:47:26,320
loại dữ liệu nào có vẻ phù hợp\theo trực giác cho bộ đếm?

2929
02:47:27,431 --> 02:47:29,861
Vì vậy, thực sự, chúng ta cần\nnói cho máy tính biết khi nào

2930
02:47:29,861 --> 02:47:32,531
tạo một biến\nloại dữ liệu chúng ta muốn

2931
02:47:32,531 --> 02:47:35,721
và chúng ta cần kết thúc\nsuy nghĩ của mình bằng dấu chấm phẩy.

2932
02:47:35,720 --> 02:47:38,140
Vì vậy, có thể có một bản sao ở đó.

2933
02:47:38,140 --> 02:47:43,270
Còn trong Scratch thì sao nếu chúng ta muốn\n

2934
02:47:43,271 --> 02:47:45,671
Lần trước chúng tôi đã có mảnh ghép\npuzzle rất thân thiện với người dùng này

2935
02:47:45,671 --> 02:47:49,740
đó là thay đổi bộ đếm\nbằng 1 hoặc thêm 1 vào bộ đếm.

2936
02:47:49,740 --> 02:47:54,120
Trong C, đây là lúc mọi thứ trở nên thú vị hơn một chút.

2937
02:47:54,120 --> 02:47:58,110
Và bạn có thể làm điều này khá phổ biến\n

2938
02:47:59,310 --> 02:48:02,220
Và đây lại là nơi\n

2939
02:48:03,361 --> 02:48:05,341
Nếu không, điều này không có ý nghĩa.

2940
02:48:05,341 --> 02:48:08,251
bộ đếm không thể bằng\nbộ đếm cộng 1, phải không?

2941
02:48:08,251 --> 02:48:11,171
Điều đó không có tác dụng nếu chúng ta\nđang nói về số nguyên ở đây.

2942
02:48:11,171 --> 02:48:13,411
Đó là vì dấu bằng\n là phép gán.

2943
02:48:13,411 --> 02:48:15,751
Vì vậy chắc chắn đó có thể là trường hợp\n mà bạn tính toán

2944
02:48:15,751 --> 02:48:19,921
bộ đếm cộng 1, bất kể đó là gì,\n

2945
02:48:19,921 --> 02:48:22,871
từ phải sang trái là giá trị mới đó.

2946
02:48:22,870 --> 02:48:25,200
Điều này, như chúng ta sẽ thấy,\là một điều rất phổ biến

2947
02:48:25,200 --> 02:48:29,100
những việc cần làm trong lập trình chỉ là\n

2948
02:48:29,101 --> 02:48:30,931
Bạn có thể viết điều này ngắn gọn hơn.

2949
02:48:30,931 --> 02:48:34,711
Mã này ở đây là những gì chúng ta\ngọi là đường cú pháp, sắp xếp

2950
02:48:34,710 --> 02:48:39,540
của một cách nói hoa mỹ về điều tương tự\n

2951
02:48:40,320 --> 02:48:44,220
Điều này cũng thêm 1 hoặc bất cứ số\nbạn nhập vào đây

2952
02:48:44,220 --> 02:48:46,081
tới biến ở bên trái.

2953
02:48:46,081 --> 02:48:49,771
Và có một dạng cú pháp khác\n

2954
02:48:49,771 --> 02:48:51,601
và nó thậm chí còn ngắn gọn hơn thế này.

2955
02:48:51,601 --> 02:48:56,851
Điều đó cũng sẽ tăng bộ đếm lên 1\n

2956
02:48:56,851 --> 02:48:59,701
Hoặc nếu bạn đổi nó thành âm\nminus, thì trừ đi 1.

2957
02:48:59,700 --> 02:49:02,310
Bạn không thể làm điều đó với\n2 và 3 và 4, nhưng bạn

2958
02:49:02,310 --> 02:49:07,860
có thể làm điều đó theo mặc định chỉ với dấu cộng cộng\n

2959
02:49:12,611 --> 02:49:15,641
DAVID J. Malan: À, vậy khi bạn muốn\n

2960
02:49:15,640 --> 02:49:20,200
đã được tạo, như chúng tôi đã làm với\nmã trông như thế này

2961
02:49:20,200 --> 02:49:23,590
bạn không cần phải nhắc\nmáy tính kiểu dữ liệu là gì nữa.

2962
02:49:23,591 --> 02:49:27,220
May mắn thay, máy tính ít nhất cũng thông minh như vậy.

2963
02:49:27,220 --> 02:49:31,990
Nó sẽ ghi nhớ loại\ndữ liệu mà bạn dự định.

2964
02:49:31,990 --> 02:49:34,941
Các câu hỏi hoặc ý kiến ​​​​khác về điều này?

2965
02:49:34,941 --> 02:49:36,191
Được rồi, khá nhiều đấy.

2966
02:49:36,191 --> 02:49:38,570
Tại sao chúng ta không tiếp tục và\nở đây nghỉ giải lao 10 phút?

2967
02:49:38,570 --> 02:49:41,771
Và chúng tôi sẽ quay lại, chúng tôi sẽ\nbắt đầu viết một số mã.

2968
02:49:44,980 --> 02:49:48,581
Chúng ta vừa xem xét một số\nđiều cơ bản về biên dịch

2969
02:49:48,581 --> 02:49:50,335
ngay cả khi nó không có cảm giác cơ bản như vậy.

2970
02:49:50,335 --> 02:49:52,210
Nhưng bây giờ, chúng ta hãy thực sự\nbắt đầu tập trung thực sự

2971
02:49:52,210 --> 02:49:55,510
về việc viết ngày càng nhiều mã,\nngày càng thú vị hơn

2972
02:49:55,511 --> 02:49:58,701
mã, giống như chúng ta đã làm quen với Scratch tuần trước.

2973
02:49:58,700 --> 02:50:00,610
Vì vậy, ở đây tôi đã mở những mã này.

2974
02:50:01,570 --> 02:50:04,361
Tôi sẽ tập trung nhiều hơn vào\n của mình

2975
02:50:04,361 --> 02:50:07,444
Nhiều cách khác nhau để tôi có thể tạo mới\n

2976
02:50:08,511 --> 02:50:11,501
Vì vậy, một lần nữa, trong môi trường\môi trường này của VS Code

2977
02:50:11,501 --> 02:50:15,581
Tôi có thể viết mã theo đúng nghĩa đen\n

2978
02:50:15,581 --> 02:50:18,371
và nó chỉ tự động tạo một\ntệp mới cho tôi.

2979
02:50:18,370 --> 02:50:20,411
Hoặc tôi có thể làm điều đó trong GUI.

2980
02:50:20,411 --> 02:50:23,382
Tôi sẽ tiếp tục và tạo\ntệp này có tên là máy tính.c

2981
02:50:23,382 --> 02:50:25,841
và tôi sẽ tiếp tục\nbao gồm một số điều quen thuộc.

2982
02:50:25,841 --> 02:50:30,851
Vì vậy tôi sẽ tiếp tục và\n

2983
02:50:30,851 --> 02:50:33,911
Tôi sẽ tiếp tục từ\nbộ nhớ và thực hiện int void main--

2984
02:50:33,911 --> 02:50:38,248
nhiều hơn về điều đó vào tuần tới, tại sao vậy\n

2985
02:50:38,248 --> 02:50:40,540
Và bây giờ hãy để tôi thực hiện\na một máy tính rất đơn giản.

2986
02:50:40,540 --> 02:50:44,360
Chúng tôi đã thấy một số toán tử toán học, như dấu cộng và những thứ tương tự.

2987
02:50:45,861 --> 02:50:48,671
Vậy hãy để tôi tiếp tục và\nđầu tiên hãy cho mình một biến

2988
02:50:48,671 --> 02:50:52,480
được gọi là x, giống như môn toán hoặc đại số cấp lớp.

2989
02:50:52,480 --> 02:50:55,570
Hãy để tôi tiếp tục và\nghe một int, cái này mới

2990
02:50:55,570 --> 02:50:57,251
nhưng tôi đã đề cập đến điều này tồn tại.

2991
02:50:57,251 --> 02:51:00,640
Và sau đó hãy để tôi hỏi người dùng\n xem giá trị x của họ là bao nhiêu.

2992
02:51:00,640 --> 02:51:03,984
Nội dung trong dấu ngoặc kép\nchỉ là tiếng Anh hoặc chuỗi

2993
02:51:03,984 --> 02:51:06,650
mà tôi đang in trên màn hình.\nvì vậy tôi có thể nói bất cứ điều gì tôi muốn.

2994
02:51:06,650 --> 02:51:09,931
Tôi chỉ định nói x Colon\nđể nhắc người dùng tương ứng.

2995
02:51:09,931 --> 02:51:12,431
Bây giờ tôi sẽ tiếp tục và\nget một biến khác tên là y.

2996
02:51:13,630 --> 02:51:16,270
Và bây giờ, tôi sẽ\nnhắc người dùng về y.

2997
02:51:16,271 --> 02:51:18,551
Và tôi chỉ đang rất tỉ mỉ\nsử dụng một khoảng trống

2998
02:51:18,550 --> 02:51:22,030
để di chuyển con trỏ sao cho\ntrông nó không quá lộn xộn trên màn hình.

2999
02:51:22,031 --> 02:51:27,221
Và cuối cùng, hãy để tôi tiếp tục và\n

3000
02:51:27,220 --> 02:51:31,720
Trong một thế giới lý tưởng, tôi sẽ chỉ\nnói điều gì đó như printf x y.

3001
02:51:31,720 --> 02:51:36,640
Nhưng điều đó không hợp lệ trong C.\n

3002
02:51:36,640 --> 02:51:39,261
phải là một chuỗi trong dấu ngoặc kép.

3003
02:51:39,261 --> 02:51:43,060
Vì vậy, nếu tôi muốn in ra\ngiá trị của một số nguyên

3004
02:51:43,060 --> 02:51:47,320
Tôi cần đặt cái gì đó trong dấu ngoặc kép\n

3005
02:51:47,320 --> 02:51:49,220
nếu tôi cũng muốn di chuyển con trỏ.

3006
02:51:49,220 --> 02:51:51,640
Vì vậy, một lần nữa, chúng ta chỉ thoáng nhìn thoáng qua, nhưng sao

3007
02:51:51,640 --> 02:51:55,480
tôi có thể thay thế những dấu chấm hỏi này bằng\n không

3008
02:51:56,570 --> 02:51:57,980
DAVID J. Malan: Vâng, vậy %i.

3009
02:51:57,980 --> 02:52:00,591
Giống như %s là chuỗi, %i là số nguyên.

3010
02:52:02,361 --> 02:52:06,351
Và bây giờ nếu tôi muốn cộng x và y, for\n

3011
02:52:06,351 --> 02:52:09,771
không làm được gì nhiều\n

3012
02:52:11,341 --> 02:52:14,091
Và một lần nữa, nó trông chắc chắn\nkhó hiểu ngay từ cái nhìn đầu tiên.

3013
02:52:14,091 --> 02:52:16,490
Sẽ như thế nếu việc lập trình\nkhông khó hiểu thế này.

3014
02:52:16,490 --> 02:52:18,511
Các ngôn ngữ khác sẽ\ndọn dẹp phần này cho chúng tôi.

3015
02:52:18,511 --> 02:52:22,191
Nhưng, một lần nữa, nếu bạn tập trung vào\n

3016
02:52:22,191 --> 02:52:26,150
đó là một chuỗi định dạng bằng\ntiếng Anh hoặc bất kỳ ngôn ngữ nào

3017
02:52:27,591 --> 02:52:31,550
thì có thể sẽ cần nhiều\lý lẽ hơn sau dấu phẩy

3018
02:52:33,921 --> 02:52:36,800
Được rồi, hãy để tôi tiếp tục\nvà làm máy tính

3019
02:52:36,800 --> 02:52:41,300
một lần nữa, nó biên dịch\nmã nguồn của tôi trong C

3020
02:52:41,300 --> 02:52:44,480
như hình trên và chuyển đổi\nit thành máy tương ứng

3021
02:52:50,720 --> 02:52:53,841
Hãy làm 1 cộng 1 và Enter.

3022
02:52:54,681 --> 02:52:57,531
Bây giờ tôi đã có tác phẩm của một chiếc máy tính.

3023
02:52:57,531 --> 02:53:00,421
Bây giờ chúng ta hãy bắt đầu mày mò\nviệc này một chút.

3024
02:53:00,421 --> 02:53:02,271
Điều gì sẽ xảy ra nếu thay vào đó tôi đã làm điều này?

3025
02:53:02,271 --> 02:53:08,150
int z = x y rồi plug-in z vào đây.

3026
02:53:08,150 --> 02:53:14,841
Nếu tôi chạy lại máy tính, Enter,\n

3027
02:53:14,841 --> 02:53:20,791
vẫn bằng 2, và để tôi khẳng định điều đó\n

3028
02:53:20,790 --> 02:53:22,820
phiên bản nào trong số này\được thiết kế tốt hơn?

3029
02:53:22,820 --> 02:53:27,650
Nếu cả hai đều có vẻ đúng ở mức rất\n

3030
02:53:27,650 --> 02:53:30,710
hoặc là cái trước không có z?

3031
02:53:30,710 --> 02:53:34,190
Được rồi, cái này được cho là tốt hơn\n

3032
02:53:34,191 --> 02:53:36,501
biến được gọi là z mà tôi\nkhông chỉ in được mà còn, chết tiệt

3033
02:53:36,501 --> 02:53:39,300
nếu chương trình của tôi dài hơn,\ntôi có thể sử dụng nó ở nơi khác.

3034
02:53:42,272 --> 02:53:44,680
Có thể gây tranh cãi, như trước đây, vì\nit phụ thuộc vào ý định của tôi.

3035
02:53:44,681 --> 02:53:46,556
Và thành thật mà nói, tôi nghĩ\na lập luận khá hay

3036
02:53:46,556 --> 02:53:48,001
có thể được thực hiện cho phiên bản đầu tiên.

3037
02:53:48,001 --> 02:53:50,851
Bởi vì nếu tôi không có ý định-- như bạn lưu ý--

3038
02:53:50,851 --> 02:53:53,801
sử dụng lại biến đó\naga, bạn biết không?

3039
02:53:53,800 --> 02:53:55,800
Có lẽ tôi cũng nên làm\nviệc này, chỉ vì nó

3040
02:53:55,800 --> 02:53:57,331
bớt đi một điều phải suy nghĩ.

3041
02:53:58,441 --> 02:54:00,900
Cần phải hiểu ít hơn một dòng mã\n.

3042
02:54:02,040 --> 02:54:04,770
Vì vậy, ở đây, một lần nữa, điều đó\nphụ thuộc vào ý định của bạn.

3043
02:54:04,771 --> 02:54:07,021
Nhưng lĩnh vực này là khá hợp lý.

3044
02:54:07,021 --> 02:54:09,301
Và tôi nghĩ, như ai đó\nđã lưu ý trước đó, khi

3045
02:54:09,300 --> 02:54:13,411
Tôi đã làm điều tương tự với get_string,\n

3046
02:54:13,411 --> 02:54:16,335
s vì get_string và\ntên bạn bên trong nó là gì

3047
02:54:16,335 --> 02:54:17,460
nó chỉ dài hơn rất nhiều.

3048
02:54:17,460 --> 02:54:20,850
Nhưng x y, ờ, không khó lắm\nđể suy nghĩ về những gì

3049
02:54:20,851 --> 02:54:23,060
đang diễn ra bên trong đối số printf.

3050
02:54:23,060 --> 02:54:25,831
Vì vậy, một lần nữa, đây là những suy nghĩ\n hy vọng bạn sẽ

3051
02:54:25,831 --> 02:54:28,531
có được bản năng\không nhất thiết phải đạt được

3052
02:54:28,531 --> 02:54:30,990
câu trả lời giống như ai đó\khác, nhưng, một lần nữa, ý nghĩ

3053
02:54:30,990 --> 02:54:33,220
quá trình là những gì quan trọng ở đây.

3054
02:54:33,220 --> 02:54:36,180
Được rồi, vậy tôi có thể nâng cao\nchương trình này lên một chút bằng cách nào?

3055
02:54:36,181 --> 02:54:38,471
Chúng ta hãy nói về\nphong cách một lát.

3056
02:54:38,470 --> 02:54:42,990
Vậy x và y, ít nhất là trong trường hợp này,\n

3057
02:54:43,500 --> 02:54:45,750
Bởi vì đó là tên\nbiến thường dùng trong toán học

3058
02:54:45,750 --> 02:54:47,375
khi bạn cộng hai thứ lại với nhau.

3059
02:54:47,375 --> 02:54:48,909
Vì vậy x và y có vẻ khá hợp lý.

3060
02:54:48,909 --> 02:54:53,159
Lẽ ra tôi có thể làm điều gì đó như\nà, có lẽ biến đầu tiên của tôi

3061
02:54:53,159 --> 02:54:56,730
nên được gọi là số\nđầu tiên và biến tiếp theo của tôi

3062
02:54:56,730 --> 02:54:58,552
nên được gọi là số thứ hai.

3063
02:54:58,552 --> 02:55:00,511
Và rồi ở dưới đây, tôi\nsẽ phải thay đổi điều này

3064
02:55:00,511 --> 02:55:04,329
đến số thứ nhất cộng với số thứ hai.

3065
02:55:04,329 --> 02:55:07,050
Giống như, ồ, điều này thực sự không bổ sung thêm bất cứ điều gì về mặt ngữ nghĩa

3066
02:55:08,341 --> 02:55:11,230
Nhưng đó sẽ là một thứ khác\n

3067
02:55:11,230 --> 02:55:14,761
Vì vậy, nếu bạn có những ý tưởng rất đơn giản mà thông thường

3068
02:55:14,761 --> 02:55:18,790
được biểu thị bằng tên biến chung\n

3069
02:55:18,790 --> 02:55:22,591
Nếu tôi muốn chú thích chương trình này thì sao\n

3070
02:55:22,591 --> 02:55:25,381
Chà, tôi có thể thêm vào C\ncái được gọi là nhận xét.

3071
02:55:25,380 --> 02:55:30,030
Với một dấu gạch chéo, hai dấu gạch chéo về phía trước,\n

3072
02:55:32,579 --> 02:55:35,400
Và sau đó ở dưới đây, tôi có thể\nlàm điều gì đó như nhắc nhở người dùng

3073
02:55:35,400 --> 02:55:37,619
đối với y, chỉ để nhắc nhở bản thân tôi đang làm gì ở đó.

3074
02:55:37,620 --> 02:55:40,171
Và ở dưới đây, thực hiện phép cộng.

3075
02:55:40,171 --> 02:55:42,990
Bây giờ, trong trường hợp này, tôi\nkhông chắc những lệnh này thực sự

3076
02:55:44,101 --> 02:55:47,820
Bởi vì trong thời gian tôi phải viết\n

3077
02:55:47,820 --> 02:55:49,950
Lẽ ra tôi có thể vừa đọc\nba dòng mã đó.

3078
02:55:49,950 --> 02:55:52,890
Nhưng khi các chương trình của chúng tôi\ng trở nên phức tạp hơn

3079
02:55:52,890 --> 02:55:55,548
và bạn bắt đầu tìm hiểu thêm cú pháp--

3080
02:55:55,549 --> 02:55:58,091
điều đó, thành thật mà nói, bạn có thể quên\nngày hôm sau, tuần sau

3081
02:55:58,091 --> 02:56:01,890
tháng tới-- có thể hữu ích\n

3082
02:56:01,890 --> 02:56:04,681
nhắc nhở bạn về những gì\ncode của bạn đang làm hoặc thậm chí có thể

3083
02:56:06,421 --> 02:56:09,329
Với những chương trình ban đầu này,\nkhông thực sự cần thiết

3084
02:56:09,329 --> 02:56:11,671
không thực sự bổ sung nhiều\nnhiều điều đó vào sự hiểu biết của chúng tôi

3085
02:56:11,671 --> 02:56:14,159
nhưng đó là một cơ chế\nbạn có sẵn để

3086
02:56:14,159 --> 02:56:18,060
có thể giúp bạn thực sự nhắc nhở\nchính mình hoặc nhắc nhở ai đó

3087
02:56:18,060 --> 02:56:20,279
nếu không thì chuyện gì đang xảy ra vậy.

3088
02:56:20,279 --> 02:56:23,070
Thôi để tôi tiếp tục và chạy lại\n

3089
02:56:24,431 --> 02:56:27,001
Và ở đây, bạn có thể\nnghĩ rằng tôi đang gõ nhanh điên cuồng--

3090
02:56:28,771 --> 02:56:32,201
Hóa ra\nLinux, hệ điều hành

3091
02:56:32,200 --> 02:56:33,510
chúng tôi đang sử dụng ở đây trên đám mây--

3092
02:56:33,511 --> 02:56:36,961
nhưng trên thực tế, Windows và Mac\nOS ngày nay cũng hỗ trợ tính năng này--

3093
02:56:38,800 --> 02:56:42,300
Vì vậy, nếu bạn chỉ có một\nchương trình bắt đầu bằng C-A-L

3094
02:56:42,300 --> 02:56:45,210
bạn không cần phải viết xong\n

3095
02:56:45,210 --> 02:56:47,770
và máy tính sẽ\nhoàn thành suy nghĩ của bạn cho bạn.

3096
02:56:47,771 --> 02:56:51,931
Điều khác bạn có thể làm là\nnếu bạn nhấn Lên và tiếp tục đi lên

3097
02:56:51,931 --> 02:56:54,424
bạn sẽ cuộn qua\ntoàn bộ lịch sử lệnh của mình.

3098
02:56:54,424 --> 02:56:56,341
Vì vậy, tôi cũng\nđã lưu một số lần nhấn phím

3099
02:56:56,341 --> 02:56:59,174
bằng cách nhấn Lên nhanh thay vì\n

3100
02:56:59,831 --> 02:57:02,130
Vì vậy, một lần nữa, chỉ là\nmột chút tiện lợi khác

3101
02:57:02,130 --> 02:57:05,911
để lập trình và tương tác với\n

3102
02:57:05,911 --> 02:57:09,281
Được rồi, hãy để tôi tiếp tục và thực hiện\n

3103
02:57:09,281 --> 02:57:11,131
Các ý kiến ​​không có tác động chức năng.

3104
02:57:11,130 --> 02:57:13,230
Những thứ màu xanh này\nchỉ là những ghi chú cho bản thân.

3105
02:57:13,230 --> 02:57:15,421
Hãy để tôi chạy máy tính với\ncó lẽ-- thế này thì sao?

3106
02:57:15,421 --> 02:57:19,441
Thay vì 1 cộng 1,\nkhoảng 1 tỷ--

3107
02:57:22,004 --> 02:57:23,171
rất tiếc, chúng ta hãy làm điều đó một lần nữa.

3108
02:57:24,460 --> 02:57:30,175
1 triệu, 1 tỷ và 1\n khác

3109
02:57:30,175 --> 02:57:31,550
Được rồi, điều đó có vẻ đúng.

3110
02:57:31,550 --> 02:57:33,092
Hãy chạy chương trình này một lần nữa.

3111
02:57:33,093 --> 02:57:39,281
Thế còn 2 tỷ\ncộng thêm 2 tỷ nữa thì sao?

3112
02:57:42,120 --> 02:57:45,120
Vì vậy, rõ ràng, nó không quá chính xác.

3113
02:57:45,120 --> 02:57:49,590
Và rõ ràng, chạy 1 cộng 1 là\n

3114
02:57:50,550 --> 02:57:53,235
Điều gì có thể đã xảy ra?

3115
02:57:53,236 --> 02:57:54,361
Điều gì có thể đã xảy ra?

3116
02:57:58,341 --> 02:58:00,511
Máy tính có thể đã\n\nhết dung lượng bit.

3117
02:58:00,511 --> 02:58:05,271
Hóa ra với những kiểu dữ liệu này--\n

3118
02:58:05,271 --> 02:58:09,650
và cả float và char và những thứ đó\n

3119
02:58:09,650 --> 02:58:13,280
và quan trọng nhất là số lượng\n hữu hạn để biểu diễn chúng.

3120
02:58:14,960 --> 02:58:18,890
Máy tính mới hơn sử dụng nhiều bit hơn, cũ hơn\n

3121
02:58:18,890 --> 02:58:21,841
Nó không nhất thiết phải được chuẩn hóa\ncho tất cả các loại dữ liệu này.

3122
02:58:21,841 --> 02:58:28,161
Nhưng trong trường hợp này, trong môi trường này,\n

3123
02:58:28,835 --> 02:58:30,980
Vì vậy, với 32 bit, bạn\ncó thể đếm khá cao.

3124
02:58:30,980 --> 02:58:34,161
Đây là 64 bóng đèn trên sân khấu\nvà có thể còn cao hơn nữa.

3125
02:58:34,161 --> 02:58:38,331
Một int chỉ sử dụng một nửa trong số này, hoặc\n

3126
02:58:38,331 --> 02:58:42,351
Bây giờ, nếu bạn nghĩ lại tuần trước,\n

3127
02:58:42,351 --> 02:58:47,371
Và nếu bạn có 8 bit, 8 số 0 và\n

3128
02:58:47,370 --> 02:58:49,700
chỉ là một con số hay để\nthường nhớ như một chuyện vặt vãnh.

3129
02:58:49,700 --> 02:58:53,540
8 bit cung cấp cho bạn 256\nhoán vị của số 0 và số 1.

3130
02:58:53,540 --> 02:58:57,440
32 cho bạn biết\nkhoảng bao nhiêu, nếu có ai biết?

3131
02:58:59,841 --> 02:59:02,511
Vậy nó xấp xỉ 4 tỷ, 2 mũ 32.

3132
02:59:02,511 --> 02:59:04,310
Nếu bạn không biết điều đó thì cũng không sao.

3133
02:59:04,310 --> 02:59:07,310
Tuy nhiên, cuối cùng thì hầu hết các lập trình viên\n

3134
02:59:10,790 --> 02:59:13,880
2 tỷ cộng 2 tỷ\là 4 tỷ.

3135
02:59:13,880 --> 02:59:17,960
Và số đó thực sự phải\nvừa với số nguyên 32 bit.

3136
02:59:17,960 --> 02:59:20,751
Điều đáng chú ý là máy Mac của tôi,\nPC của bạn và những thứ tương tự

3137
02:59:20,751 --> 02:59:22,791
cũng muốn hỗ trợ số âm.

3138
02:59:22,790 --> 02:59:26,150
Và nếu bạn muốn ủng hộ cả hai điều tích cực\n

3139
02:59:26,150 --> 02:59:29,271
nghĩa là với số nguyên 32-bit,\nbạn có thể tính là cao

3140
02:59:29,271 --> 02:59:33,543
khoảng 2 tỷ dương\cũng không phải 2 tỷ âm

3141
02:59:34,501 --> 02:59:38,060
Vẫn là 4 tỷ, cho hay nhận, nhưng chỉ bằng một nửa thôi

3142
02:59:38,060 --> 02:59:39,661
theo hướng này hay hướng khác.

3143
02:59:39,661 --> 02:59:44,210
Vậy làm cách nào tôi có thể triển khai\na máy tính chính xác ở đây?

3144
02:59:47,601 --> 02:59:50,181
Vâng, không chỉ li,\nmà dành cho số nguyên dài.

3145
02:59:50,181 --> 02:59:54,631
Tôi phải thực hiện thêm một thay đổi nữa,\n

3146
02:59:54,630 --> 02:59:59,090
Vậy hãy để tôi quay lại đây và thay đổi\n

3147
03:00:00,230 --> 03:00:02,400
Và sau đó hãy để tôi thay đổi y.

3148
03:00:02,400 --> 03:00:05,900
Và sau đó hãy để tôi thay đổi mã định dạng\n

3149
03:00:07,970 --> 03:00:10,581
Hãy để tôi biên dịch lại máy tính--

3150
03:00:14,060 --> 03:00:15,601
Điều đó rõ ràng là giống nhau.

3151
03:00:15,601 --> 03:00:20,701
Bây giờ hãy làm 2 tỷ\nvà 2 tỷ nữa

3152
03:00:20,700 --> 03:00:22,330
và vượt qua các ngón tay của chúng tôi lần này.

3153
03:00:22,331 --> 03:00:24,720
Bây giờ chúng tôi đang đếm tới 4 tỷ.

3154
03:00:24,720 --> 03:00:27,870
Và chúng tôi có thể đạt được mức cao hơn\n4 tỷ, nhưng chúng tôi chỉ

3155
03:00:27,870 --> 03:00:29,760
đá cái lon xuống phố một chút.

3156
03:00:29,761 --> 03:00:31,261
Mặc dù chúng tôi hiện đang sử dụng--

3157
03:00:32,431 --> 03:00:37,781
64 bit, dài bằng thế này\n

3158
03:00:37,781 --> 03:00:40,381
Nó có thể là một giá trị\n thực sự lớn nhưng vẫn hữu hạn.

3159
03:00:40,380 --> 03:00:42,810
Và chúng ta sẽ quay lại vào\ncuối ngày hôm nay với những chủ đề này

3160
03:00:44,040 --> 03:00:48,310
Bởi vì có thể nói bây giờ, máy tính của tôi\n

3161
03:00:48,310 --> 03:00:51,280
hàng tỷ đầu vào có thể nhưng không phải tất cả.

3162
03:00:51,281 --> 03:00:53,401
Và đó là vấn đề\nnếu bạn thực sự muốn

3163
03:00:53,400 --> 03:00:58,740
sử dụng máy tính của tôi cho bất kỳ\nđầu vào nào có thể, không chỉ

3164
03:00:58,740 --> 03:01:03,300
những cái gần như nhỏ hơn,\n

3165
03:01:03,300 --> 03:01:05,292
Được rồi, có câu hỏi nào về điều đó không?

3166
03:01:05,292 --> 03:01:07,501
Nhưng thực chất nó chỉ là tiền thân cho mọi vấn đề

3167
03:01:07,501 --> 03:01:10,505
mà chúng ta sẽ phải giải quyết sau này.

3168
03:01:15,688 --> 03:01:17,021
DAVID J. Malan: Một câu hỏi hay.

3169
03:01:17,261 --> 03:01:20,351
Nếu chúng tôi vẫn đang sử dụng z, chúng tôi sẽ\n

3170
03:01:20,351 --> 03:01:23,471
Nếu không, chúng ta sẽ bỏ qua\n32 bit mà

3171
03:01:23,470 --> 03:01:25,990
đã được thêm vào với nhau qua thời gian dài.

3172
03:01:27,831 --> 03:01:32,351
Được rồi, vậy chúng ta thêm gia vị vào nhé\n

3173
03:01:32,351 --> 03:01:35,711
thế còn thứ gì đó\nvới một số điều kiện thì sao?

3174
03:01:35,710 --> 03:01:37,630
Hãy bắt đầu hỏi\nmột số câu hỏi thực tế.

3175
03:01:37,630 --> 03:01:44,090
Vì vậy, một lúc trước, hãy nhớ lại rằng chúng ta đã có\n

3176
03:01:44,091 --> 03:01:46,091
Bây giờ chúng ta hãy nhìn lại\nđiều gì đó trong Scratch mà

3177
03:01:46,091 --> 03:01:48,632
trông hơi giống\nthế này, một đống mảnh ghép

3178
03:01:48,632 --> 03:01:50,710
đặt câu hỏi bằng cách\no những câu điều kiện này

3179
03:01:50,710 --> 03:01:53,710
và sau đó là các biểu thức Boolean\n

3180
03:01:55,240 --> 03:01:58,300
Trong C, điều này thực sự được lập bản đồ khá rõ ràng.

3181
03:01:58,300 --> 03:02:02,290
Từ trái sang phải trông gọn gàng hơn nhiều\n

3182
03:02:02,290 --> 03:02:04,990
Ở đây, chúng ta chỉ có mã\ntrông như thế này.

3183
03:02:04,990 --> 03:02:09,251
Nếu, một khoảng trắng, hai dấu ngoặc đơn\nand thì x nhỏ hơn y

3184
03:02:09,251 --> 03:02:12,224
và sau đó chúng ta có thứ gì đó như\nprintf ở giữa.

3185
03:02:12,224 --> 03:02:14,140
Vì vậy, đây thực sự là\nmột bản đồ hay.

3186
03:02:14,140 --> 03:02:16,511
Để ý rằng, giống như\nmảnh ghép màu vàng trong Scratch

3187
03:02:16,511 --> 03:02:18,644
kiểu như đang ôm mảnh ghép\nmàu tím

3188
03:02:18,644 --> 03:02:21,310
đó thực sự là vai trò của những dấu ngoặc nhọn này.

3189
03:02:21,310 --> 03:02:24,700
Chúng gần như đóng gói\ntất cả mã ở bên trong.

3190
03:02:24,700 --> 03:02:27,850
Các dấu ngoặc đơn biểu thị\nbiểu thức Boolean

3191
03:02:27,851 --> 03:02:32,411
cần được hỏi và trả lời\n

3192
03:02:32,411 --> 03:02:34,841
Và đây là một ngoại lệ đối với\nnhững gì tôi đã đề cập trước đó.

3193
03:02:34,841 --> 03:02:38,890
Thông thường, khi bạn nhìn thấy một từ và\nsau đó là dấu ngoặc đơn, điều gì đó

3194
03:02:38,890 --> 03:02:42,130
và sau đó là dấu ngoặc đơn đóng, tôi\n

3195
03:02:42,130 --> 03:02:44,320
Và tôi vẫn cảm thấy khá\ntốt về tuyên bố đó.

3196
03:02:45,761 --> 03:02:48,281
Và từ nếu không phải là một hàm.

3197
03:02:48,281 --> 03:02:50,501
Nó chỉ là một cấu trúc lập trình.

3198
03:02:50,501 --> 03:02:55,421
Đó là một tính năng của ngôn ngữ C\n

3199
03:02:55,421 --> 03:02:58,001
cho các mục đích khác nhau\ncho một biểu thức Boolean.

3200
03:02:58,001 --> 03:02:59,411
Làm thế nào về một cái gì đó như thế này?

3201
03:02:59,411 --> 03:03:02,501
Tuần trước, nếu bạn muốn\ncó một ngã ba đường

3202
03:03:02,501 --> 03:03:05,501
đi theo hướng này hay hướng kia,\nbạn có thể có nếu và ngược lại.

3203
03:03:05,501 --> 03:03:08,091
Trong C, nó sẽ trông giống như thế này.

3204
03:03:08,091 --> 03:03:11,111
Và nếu chúng ta thêm vào printf,\nit bây giờ trông khá giống nhau

3205
03:03:11,111 --> 03:03:15,041
nhưng tất nhiên là nó thêm từ khác\n

3206
03:03:15,040 --> 03:03:21,190
Ngoài ra, trong C, nó không hoàn toàn đúng\n

3207
03:03:21,191 --> 03:03:25,781
nếu bạn chỉ có một dòng\nom mã được thụt vào bên dưới.

3208
03:03:25,781 --> 03:03:30,068
Tuy nhiên, để có cách thực hành tốt nhất, hãy làm như vậy,\n

3209
03:03:30,067 --> 03:03:31,900
và cuối cùng là bất kỳ ai\khác đang đọc mã của bạn

3210
03:03:31,900 --> 03:03:35,411
mà bạn có ý định làm điều đó\n

3211
03:03:35,411 --> 03:03:37,060
Thế còn chuyện này từ tuần trước thì sao?

3212
03:03:37,060 --> 03:03:38,681
Đây là một ngã ba đường.

3213
03:03:38,681 --> 03:03:45,073
Nếu x nhỏ hơn y, ngược lại nếu x là\n

3214
03:03:45,073 --> 03:03:47,531
Bây giờ, đây là nơi bạn có một số\khác biệt giữa Scratch

3215
03:03:47,531 --> 03:03:52,751
và C. Scratch sử dụng dấu bằng\n

3216
03:03:52,751 --> 03:03:55,841
C sử dụng một dấu bằng\nđể gán từ bên phải

3217
03:03:55,841 --> 03:03:58,611
sang trái, có sự khác biệt nhỏ\ngiữa hai thế giới.

3218
03:03:58,611 --> 03:04:02,831
Trong C, chúng ta có thể triển khai tương tự\n

3219
03:04:02,831 --> 03:04:04,331
chỉ cái này bổ sung khác nếu.

3220
03:04:04,331 --> 03:04:08,695
Và nếu chúng ta thêm vào printf, nó\n

3221
03:04:08,695 --> 03:04:12,460
Điều này đúng cả trong thế giới\nScratch và thế giới C.

3222
03:04:12,460 --> 03:04:16,420
Nhưng liệu ai đó có thể khẳng định rằng\n

3223
03:04:18,581 --> 03:04:21,730
Ít nhất chúng ta cần cái khác,\nnhưng chúng ta không cần cái if cuối cùng.

3224
03:04:21,730 --> 03:04:24,220
Bởi vì, ít nhất là trong\nthế giới so sánh các số nguyên

3225
03:04:24,220 --> 03:04:27,220
nó sẽ nhỏ hơn\nhơn, lớn hơn hoặc bằng.

3226
03:04:28,730 --> 03:04:31,331
Vì vậy, bạn có thể tiết kiệm vài\ngiây, nếu bạn muốn

3227
03:04:31,331 --> 03:04:35,380
chương trình của bạn đang chạy-- trong nháy mắt\n

3228
03:04:35,380 --> 03:04:37,870
và sau đó suy ra câu trả lời\ncho câu thứ ba

3229
03:04:37,870 --> 03:04:41,480
ở đây chắc hẳn là do bản chất logic của con người bạn.

3230
03:04:41,480 --> 03:04:42,820
Bây giờ, tại sao đó là một điều tốt?

3231
03:04:42,820 --> 03:04:46,570
Ví dụ: nếu x và y\nh xảy ra bằng nhau--

3232
03:04:46,570 --> 03:04:51,341
Tôi gõ 1 và 1 cho cả hai giá trị,\n

3233
03:04:51,341 --> 03:04:55,570
trong trường hợp của phiên bản này,\nbạn thật ngu ngốc

3234
03:04:55,570 --> 03:04:59,021
hỏi ba câu hỏi,\ntất cả đều sẽ được hỏi

3235
03:04:59,021 --> 03:05:02,320
mặc dù câu trả lời là không, không, có.

3236
03:05:05,800 --> 03:05:09,640
Điều đó có vẻ không cần thiết vì\n

3237
03:05:09,640 --> 03:05:13,450
loại bỏ nếu và\n không cần thiết

3238
03:05:13,450 --> 03:05:16,480
ngược lại in ra x bằng y--

3239
03:05:16,480 --> 03:05:20,960
bây giờ nếu x thực sự bằng y vì\n

3240
03:05:20,960 --> 03:05:26,200
bây giờ bạn sẽ chỉ hỏi hai\n

3241
03:05:26,200 --> 03:05:29,480
và sau đó bạn sẽ nhận được\nkết quả đúng như vậy.

3242
03:05:29,480 --> 03:05:32,140
Vì vậy, một lần nữa, một chi tiết nhỏ,\nnhưng, một lần nữa, những thứ

3243
03:05:32,140 --> 03:05:33,849
bạn nên nghĩ\nvề, không chỉ như

3244
03:05:33,849 --> 03:05:36,431
bạn viết mã của mình cho\nđúng nhưng cũng viết

3245
03:05:36,431 --> 03:05:38,831
nó cũng phải được thiết kế tốt.

3246
03:05:38,831 --> 03:05:41,081
Được rồi, vậy tại sao chúng ta không tiếp tục dịch nó

3247
03:05:41,081 --> 03:05:44,650
vào bối cảnh của một\chương trình thực tế ở đây?

3248
03:05:44,650 --> 03:05:46,570
Tôi sẽ tạo một cửa sổ trống ở đây.

3249
03:05:46,570 --> 03:05:50,441
Và hãy làm điều gì đó với điểm,\n

3250
03:05:51,521 --> 03:05:54,641
Hãy để tôi tiếp tục và\nchạy mã điểm.c.

3251
03:05:54,640 --> 03:05:56,710
Việc đó sẽ cung cấp cho tôi một tệp văn bản mới.

3252
03:05:56,710 --> 03:06:00,760
Và sau đó lên đây, tôi sẽ\nlàm như thường lệ, bao gồm cs50.h.

3253
03:06:04,781 --> 03:06:08,231
Có thể nói, có rất nhiều bản soạn sẵn trong các chương trình ban đầu này.

3254
03:06:09,521 --> 03:06:12,820
Hãy hỏi người dùng xem họ đã\n được bao nhiêu điểm

3255
03:06:12,820 --> 03:06:15,060
thua trên PS50 PSet gần đây nhất của họ?

3256
03:06:15,060 --> 03:06:19,040
Vì vậy, nó gợi lên bức ảnh của tôi về\n

3257
03:06:19,040 --> 03:06:20,690
nơi mà bản thân tôi đã đánh mất một vài điểm.

3258
03:06:23,800 --> 03:06:27,740
Sau đó tôi sẽ hỏi một câu bằng tiếng Anh\n

3259
03:06:29,300 --> 03:06:33,600
Và sau khi tôi có câu trả lời này,\n

3260
03:06:33,601 --> 03:06:36,861
Vì vậy, nếu điểm nhỏ hơn 2--

3261
03:06:36,861 --> 03:06:40,521
mượn cú pháp mà chúng ta\nđã thấy trên màn hình lúc nãy--

3262
03:06:40,521 --> 03:06:42,921
hãy tiếp tục và in\nra điều gì đó có tính giải thích

3263
03:06:42,921 --> 03:06:49,191
như thể bạn mất ít điểm hơn\nhơn tôi, dấu gạch chéo ngược n.

3264
03:06:49,191 --> 03:06:52,221
ngược lại nếu điểm lớn hơn 2--

3265
03:06:52,220 --> 03:06:53,990
đó là, một lần nữa tôi đã thua bao nhiêu--

3266
03:06:53,990 --> 03:06:59,661
Tôi sẽ tiếp tục và in ra cho bạn\n

3267
03:06:59,661 --> 03:07:03,847
nếu không thì-- đợi một chút, có vẻ như vậy\n

3268
03:07:03,847 --> 03:07:05,931
Tôi sẽ tiếp tục\nvà in ra thứ gì đó

3269
03:07:05,931 --> 03:07:12,621
giống như bạn đã mất cùng số điểm như tôi, dấu gạch chéo ngược n.

3270
03:07:12,620 --> 03:07:16,790
Vì vậy, thực sự, chỉ là một cách đơn giản\n

3271
03:07:16,790 --> 03:07:18,960
nhưng với một kịch bản cụ thể ở đây.

3272
03:07:18,960 --> 03:07:21,090
Vì vậy, hãy để tôi tiếp tục và lưu cái này.

3273
03:07:21,091 --> 03:07:24,140
Để tôi tiếp tục\nchạy kiếm điểm, Enter.

3274
03:07:27,021 --> 03:07:29,331
Và sau đó, bạn đã mất bao nhiêu điểm?

3275
03:07:31,102 --> 03:07:32,810
Được rồi, bạn mất\nít điểm hơn tôi.

3276
03:07:37,081 --> 03:07:40,851
Vì vậy, một lần nữa, chúng ta có khả năng\n

3277
03:07:40,851 --> 03:07:44,841
thực tế là từ tuần trước, tức là\n

3278
03:07:46,111 --> 03:07:50,811
Tuy nhiên, có điều gì đó tinh tế ở đây\n

3279
03:07:50,810 --> 03:07:53,390
mà ai đó có thể gọi là một con số kỳ diệu.

3280
03:07:53,390 --> 03:07:56,581
Đây là cách lập trình\ncho một việc tôi đã làm ở đây.

3281
03:07:56,581 --> 03:08:01,880
Có một chút dư thừa không liên quan\n

3282
03:08:01,880 --> 03:08:07,470
Nhưng có điều gì tôi đã gõ hai lần\n

3283
03:08:07,470 --> 03:08:11,430
Chính xác, có thể nói là tôi đã mã hóa cứng\n

3284
03:08:11,431 --> 03:08:13,771
ở hai địa điểm, trong trường hợp này--

3285
03:08:13,771 --> 03:08:15,701
điều đó không đến từ người dùng.

3286
03:08:15,700 --> 03:08:18,600
Vì vậy, rõ ràng, một khi tôi\nbiên dịch cái này, thì nó chính là nó.

3287
03:08:18,601 --> 03:08:21,671
Bạn luôn so sánh mình với tôi vào năm 1996

3288
03:08:21,671 --> 03:08:24,630
điều tốt hơn hay điều xấu hơn\là tất cả những gì chương trình có thể làm.

3289
03:08:24,630 --> 03:08:27,930
Nhưng đây cũng là một ví dụ về\na con số kỳ diệu theo nghĩa

3290
03:08:27,931 --> 03:08:31,691
kiểu như, chờ đã, 2 người đó đến từ đâu\n

3291
03:08:31,691 --> 03:08:35,251
Có cảm giác như chúng ta đang thiết lập\n

3292
03:08:35,251 --> 03:08:36,480
của vít xuống đường.

3293
03:08:36,480 --> 03:08:39,931
Bởi vì mã này càng dài\n

3294
03:08:42,900 --> 03:08:45,030
tôi sẽ tiếp tục gõ số 2 phải không?

3295
03:08:47,911 --> 03:08:49,861
Nhưng thành thật mà nói, cuối cùng\nbạn sẽ làm hỏng việc

3296
03:08:49,861 --> 03:08:52,411
và bạn sẽ bỏ lỡ một trong\n

3297
03:08:52,411 --> 03:08:54,911
bởi vì có thể năm sau tôi đã làm tệ hơn, hoặc 1 năm sau, tôi đã làm tốt hơn.

3298
03:08:54,911 --> 03:08:57,550
Và bạn không muốn những\nsố này không đồng bộ.

3299
03:08:57,550 --> 03:09:01,050
Vậy đâu sẽ là cải tiến hợp lý\nâng cao cho thiết kế này

3300
03:09:01,050 --> 03:09:04,110
thay vì mã hóa cứng\ncùng một số kiểu kỳ diệu

3301
03:09:07,011 --> 03:09:09,689
Vâng, tại sao tôi không tạo một\nbiến mà tôi có thể sử dụng trong đó?

3302
03:09:09,689 --> 03:09:11,480
Vì vậy, chẳng hạn, tôi\ncó thể tạo một biến

3303
03:09:11,480 --> 03:09:14,540
như thế này, một số nguyên khác gọi là của tôi.

3304
03:09:14,540 --> 03:09:16,370
Và tôi sẽ\khởi tạo nó thành 2.

3305
03:09:16,370 --> 03:09:19,370
Và sau đó tôi sẽ thay đổi\nđề cập đến 2 thành cái này.

3306
03:09:19,370 --> 03:09:23,000
Và tên của tôi là một cái tên khá hợp lý\ncho một biến trong chừng mực

3307
03:09:23,001 --> 03:09:27,261
vì nó đề cập đến chính xác những điểm đang được đề cập.

3308
03:09:27,261 --> 03:09:29,781
Tuy nhiên, ở đây có rủi ro,\nmặc dù rủi ro là nhỏ.

3309
03:09:29,781 --> 03:09:32,361
Tôi có thể vô tình\nthay đổi tên của mình vào một lúc nào đó.

3310
03:09:32,361 --> 03:09:36,451
Có lẽ tôi đã quên mất ý nghĩa của mình,\n

3311
03:09:36,450 --> 03:09:39,020
Vì vậy, có một cách để nói với\nmáy tính "đừng tin tôi

3312
03:09:39,021 --> 03:09:40,730
bởi vì cuối cùng tôi cũng sẽ làm hỏng việc

3313
03:09:40,730 --> 03:09:43,310
bằng cách tạo một biến không đổi nữa.

3314
03:09:43,310 --> 03:09:45,780
Vì vậy, một hằng số trong\nngôn ngữ lập trình--

3315
03:09:45,781 --> 03:09:47,421
điều này không tồn tại trong Scratch--

3316
03:09:47,421 --> 03:09:50,541
chỉ là một gợi ý bổ sung cho\n

3317
03:09:50,540 --> 03:09:52,130
bạn lập trình phòng thủ hơn.

3318
03:09:52,130 --> 03:09:55,340
Nếu bạn không tin tưởng\nbản thân mình nhất thiết phải không

3319
03:09:55,341 --> 03:09:57,650
sau này sẽ làm hỏng việc, hay\thành thật mà nói, trong thực tế

3320
03:09:57,650 --> 03:10:01,161
nếu bạn biết con số đó\nkhông bao giờ thay đổi, hãy giữ nó không đổi

3321
03:10:01,161 --> 03:10:02,820
và đừng bao giờ nghĩ về nó nữa.

3322
03:10:02,820 --> 03:10:08,091
Điều này báo cho trình biên dịch biết để đảm bảo\n

3323
03:10:09,740 --> 03:10:14,240
Và một quy ước khác trong C và khác\n

3324
03:10:14,240 --> 03:10:16,692
thông thường chỉ\nviết hoa biến.

3325
03:10:16,692 --> 03:10:18,650
Kiểu như bạn đang\ny hét lên, nhưng thực ra chỉ là

3326
03:10:18,650 --> 03:10:20,003
trực quan làm cho nó nổi bật.

3327
03:10:20,003 --> 03:10:21,711
Vì vậy, nó giống như\na quy tắc ngón tay cái hay

3328
03:10:21,710 --> 03:10:24,590
điều đó giúp bạn nhận ra, ồ,\nđó phải là một hằng số.

3329
03:10:24,591 --> 03:10:27,291
Chỉ viết hoa thôi\nkhông làm cho nó không đổi.

3330
03:10:28,880 --> 03:10:31,130
Nhưng cách viết hoa\nis chỉ là một lời nhắc nhở trực quan

3331
03:10:31,130 --> 03:10:35,040
rằng đây là một nơi nào đó,\nbằng cách nào đó là một hằng số.

3332
03:10:35,040 --> 03:10:37,490
Vì vậy, chỉ là một sàng lọc nhỏ,\nnhưng, một lần nữa, chúng tôi

3333
03:10:37,490 --> 03:10:41,450
trở nên giỏi hơn\nlập trình chỉ bằng cách thấm nhuần

3334
03:10:43,700 --> 03:10:48,020
Vậy câu hỏi về điều kiện\nin C hay các hằng số này?

3335
03:10:48,756 --> 03:10:53,810
ĐỐI TƯỢNG: Tại sao bạn không sử dụng\n

3336
03:10:53,810 --> 03:10:58,761
DAVID J. Malan: Vâng, tại sao bạn\n

3337
03:10:59,361 --> 03:11:01,401
Đây là cách\nngôn ngữ được thiết kế.

3338
03:11:03,501 --> 03:11:07,220
Nói chung, khi bạn\n

3339
03:11:08,181 --> 03:11:09,861
không có dấu chấm phẩy liên quan.

3340
03:11:09,861 --> 03:11:14,781
Hiện tại, giả sử rằng dấu chấm phẩy thường\n

3341
03:11:14,781 --> 03:11:18,411
Phương pháp phỏng đoán đó không đáng tin cậy 100%,\n

3342
03:11:20,720 --> 03:11:23,720
Tay trái không nói chuyện với tay phải\n

3343
03:11:25,191 --> 03:11:27,391
Được rồi, vậy hãy làm việc khác.

3344
03:11:28,681 --> 03:11:31,761
Nếu tôi có khả năng hỏi\nđiều gì đó có điều kiện--

3345
03:11:31,761 --> 03:11:33,740
điều này có đúng hay\nis điều kia--

3346
03:11:33,740 --> 03:11:36,650
tôi có thể viết một chương trình rất đơn giản\n

3347
03:11:36,650 --> 03:11:39,980
cho tôi biết một số thuộc loại\nhuman là chẵn hay lẻ?

3348
03:11:39,980 --> 03:11:42,390
Chà, hãy để tôi chuẩn bị sẵn\nkhuôn khổ cho việc đó.

3349
03:11:42,390 --> 03:11:44,990
Hãy để tôi tiếp tục và\nviết mã chẵn lẻ--

3350
03:11:44,990 --> 03:11:47,060
là một cách ưa thích để nói chẵn hoặc lẻ.

3351
03:11:47,060 --> 03:11:53,511
Và hãy để tôi tiếp tục thêm cs50.h,\n

3352
03:11:53,511 --> 03:11:55,521
một lần nữa, nhiều hơn về những người xuống đường.

3353
03:11:55,521 --> 03:11:59,781
Nhưng bây giờ, tôi sẽ tiếp tục\n

3354
03:11:59,781 --> 03:12:03,351
bằng cách gọi get_int và hỏi\nhọ xem n là gì.

3355
03:12:03,351 --> 03:12:07,171
Và bây giờ tôi sẽ\giới thiệu một số mã giả.

3356
03:12:07,171 --> 03:12:08,931
Đây là\nví dụ đầu tiên của một chương trình

3357
03:12:08,931 --> 03:12:12,001
Thành thật mà nói, tôi không thực sự chắc chắn về cách tiếp tục.

3358
03:12:12,001 --> 03:12:14,691
Vì vậy, hãy để tôi sử dụng một số\nmã giả bằng cách sử dụng các nhận xét.

3359
03:12:14,691 --> 03:12:17,221
Cuối cùng, tôi sẽ loại bỏ\nđiều này và viết mã thực sự.

3360
03:12:17,220 --> 03:12:22,675
Nhưng nếu n chẵn thì in--

3361
03:12:22,675 --> 03:12:24,050
thực ra, hãy để tôi in nó ra.

3362
03:12:24,050 --> 03:12:27,411
Hãy để tôi tiếp tục và nói\nprintf, trích dẫn, "thậm chí"

3363
03:12:27,411 --> 03:12:29,630
bởi vì tôi biết cách sử dụng printf.

3364
03:12:29,630 --> 03:12:33,230
nếu không-- được rồi, tôi\nbiết cách in số lẻ

3365
03:12:33,230 --> 03:12:35,900
vì vậy hãy để tôi nói printf,\nquote unquote, "lẻ".

3366
03:12:35,900 --> 03:12:39,630
Thế là tôi đã cắn một miếng\n

3367
03:12:39,630 --> 03:12:42,680
Và hãy để tôi tiếp tục đặt\ncác phần giữ chỗ nhỏ của mình.

3368
03:12:42,681 --> 03:12:44,581
Tôi muốn thực hiện một số loại điều kiện.

3369
03:12:44,581 --> 03:12:49,400
Vì vậy, nếu bây giờ có dấu chấm hỏi, hãy để tôi đi\n

3370
03:12:53,540 --> 03:12:55,640
Tôi đang tiến gần hơn đến việc giải quyết vấn đề này.

3371
03:12:55,640 --> 03:12:59,370
Nhưng tôi vẫn còn\ndấu chấm hỏi này ở đây.

3372
03:12:59,370 --> 03:13:06,090
Bằng cách sử dụng cú pháp mà chúng ta đã thấy, có thể\n

3373
03:13:08,120 --> 03:13:12,050
Có cái toán tử nhỏ này I\n

3374
03:13:12,050 --> 03:13:14,100
toán tử, điều đó sẽ cho phép\nbạn thực hiện chính xác điều đó.

3375
03:13:14,101 --> 03:13:16,663
Nếu bạn chia bất kỳ số nào cho\n2, phương pháp phỏng đoán toán học đó

3376
03:13:16,663 --> 03:13:19,371
sẽ cho bạn biết nếu nó chẵn\n

3377
03:13:21,290 --> 03:13:25,040
Và điều đó thật tuyệt vì giải pháp thay thế\n

3378
03:13:25,040 --> 03:13:33,440
như nếu n == 0 hoặc nếu n\nequals 2 hoặc n bằng 4--

3379
03:13:33,441 --> 03:13:37,070
mã của bạn sẽ dài vô tận nếu\n

3380
03:13:37,070 --> 03:13:43,911
Nhưng nếu tôi chia cho 2\nvà xét số dư--

3381
03:13:43,911 --> 03:13:47,281
nó hơi khó hiểu một chút, nhưng\nđiều này thực sự sẽ có tác dụng.

3382
03:13:47,281 --> 03:13:51,471
Vậy dấu phần trăm là\ntoán tử số dư.

3383
03:13:51,470 --> 03:13:56,790
Nó chia tử số cho mẫu số\n

3384
03:13:56,790 --> 03:13:58,980
nhưng đúng hơn là phần còn lại của điều đó.

3385
03:13:58,980 --> 03:14:02,511
Vì vậy, nếu bạn chia bất cứ thứ gì cho 2,\n

3386
03:14:02,511 --> 03:14:06,681
Và nếu quả thực, 2 chia\ninto n đều, cho bạn 0

3387
03:14:06,681 --> 03:14:08,060
sau đó bạn sẽ in chẵn.

3388
03:14:10,070 --> 03:14:14,751
Nhưng có điều gì đó kỳ lạ-- chơi chữ\n

3389
03:14:14,751 --> 03:14:20,640
Một đoạn cú pháp mới khác là gì,\n

3390
03:14:25,540 --> 03:14:28,090
Và tôi thậm chí còn bắt gặp chính mình\nnói điều đó một lúc trước

3391
03:14:28,091 --> 03:14:29,470
chỉ vì nó đã ăn sâu vào tâm trí.

3392
03:14:34,581 --> 03:14:36,331
DAVID J. Malan: Vâng, nếu\ncái gì đó tương đương với cái kia.

3393
03:14:36,331 --> 03:14:38,480
Vì vậy bây giờ đây là toán tử đẳng thức.

3394
03:14:38,480 --> 03:14:40,280
Đó không phải là sự phân công từ phải sang trái.

3395
03:14:40,281 --> 03:14:42,561
Và cái này cũng là một\nví dụ về nghĩa đen

3396
03:14:42,560 --> 03:14:45,440
con người không thực sự có kế hoạch\nang, có lẽ, tay trái

3397
03:14:45,441 --> 03:14:47,541
không nói chuyện với tay phải\nmà ai đó đã quyết định

3398
03:14:47,540 --> 03:14:49,161
hãy sử dụng dấu bằng\nđể gán.

3399
03:14:49,161 --> 03:14:52,036
Và sau đó là vài phút hoặc\n

3400
03:14:52,036 --> 03:14:53,841
làm thế nào bây giờ chúng ta so sánh sự bình đẳng?

3401
03:14:55,054 --> 03:14:58,220
Và nếu bạn cho rằng điều này hơi kỳ lạ,\n

3402
03:14:58,220 --> 03:15:01,050
có phiên bản thứ ba\nbạn sử dụng ba dấu bằng.

3403
03:15:01,050 --> 03:15:03,331
Vì vậy, một lần nữa, chính con người\nthiết kế ra những ngôn ngữ này.

3404
03:15:03,331 --> 03:15:06,528
Vì vậy, nếu bạn từng cảm thấy thất vọng vì chúng,\n

3405
03:15:06,528 --> 03:15:08,361
có thể nó không phải là thiết kế tốt nhất.

3406
03:15:08,361 --> 03:15:11,191
Nhưng chúng tôi gần như phải sống chung với nó kể từ đó.

3407
03:15:11,191 --> 03:15:12,891
Vì vậy, hãy để tôi tiếp tục và thu nhỏ ở đây.

3408
03:15:12,890 --> 03:15:15,751
Hãy để tôi tiếp tục và tạo sự bình đẳng ở đây.

3409
03:15:15,751 --> 03:15:20,570
Vì vậy hãy tạo sự chẵn lẻ-- và, một lần nữa, sự chẵn lẻ\n

3410
03:15:20,570 --> 03:15:23,300
./parity, nhập một số như 2.

3411
03:15:26,421 --> 03:15:29,720
3, điều đó thực sự kỳ quặc, v.v.

3412
03:15:29,720 --> 03:15:32,870
Có lẽ nếu chúng tôi tiếp tục thử nghiệm,\n

3413
03:15:34,171 --> 03:15:37,701
Bây giờ hãy để tôi tiếp tục và bắt đầu\n

3414
03:15:37,700 --> 03:15:40,760
bởi vì, phải thừa nhận rằng, nó đang trở nên\n

3415
03:15:40,761 --> 03:15:42,681
tất cả các bản tóm tắt đó ở trên cùng.

3416
03:15:42,681 --> 03:15:46,011
Hãy để tôi tạo một chương trình\ncó tên làđồng ý.c đó là

3417
03:15:46,011 --> 03:15:48,111
gợi nhớ đến bất kỳ\nhình thức nào bạn có

3418
03:15:48,111 --> 03:15:52,291
đồng ý trực tuyến bằng hộp kiểm\n

3419
03:15:52,290 --> 03:15:55,460
Vì vậy, hãy để tôi vứt bỏ tất cả những chi tiết của chương trình chính này

3420
03:15:55,460 --> 03:15:57,780
và bây giờ hỏi một cái gì đó như thế này.

3421
03:15:57,781 --> 03:16:01,621
Hãy để tôi tiếp tục và nhắc\nngười dùng đồng ý với điều gì đó.

3422
03:16:01,620 --> 03:16:06,800
Tôi sẽ tiếp tục và nói, bằng cách nào\n

3423
03:16:06,800 --> 03:16:12,110
bất kể câu hỏi có thể là gì--\n

3424
03:16:12,111 --> 03:16:13,951
tương ứng là có hoặc không.

3425
03:16:13,950 --> 03:16:16,970
Vì vậy, nếu nó chỉ là một\nký tự, thực ra, tôi

3426
03:16:16,970 --> 03:16:18,610
thực sự có thể vượt qua chỉ với get_char.

3427
03:16:18,611 --> 03:16:20,361
Trước đây chưa từng sử dụng,\nnhưng nó có trong thực đơn của chúng tôi

3428
03:16:20,361 --> 03:16:22,341
các chức năng từ thư viện CS50.

3429
03:16:22,341 --> 03:16:25,431
Và nếu tôi muốn nhận\nphản hồi của người dùng

3430
03:16:25,431 --> 03:16:28,501
giá trị trả về cũng phải là\na char ở bên trái.

3431
03:16:28,501 --> 03:16:31,281
Bây giờ chúng ta đã thấy các chuỗi,\nint và bây giờ là các ký tự

3432
03:16:31,281 --> 03:16:33,171
nếu chúng ta chỉ quan tâm đến một chữ cái duy nhất.

3433
03:16:33,171 --> 03:16:38,150
Và bây giờ chúng ta hãy tiếp tục,\nkiểm tra xem người dùng có đồng ý hay không.

3434
03:16:38,150 --> 03:16:47,751
Vậy còn nếu c == "y" thì để tôi\n

3435
03:16:47,751 --> 03:16:51,900
in ra câu đã đồng ý hoặc một câu\nchẳng hạn như vậy.

3436
03:16:51,900 --> 03:16:54,560
khác nếu họ không gõ\nc-- hoặc bạn biết gì không?

3437
03:16:54,560 --> 03:16:56,390
Hãy nói rõ ràng ở đây,\nđể họ không thể

3438
03:16:56,390 --> 03:16:59,060
gõ z hoặc b hoặc một số chữ cái ngẫu nhiên.

3439
03:16:59,060 --> 03:17:07,011
nếu không thì nếu c=="n" n không thì để tôi\n

3440
03:17:07,978 --> 03:17:10,520
Và tôi sẽ bỏ qua\nngười dùng nếu họ không hợp tác

3441
03:17:10,521 --> 03:17:14,781
và họ gõ z hoặc b hoặc\nthứ gì đó không phải y hoặc n.

3442
03:17:14,781 --> 03:17:21,141
Được rồi, hãy để tôi tiếp tục và\n

3443
03:17:22,570 --> 03:17:25,251
Hãy sử dụng mặc định.\nOK, vậy là cách đó có vẻ hiệu quả.

3444
03:17:25,251 --> 03:17:27,201
Không, lần này tôi không đồng ý.

3445
03:17:28,411 --> 03:17:33,921
Thế còn phím Caps Lock của tôi đang bật hoặc\n

3446
03:17:37,972 --> 03:17:41,181
Vì vậy, rõ ràng là có lỗi, ít nhất là nếu tôi muốn\n

3447
03:17:41,181 --> 03:17:43,021
đó là loại hợp lý.

3448
03:17:43,021 --> 03:17:48,480
Vậy bạn nghĩ giải pháp\nkhả thi ở đây là gì?

3449
03:17:48,480 --> 03:17:51,620
Làm cách nào để giải quyết vấn đề này và chấp nhận\ncả chữ hoa và chữ thường?

3450
03:17:51,620 --> 03:17:54,335
Có lẽ cách triển khai đơn giản nhất,\nngây thơ nhất là gì?

3451
03:17:56,490 --> 03:17:58,990
DAVID J. Malan: Vâng, vậy tại sao\ntôi không hỏi hai câu hỏi thôi?

3452
03:17:58,990 --> 03:18:03,550
Hoặc bạn biết không, thậm chí còn đơn giản hơn\n

3453
03:18:03,550 --> 03:18:06,911
nếu bạn muốn, hãy để tôi sao chép\nand dán một số mã này.

3454
03:18:06,911 --> 03:18:11,781
Thay đổi cái này thành cái khác-- rất tiếc,\nkhông viết hoa-- else nếu "Y".

3455
03:18:11,781 --> 03:18:13,781
Và rồi tôi cá là tôi có thể\nlàm điều tương tự với n.

3456
03:18:13,781 --> 03:18:15,641
Nhưng ở đây cũng vậy, giống như\nvới Scratch, càng sớm càng tốt

3457
03:18:15,640 --> 03:18:17,724
khi bạn bắt đầu thấy\nchính mình đang sao chép và dán

3458
03:18:17,724 --> 03:18:19,480
có thể bạn đang làm sai điều gì đó.

3459
03:18:19,480 --> 03:18:22,810
Và những gì bạn nói bằng lời,\nnếu tôi có thể, thực sự tốt hơn.

3460
03:18:22,810 --> 03:18:29,501
Bởi vì bạn đang ám chỉ rằng tôi có thể\n

3461
03:18:32,841 --> 03:18:39,711
Điều đáng chú ý là bạn không thể sử dụng từ HOẶC\n

3462
03:18:39,710 --> 03:18:43,180
Vì vậy, bạn có thể diễn đạt câu hỏi này\ncâu hỏi khác.

3463
03:18:43,181 --> 03:18:46,301
Bạn chỉ cần một trong\ncâu trả lời là có hoặc đúng

3464
03:18:46,300 --> 03:18:48,220
và bạn sử dụng hai thanh dọc.

3465
03:18:48,220 --> 03:18:50,980
Ngược lại,\nbạn đã thấy nó rồi, nếu bạn

3466
03:18:50,980 --> 03:18:54,341
muốn kiểm tra xem cái gì đó có bằng không\n

3467
03:18:54,341 --> 03:18:56,890
bạn có thể sử dụng hai ký hiệu.

3468
03:18:56,890 --> 03:18:59,411
Tuy nhiên, về mặt logic, điều này sẽ vô nghĩa ở đây.

3469
03:18:59,411 --> 03:19:02,650
Chắc chắn những gì con người gõ vào không thể\n

3470
03:19:03,921 --> 03:19:05,711
Vì vậy, trong trường hợp này, chúng tôi muốn OR.

3471
03:19:05,710 --> 03:19:07,475
Nhưng điều đó cho phép tôi\n thắt chặt mã của mình.

3472
03:19:07,476 --> 03:19:09,851
Tôi không phải bắt đầu sao chép\nvà dán toàn bộ các nhánh.

3473
03:19:09,851 --> 03:19:13,560
Bây giờ tôi có thể hỏi hai câu hỏi cùng một lúc.

3474
03:19:13,560 --> 03:19:16,870
Vậy thì câu hỏi về biến thể này?

3475
03:19:17,869 --> 03:19:19,661
Bạn có thể chuyển đổi\đầu vào thành tất cả chữ thường không?

3476
03:19:20,831 --> 03:19:22,480
Chúng tôi chưa có khả năng.

3477
03:19:22,480 --> 03:19:24,940
Hóa ra điều đó sẽ yêu cầu--

3478
03:19:24,941 --> 03:19:27,166
để dễ dàng, một thư viện khác,\nmặc dù chúng ta có thể làm điều đó

3479
03:19:27,165 --> 03:19:30,040
chúng tôi biết một chút về\n

3480
03:19:30,040 --> 03:19:34,113
Nhưng, vâng, đó sẽ là một giải pháp thay thế,\n

3481
03:19:37,140 --> 03:19:38,390
DAVID J. Malan: Câu hỏi hay.

3482
03:19:38,390 --> 03:19:41,987
Thật không may, bạn phải nói rõ ràng\n

3483
03:19:41,987 --> 03:19:44,320
mặc dù đó\nlà cách bạn có thể nghĩ về nó.

3484
03:19:44,320 --> 03:19:49,240
Bạn phải hỏi một câu hỏi hoàn chỉnh\n

3485
03:19:50,230 --> 03:19:51,940
Bây giờ tôi cũng xin hỏi một câu.

3486
03:19:53,050 --> 03:19:57,760
Tôi cố tình sử dụng dấu ngoặc đơn\n

3487
03:19:59,351 --> 03:20:03,521
Trước đây, chúng tôi sử dụng dấu ngoặc kép\n

3488
03:20:05,911 --> 03:20:08,970
Đúng, chuỗi là dấu ngoặc kép cho\n

3489
03:20:10,050 --> 03:20:14,210
Và dấu ngoặc đơn cho các ký tự đơn.

3490
03:20:14,210 --> 03:20:15,800
Bởi vì kiểu dữ liệu của tôi khác.

3491
03:20:15,800 --> 03:20:18,770
Tôi đã chọn con đường đơn giản\nchỉ sử dụng một ký tự duy nhất.

3492
03:20:18,771 --> 03:20:21,351
Trên thực tế, chương trình này\nsẽ không hoạt động với Y-E-S

3493
03:20:21,351 --> 03:20:25,041
hoặc N-O. Điều đó không được hỗ trợ tại\n

3494
03:20:25,040 --> 03:20:27,831
Tôi phải sử dụng dấu ngoặc đơn\nvì đó là cách C thực hiện.

3495
03:20:27,831 --> 03:20:29,790
Nếu bạn đang xử lý\nký tự đơn

3496
03:20:29,790 --> 03:20:31,850
hay còn gọi là ký tự, sử dụng dấu ngoặc đơn.

3497
03:20:32,781 --> 03:20:36,591
ngay cả khi đó là một\nký tự trong một chuỗi

3498
03:20:36,591 --> 03:20:39,623
như thể bạn đang bắt đầu viết\n

3499
03:20:39,623 --> 03:20:40,790
đó sẽ là dấu ngoặc kép.

3500
03:20:40,790 --> 03:20:42,860
Và chúng ta sẽ sớm biết tại sao lại như vậy.

3501
03:20:42,861 --> 03:20:46,551
Tuy nhiên, một lần nữa, đây chỉ là những điều cần ghi nhớ mỗi khi viết mã

3502
03:20:46,550 --> 03:20:48,740
bằng ngôn ngữ đặc biệt này.

3503
03:20:50,970 --> 03:20:56,060
Vì vậy, hãy trả lời ngắn gọn, nếu tôi hiểu\n

3504
03:20:56,060 --> 03:20:58,270
Và điều này thậm chí còn sai lầm hơn.

3505
03:20:58,271 --> 03:21:00,771
Nhưng nếu bạn không phiền, hãy để tôi\nkick cái hộp trong vài tuần

3506
03:21:00,771 --> 03:21:02,480
về vấn đề này là tại sao điều này không hoạt động.

3507
03:21:02,480 --> 03:21:06,852
Cách thú vị nhất để làm điều này là\n

3508
03:21:06,852 --> 03:21:08,810
Nhưng ngay cả đây cũng là một con dốc trơn trượt, bởi vì

3509
03:21:08,810 --> 03:21:12,179
nếu người dùng làm điều gì đó kỳ lạ,\n

3510
03:21:12,179 --> 03:21:13,970
Bạn có thể tưởng tượng việc này nhanh chóng trở nên lộn xộn.

3511
03:21:13,970 --> 03:21:16,310
Tôi thích ý tưởng ban nãy của bạn\nvề việc ép buộc mọi thứ

3512
03:21:16,310 --> 03:21:18,560
viết thường chỉ để chuẩn hóa mọi thứ.

3513
03:21:18,560 --> 03:21:22,700
Thật không may, bạn không thể so sánh\nstrings về sự bằng nhau như thế này

3514
03:21:22,700 --> 03:21:24,780
bởi vì, một lần nữa, những lý do sẽ sớm xuất hiện.

3515
03:21:24,781 --> 03:21:27,681
Vì vậy, hôm nay chúng tôi sẽ giữ nó\n

3516
03:21:27,681 --> 03:21:31,640
gần như không thân thiện với người dùng đến mức\không chấp nhận từng chữ cái riêng lẻ.

3517
03:21:31,640 --> 03:21:34,820
Và có một câu hỏi ở đây.

3518
03:21:34,820 --> 03:21:36,980
Trên bàn phím tiếng Anh Mỹ\nit's shift và sau đó

3519
03:21:36,980 --> 03:21:40,081
phím dấu gạch chéo ngược phía trên Return,\nnhưng tùy thuộc vào bàn phím của bạn

3520
03:21:42,320 --> 03:21:45,140
Được rồi, bây giờ chúng ta hãy nhìn lại

3521
03:21:45,140 --> 03:21:47,181
vào việc gì đó mà chúng tôi đã làm một chút vào tuần trước.

3522
03:21:47,181 --> 03:21:49,971
Hãy để tôi tiếp tục và mở\na tệp có tên meow.c

3523
03:21:49,970 --> 03:21:52,460
bởi vì, hãy nhớ lại, đó là điều\nban đầu chúng tôi yêu cầu Scratch làm.

3524
03:21:52,460 --> 03:21:55,251
Hãy để tôi không bao gồm thư viện\nC50 lần này

3525
03:21:55,251 --> 03:21:59,150
nhưng chỉ là stdio.h vì tôi\không muốn printf cho bản demo này.

3526
03:21:59,150 --> 03:22:02,720
Hãy để tôi tiếp tục và\nchỉ cần in ra meo meo.

3527
03:22:02,720 --> 03:22:06,411
Và sau đó nếu tôi muốn con mèo kêu meo meo\n

3528
03:22:11,210 --> 03:22:14,120
Chương trình được viết--\không chính xác, tôi khẳng định.

3529
03:22:15,591 --> 03:22:17,841
Nhưng, một lần nữa, đây là\nsự bắt đầu cuộc trò chuyện của chúng tôi

3530
03:22:17,841 --> 03:22:20,541
tuần trước vì\nđược thiết kế không đặc biệt tốt.

3531
03:22:20,540 --> 03:22:23,630
Và nếu ai đó muốn\nchỉ ra điều hiển nhiên hiện nay

3532
03:22:23,630 --> 03:22:28,380
tại sao điều này lại không được thiết kế tốt?

3533
03:22:28,380 --> 03:22:29,820
Vâng, đó chỉ là sự lặp lại thôi phải không?

3534
03:22:29,820 --> 03:22:31,894
Một lần nữa, tôi thực sự đã dùng đến cách sao chép-dán.

3535
03:22:31,894 --> 03:22:33,810
Đó có thể là tín hiệu\nrằng bạn có thể

3536
03:22:33,810 --> 03:22:37,870
làm sai điều gì đó hoặc tốt nhất là\n

3537
03:22:37,870 --> 03:22:40,195
Vậy giải pháp mà bạn\ncó thể thu thập được từ tuần trước

3538
03:22:40,195 --> 03:22:42,570
có lẽ sẽ là một trong những thứ được gọi là vòng lặp.

3539
03:22:42,570 --> 03:22:45,271
Vì vậy, chúng ta hãy xem một số\ncú pháp của vòng lặp trong C.

3540
03:22:45,271 --> 03:22:48,084
Nhưng, một lần nữa, không có ý tưởng mới nào,\nit chỉ là một số cú pháp mới

3541
03:22:48,084 --> 03:22:49,501
điều đó sẽ mất một chút thời gian để làm quen.

3542
03:22:49,501 --> 03:22:53,130
Trong Scratch, nếu bạn muốn kêu meo meo\n

3543
03:22:53,130 --> 03:22:57,880
không có từ khóa mãi mãi trong C, vì vậy\n

3544
03:22:57,880 --> 03:22:59,220
Nhưng đây là điều tốt nhất chúng ta có thể làm.

3545
03:22:59,220 --> 03:23:03,331
Hóa ra có một\ntừ khóa được gọi while ở C.

3546
03:23:03,331 --> 03:23:05,550
Và kiểu đó có\nngữ nghĩa phù hợp

3547
03:23:05,550 --> 03:23:08,740
bởi vì nó giống như khi tôi làm\nđiều gì đó lặp đi lặp lại

3548
03:23:10,230 --> 03:23:14,790
Nhưng cũng giống như điều kiện if\cũng như điều kiện if khác

3549
03:23:14,790 --> 03:23:18,060
những cái đó lấy biểu thức Boolean\n trong ngoặc đơn

3550
03:23:18,060 --> 03:23:21,130
vòng lặp while cũng có biểu thức Boolean\n trong ngoặc đơn.

3551
03:23:22,531 --> 03:23:26,041
Bây giờ, nếu tôi muốn làm gì đó\n

3552
03:23:26,040 --> 03:23:30,540
giả sử trong khi 2 lớn hơn\n1, trong khi 3 lớn hơn 2

3553
03:23:30,540 --> 03:23:32,430
hoặc chỉ là một cái gì đó hoàn toàn tùy ý.

3554
03:23:32,431 --> 03:23:36,240
Nhưng điều đó sẽ khiến bạn hiểu lầm\n

3555
03:23:36,240 --> 03:23:41,130
Tại sao 3-- nếu bạn muốn đúng, chỉ cần nói đúng.

3556
03:23:41,130 --> 03:23:45,780
Vậy hóa ra trong C có\n

3557
03:23:45,781 --> 03:23:48,901
nghĩa đen là đúng\n và sai.

3558
03:23:48,900 --> 03:23:53,341
Tôi cũng có thể đặt số 1 cho\n

3559
03:23:53,341 --> 03:23:56,081
nhưng hầu hết mọi người sẽ\nnói đúng cho rõ ràng.

3560
03:23:56,081 --> 03:23:59,431
Vì vậy, nếu\nbạn muốn, nó hơi hackish một chút, nhưng rất thông thường.

3561
03:23:59,431 --> 03:24:03,781
Không có từ khóa mãi mãi trong C. Nếu\n

3562
03:24:03,781 --> 03:24:06,191
Tôi sẽ chỉ sử dụng\nthứ gì đó như printf ở đây.

3563
03:24:06,191 --> 03:24:08,731
Vì vậy, một lần nữa, bản dịch không hoàn hảo\ntừ một

3564
03:24:08,730 --> 03:24:11,708
sang cái kia, nhưng hoàn toàn\ncó thể ở C. Còn cái này thì sao?

3565
03:24:11,708 --> 03:24:14,041
Điều này phổ biến hơn một chút\nnếu bạn muốn làm điều gì đó

3566
03:24:14,040 --> 03:24:17,280
một số lần hữu hạn, như lặp lại 3.

3567
03:24:17,281 --> 03:24:21,901
Có một vài cách khác nhau mà chúng ta có thể\n

3568
03:24:21,900 --> 03:24:25,470
Và đây là nơi C-- giống như\nnhiều ngôn ngữ dựa trên văn bản

3569
03:24:25,470 --> 03:24:28,921
bạn phải làm điều đó\n

3570
03:24:28,921 --> 03:24:31,171
chặn và nghĩ về\nđược rồi, làm cách nào tôi có thể

3571
03:24:31,171 --> 03:24:35,880
xây dựng một cỗ máy nhỏ trong phần mềm\n

3572
03:24:35,880 --> 03:24:40,380
Được rồi, hãy để tôi tự đặt cho mình một biến\n

3573
03:24:40,380 --> 03:24:46,740
Hãy để tôi tạo một vòng lặp có Boolean\n

3574
03:24:46,740 --> 03:24:50,310
ý tưởng đã có ở đây rồi, tại sao\ntôi không đếm 1, 2, 3 nhỉ?

3575
03:24:50,310 --> 03:24:53,790
Vậy làm cách nào để triển khai\ntính chất vật lý này trong mã?

3576
03:24:53,790 --> 03:24:57,180
Tôi tự đặt cho mình một biến,\nđặt nó ở mức 0, 0 ngón tay lên.

3577
03:24:57,181 --> 03:25:00,001
Bây giờ tôi đặt câu hỏi,\nis bộ đếm nhỏ hơn 3?

3578
03:25:00,001 --> 03:25:02,970
Nếu vậy, hãy tiếp tục và in ra meo meo.

3579
03:25:02,970 --> 03:25:06,331
Và chỉ bằng trực giác, ngay cả khi\n

3580
03:25:06,331 --> 03:25:09,480
trước Scratch,\ntôi cần phải làm gì thêm?

3581
03:25:09,480 --> 03:25:12,421
Tôi đã chừa chỗ ở đây\không còn dòng logic nào nữa.

3582
03:25:13,990 --> 03:25:15,220
Chúng ta phải tăng số lượt truy cập.

3583
03:25:15,220 --> 03:25:19,150
Vì vậy tôi cần mã như tôi đã trình bày trước đó,\n

3584
03:25:19,150 --> 03:25:21,400
Và đây là nơi\nđôi khi lập trình

3585
03:25:21,400 --> 03:25:22,921
trở nên giống hệ thống ống nước hơn một chút.

3586
03:25:22,921 --> 03:25:25,421
Bạn không thể chỉ nói những gì bạn muốn nói, giống như bạn không thể Scratch.

3587
03:25:25,421 --> 03:25:28,001
Bạn phải xây dựng một\nloại máy phần mềm nhỏ

3588
03:25:28,001 --> 03:25:31,181
khởi tạo một giá trị,\n

3589
03:25:31,181 --> 03:25:34,091
Và nó giống như\ncái máy dựa trên phần mềm này

3590
03:25:34,091 --> 03:25:37,211
nhưng cùng với nhau, đó chỉ là sử dụng\nmột số khối xây dựng quen thuộc.

3591
03:25:38,380 --> 03:25:40,672
Giống như trong Scratch, bạn\ncó thể đã sử dụng rất nhiều vòng lặp

3592
03:25:40,673 --> 03:25:42,161
đôi khi, khá phổ biến ở C.

3593
03:25:42,161 --> 03:25:44,050
Vậy chúng ta có thể thắt chặt quy tắc này lại không?

3594
03:25:44,050 --> 03:25:48,581
Điều này đúng, nhưng sau đây\nmột số quy ước phổ biến.

3595
03:25:48,581 --> 03:25:51,025
Nếu bạn định đếm, chỉ cần nói tôi.

3596
03:25:51,025 --> 03:25:52,900
Một quy ước trong\nlập trình-- với, ít nhất

3597
03:25:52,900 --> 03:25:57,490
các ngôn ngữ như C-- chỉ sử dụng i\n

3598
03:25:57,490 --> 03:25:59,650
là tính từ like, 0 trở lên.

3599
03:26:01,900 --> 03:26:04,780
Nó chỉ dài dòng\nhơn mức bạn cần.

3600
03:26:05,740 --> 03:26:07,532
Bạn không cần nhiều ngữ nghĩa hơn thế.

3601
03:26:07,532 --> 03:26:08,990
Được rồi, tôi có thể làm gì khác ở đây?

3602
03:26:08,990 --> 03:26:12,177
Có một cơ hội khác\nđể thắt chặt mã này.

3603
03:26:14,720 --> 03:26:17,720
Vâng, cú pháp đó\nkhông có gì mới cả

3604
03:26:17,720 --> 03:26:19,520
nhưng nó thực hiện nó ngắn gọn hơn.

3605
03:26:19,521 --> 03:26:23,990
Tôi có thể thay đổi điều này thành\n

3606
03:26:25,700 --> 03:26:27,920
Bây giờ, điều này khá kinh điển.

3607
03:26:27,921 --> 03:26:31,941
Đây là cách hầu hết mọi người\nsẽ triển khai một cái gì đó

3608
03:26:31,941 --> 03:26:34,611
ba lần bằng cách sử dụng vòng lặp trong C--

3609
03:26:34,611 --> 03:26:36,336
nghĩa là sử dụng vòng lặp while.

3610
03:26:36,335 --> 03:26:39,350
Hóa ra nó lại quá phổ biến\nin C và các ngôn ngữ khác

3611
03:26:39,351 --> 03:26:43,161
làm điều gì đó hữu hạn nhiều lần,\n

3612
03:26:43,161 --> 03:26:46,021
Tuy nhiên, trong mô hình này,\nrõ ràng, logic

3613
03:26:46,021 --> 03:26:49,221
là chúng ta bắt đầu bằng việc khởi tạo\n

3614
03:26:49,220 --> 03:26:52,310
Sau đó chúng ta đặt câu hỏi,\nis i nhỏ hơn 0?

3615
03:26:52,310 --> 03:26:56,030
Nếu vậy, mọi thứ được\nõm bên trong dấu ngoặc nhọn

3616
03:26:56,031 --> 03:26:59,240
được thực thi-- cụ thể là,\nmeo rồi cập nhật.

3617
03:26:59,240 --> 03:27:02,931
Khi đó máy tính sẽ\nphải kiểm tra lại tình trạng

3618
03:27:02,931 --> 03:27:06,531
để đảm bảo rằng tôi chưa nhận được\n

3619
03:27:06,531 --> 03:27:09,621
Nhưng nếu không, nó sẽ thực hiện điều này\n lần nữa và thực hiện lại điều này.

3620
03:27:09,620 --> 03:27:12,045
Và sau đó nó lặp lại, liên tục\nkiểm tra điều kiện

3621
03:27:12,046 --> 03:27:14,421
và thực thi những gì có trong\nblock, kiểm tra điều kiện

3622
03:27:14,421 --> 03:27:15,837
và thực thi những gì có trong khối.

3623
03:27:15,837 --> 03:27:20,390
Sau ba lần như vậy, điều kiện\n

3624
03:27:21,620 --> 03:27:24,740
Nó chỉ tiến tới bất cứ điều gì\n

3625
03:27:24,740 --> 03:27:27,390
Nó nhảy tới các khối tiếp theo ở bên dưới.

3626
03:27:27,390 --> 03:27:30,181
Được rồi, còn\ncách nào khác để thực hiện việc này?

3627
03:27:30,181 --> 03:27:32,181
À, tôi đã cố tình\nđếm từ 0--

3628
03:27:32,181 --> 03:27:33,972
và đó là một\nquy ước lập trình, phải không?

3629
03:27:33,972 --> 03:27:36,688
Tuần trước chúng tôi đã bắt đầu với việc tắt tất cả\nbóng đèn, tức là 0.

3630
03:27:36,688 --> 03:27:39,021
Vì vậy, khá hợp lý khi\nbắt đầu đếm từ số 0, chỉ

3631
03:27:39,853 --> 03:27:41,870
Giống như, không có ngón tay nào giơ lên, đây là 0--

3632
03:27:43,560 --> 03:27:47,841
Nhưng nếu muốn, bạn có thể\nbắt đầu đếm khi tôi bằng 1.

3633
03:27:47,841 --> 03:27:51,140
Nhưng sau đó bạn không muốn\nlàm điều đó khi tôi chưa đầy 3 tuổi

3634
03:27:51,140 --> 03:27:54,200
bạn muốn làm là\nnhỏ hơn hoặc bằng 3.

3635
03:27:54,200 --> 03:27:58,640
Trên hầu hết bàn phím, không có biểu tượng\n

3636
03:27:58,640 --> 03:28:02,690
hoặc bằng, vì vậy trong C, bạn\nsử dụng hai ký tự, nhỏ hơn

3637
03:28:02,691 --> 03:28:05,811
và sau đó là dấu bằng\nkhông có dấu cách ở giữa.

3638
03:28:05,810 --> 03:28:08,251
Điều đó chỉ có nghĩa là nhỏ hơn hoặc bằng.

3639
03:28:08,251 --> 03:28:12,771
Chúng ta có thể thay đổi nó thành i thành 2\n

3640
03:28:13,820 --> 03:28:18,900
Chúng ta có thể biến số này thành 10\nand nhỏ hơn hoặc bằng 12.

3641
03:28:18,900 --> 03:28:20,810
Nhưng, một lần nữa, chỉ cần bám sát những điều cơ bản.

3642
03:28:20,810 --> 03:28:23,931
Bắt đầu từ 0 và đếm tiếp lên\nsẽ là quy ước.

3643
03:28:23,931 --> 03:28:27,291
Hoặc nếu bạn muốn đếm ngược\ncũng được.

3644
03:28:27,290 --> 03:28:31,700
Đặt i thành 3 và sau đó thực hiện điều này\nmiễn là i lớn hơn 0

3645
03:28:31,700 --> 03:28:34,552
nhưng bạn phải giảm\thay vì tăng.

3646
03:28:34,552 --> 03:28:36,261
Vì vậy, một lần nữa, chúng ta có thể\nlàm việc này cả ngày.

3647
03:28:36,261 --> 03:28:39,396
Thực sự có một con số vô hạn\n

3648
03:28:39,396 --> 03:28:41,271
Và đó là lý do tại sao tôi luôn nhấn mạnh quy ước.

3649
03:28:41,271 --> 03:28:43,761
Gọi biến i cho\nthứ gì đó như thế này

3650
03:28:43,761 --> 03:28:47,271
khởi tạo nó thành 0 cho một cái gì đó như\n

3651
03:28:47,271 --> 03:28:49,161
trừ khi bạn thực sự muốn đếm ngược.

3652
03:28:49,161 --> 03:28:51,921
Một lần nữa, chỉ là những quy ước nhất định của con người.

3653
03:28:51,921 --> 03:28:55,111
Được rồi, còn\nancách khác để thực hiện việc này thì sao?

3654
03:28:55,111 --> 03:28:59,070
Đây là cái được gọi là vòng lặp for\ntrong C, cũng rất phổ biến.

3655
03:28:59,070 --> 03:29:02,091
Nó không hoàn toàn đơn giản\n

3656
03:29:02,091 --> 03:29:04,011
xuống đáy theo cách hoàn toàn tương tự.

3657
03:29:04,011 --> 03:29:07,400
Loại này có nhiều\nlogic hơn ở dòng đầu tiên.

3658
03:29:07,400 --> 03:29:09,921
Nhưng nó thực hiện chính xác điều tương tự.

3659
03:29:11,630 --> 03:29:15,350
lưu ý rằng bên trong\ndấu ngoặc đơn, bên cạnh từ dành cho

3660
03:29:15,351 --> 03:29:18,523
có hai dấu chấm phẩy-- đây là một cách sử dụng cú pháp kỳ lạ khác.

3661
03:29:18,522 --> 03:29:20,480
Họ không ở cuối đường\n, bây giờ họ đang ở

3662
03:29:20,480 --> 03:29:21,855
ở giữa dấu ngoặc đơn.

3663
03:29:21,855 --> 03:29:24,030
Nhưng đó là điều con người đã chọn từ nhiều năm trước.

3664
03:29:24,031 --> 03:29:30,951
Điều đầu tiên trước dấu chấm phẩy\n

3665
03:29:30,950 --> 03:29:34,040
Điều tiếp theo là điều kiện\nsẽ liên tục xảy ra

3666
03:29:34,040 --> 03:29:36,560
đã kiểm tra mọi chu kỳ thông qua vòng lặp này.

3667
03:29:36,560 --> 03:29:41,360
Và điều cuối cùng sẽ là\n

3668
03:29:41,361 --> 03:29:42,990
trong trường hợp này sẽ được tính lên.

3669
03:29:42,990 --> 03:29:45,710
Vì vậy, một lần nữa, nếu tôi tua lại\nchúng ta sẽ khởi tạo i thành 0.

3670
03:29:45,710 --> 03:29:48,350
Sau đó chúng ta đặt câu hỏi,\nis tôi nhỏ hơn 3?

3671
03:29:48,351 --> 03:29:52,611
Nếu vậy, hãy thực thi nội dung\bên trong vòng lặp.

3672
03:29:52,611 --> 03:29:58,490
Sau đó máy tính sẽ thực hiện việc này, nó thực hiện\n

3673
03:29:58,490 --> 03:30:01,220
Và sau đó nó sẽ không kêu meo meo một cách mù quáng nữa.

3674
03:30:01,220 --> 03:30:04,581
Nó sẽ kiểm tra lại\nđiều kiện, tôi có nhỏ hơn 3 không?

3675
03:30:04,581 --> 03:30:06,351
Sau đó nó sẽ kêu meo meo nếu vậy.

3676
03:30:06,351 --> 03:30:10,761
Sau đó nó có thể tiếp tục và tăng lên\n

3677
03:30:10,761 --> 03:30:14,449
Vì vậy, một lần nữa, điều này không hiểu rõ lắm\n

3678
03:30:14,449 --> 03:30:16,740
Bạn đọc nó từ trái sang\nphải rồi nhảy lung tung.

3679
03:30:16,740 --> 03:30:21,890
Nhưng, một lần nữa, việc khởi tạo,\nbiểu thức Boolean không đổi

3680
03:30:21,890 --> 03:30:24,681
đang được kiểm tra và\ncập nhật sau mỗi lần

3681
03:30:24,681 --> 03:30:32,551
thực hiện điều tương tự như những gì chúng ta đã thấy\n

3682
03:30:35,011 --> 03:30:37,052
Tôi nghĩ hầu hết mọi người\ncó lẽ cuối cùng sẽ sử dụng

3683
03:30:37,052 --> 03:30:42,570
một vòng lặp for đã từng thoải mái, nhưng chỉ\n

3684
03:30:42,570 --> 03:30:45,671
Được rồi, có bất kỳ câu hỏi nào, sau đó,\n

3685
03:30:47,923 --> 03:30:49,631
DAVID J. Malan: Vòng lặp for\n và vòng lặp while

3686
03:30:49,630 --> 03:30:53,140
cả hai đều có thể được sử dụng để thực hiện\điều tương tự.

3687
03:30:53,140 --> 03:30:56,733
Có những khác biệt nhỏ\nvề vấn đề phạm vi

3688
03:30:56,733 --> 03:30:58,691
điều mà chúng ta sẽ thảo luận trước\ntừ lâu, khi nào bạn

3689
03:30:58,691 --> 03:31:00,921
tạo một biến trong vòng lặp for--

3690
03:31:00,921 --> 03:31:04,390
hãy chú ý rằng, một lần nữa, nó nằm bên trong\nnhững dấu ngoặc đơn đó,

3691
03:31:04,390 --> 03:31:08,831
về mặt kỹ thuật có nghĩa là nó chỉ đi\n

3692
03:31:08,831 --> 03:31:12,581
Ngược lại, với vòng lặp while,\ntôi đã khai báo biến của mình ở bên ngoài

3693
03:31:13,210 --> 03:31:17,030
Biến đó sẽ tiếp tục\n

3694
03:31:17,031 --> 03:31:20,008
Đó là một trong những khác biệt nhỏ ở đó.

3695
03:31:20,591 --> 03:31:22,871
Nhưng bạn sẽ thấy một số người khác theo thời gian.

3696
03:31:22,870 --> 03:31:26,090
Được rồi, vậy nên chúng tôi khẳng định\nrằng nó tốt hơn ở một khía cạnh nào đó

3697
03:31:27,290 --> 03:31:29,331
Vì vậy, hãy thực sự quay trở lại mã.

3698
03:31:29,331 --> 03:31:33,831
Hãy để tôi tiếp tục và bây giờ thực hiện lại\n

3699
03:31:33,831 --> 03:31:39,701
Vậy còn với int i\n= 0, i nhỏ hơn 3, i .

3700
03:31:39,700 --> 03:31:44,440
Sau đó, bên trong dấu ngoặc nhọn của tôi, hãy để tôi đi\n

3701
03:31:44,441 --> 03:31:46,911
bằng một dòng mới và một dấu chấm phẩy.

3702
03:31:46,911 --> 03:31:50,661
Vì vậy tôi đã làm điều đó khá nhanh chỉ vì\n

3703
03:31:50,661 --> 03:31:53,591
Nhưng nếu bây giờ tôi kêu meo meo thì không có lỗi gì cả.

3704
03:31:57,101 --> 03:31:59,230
Nào, bây giờ chúng ta hãy làm những gì\nchúng ta đã làm tuần trước, đó là

3705
03:31:59,230 --> 03:32:03,501
là bắt đầu tạo ra những hàm\ntùy chỉnh của riêng chúng tôi, nếu bạn muốn

3706
03:32:03,501 --> 03:32:09,431
bằng cách sử dụng cái riêng của chúng tôi trong C. Vậy đây là\n

3707
03:32:09,431 --> 03:32:13,841
nhưng dần dần chúng tôi sẽ giải thích điều gì\n

3708
03:32:13,841 --> 03:32:17,201
Nếu tôi muốn tạo một\nhàm có tên meow--

3709
03:32:17,200 --> 03:32:21,280
vì tác giả của C không tạo ra\n

3710
03:32:21,281 --> 03:32:23,951
Tôi cần đặt cho nó một cái tên, như meo meo.

3711
03:32:23,950 --> 03:32:26,530
Tôi cần chỉ định xem\nit có nhận bất kỳ đầu vào nào không.

3712
03:32:26,531 --> 03:32:28,391
Bây giờ, tôi sẽ nói không.

3713
03:32:28,390 --> 03:32:34,200
Và tôi sẽ nói rõ ràng là không\n

3714
03:32:34,200 --> 03:32:37,080
Nó cũng cần thiết khi\thực hiện một hàm trong C--

3715
03:32:37,081 --> 03:32:38,851
điều không cần thiết trong Scratch--

3716
03:32:38,851 --> 03:32:41,411
để chỉ định kiểu trả về của nó là gì.

3717
03:32:41,411 --> 03:32:45,060
Nhưng bây giờ, tôi chỉ định nói\n

3718
03:32:46,591 --> 03:32:49,531
và đó là ý nghĩa của dấu ngoặc đơn void\nin--

3719
03:32:49,531 --> 03:32:54,091
và nó không trả về\bất cứ điều gì giống như yêu cầu đã làm

3720
03:32:54,091 --> 03:32:56,220
hoặc như get_string hoặc get_int nào.

3721
03:32:56,220 --> 03:32:59,940
mục đích sống của meo chỉ là\n

3722
03:32:59,941 --> 03:33:01,990
bằng cách in một cái gì đó trên màn hình.

3723
03:33:01,990 --> 03:33:04,261
Vậy meo meo sẽ làm gì?

3724
03:33:04,261 --> 03:33:06,480
Tôi sẽ có nó\nnói đơn giản là printf

3725
03:33:06,480 --> 03:33:10,290
trích dẫn không trích dẫn, "meo meo", dấu gạch chéo ngược n.

3726
03:33:10,290 --> 03:33:14,670
Và bây giờ, giống như trong\nScratch, bây giờ tôi có thể gọi

3727
03:33:14,671 --> 03:33:16,831
một chức năng hoàn toàn mới gọi là meo meo.

3728
03:33:16,831 --> 03:33:19,531
Và đây cũng là nơi nếu bạn\nthực sự không thích dấu ngoặc nhọn

3729
03:33:19,531 --> 03:33:22,591
về mặt kỹ thuật, bạn có thể\ngloại bỏ chúng khi có

3730
03:33:22,591 --> 03:33:24,810
chỉ một dòng mã trong vòng lặp của bạn.

3731
03:33:24,810 --> 03:33:27,511
Nhưng, một lần nữa, về mặt văn phong,\ntôi khuyến khích

3732
03:33:27,511 --> 03:33:30,511
bạn hãy gìn giữ chúng để làm\nsiêu rõ ràng cho chính bạn và những người khác

3733
03:33:32,470 --> 03:33:35,100
Hãy để tôi tiếp tục lưu\ncái này và kêu meo meo.

3734
03:33:39,970 --> 03:33:42,140
DAVID J. Malan: Vâng, vậy\n0 không thuộc về nơi đó.

3735
03:33:49,601 --> 03:33:51,621
Được rồi, nó vẫn hoạt động tốt.

3736
03:33:51,620 --> 03:33:54,770
Nhưng hãy nhớ lại những gì tôi đã làm trong Scratch,\n

3737
03:33:54,771 --> 03:33:57,820
Và để nhấn mạnh, hãy để tôi\nđánh dấu và di chuyển nó

3738
03:33:59,261 --> 03:34:02,291
Bởi vì, một lần nữa, bây giờ meo\tồn tại, đó là một sự trừu tượng.

3739
03:34:02,290 --> 03:34:04,600
Tôi chỉ biết có chức năng kêu meo meo.

3740
03:34:04,601 --> 03:34:06,111
Tôi muốn có thể sử dụng nó.

3741
03:34:08,021 --> 03:34:09,730
Chức năng chính của tôi là như nhau.

3742
03:34:09,730 --> 03:34:12,280
Hãy để tôi tiếp tục và kêu meo meo lần nữa.

3743
03:34:12,281 --> 03:34:17,531
Và bây giờ, chỉ bằng cách di chuyển hàm đó,\n

3744
03:34:17,531 --> 03:34:18,851
Và hãy nhìn vào điều đầu tiên.

3745
03:34:18,851 --> 03:34:21,018
Một lần nữa, quy tắc ngón tay cái\nở đây-- nó hơi nhỏ

3746
03:34:21,018 --> 03:34:25,060
nhưng nó ghi meow.c in đậm-- tức là\n

3747
03:34:25,060 --> 03:34:27,911
5 là số dòng,\nand 20 là ký tự.

3748
03:34:27,911 --> 03:34:30,740
Vì vậy chỉ cần số dòng là đủ.

3749
03:34:32,501 --> 03:34:36,611
Ồ, đây là điều xảy ra\nkhi tôi cuộn lên quá xa.

3750
03:34:37,210 --> 03:34:39,760
Đây là lỗi mà chúng tôi\nđang xem xét, dòng 7.

3751
03:34:39,761 --> 03:34:43,691
Tôi đang xem thông báo lỗi cũ\n

3752
03:34:45,550 --> 03:34:49,780
Được rồi, rõ ràng là C không\n

3753
03:34:49,781 --> 03:34:53,441
Khai báo ngầm của\nhàm meo meo không hợp lệ trong C99.

3754
03:34:54,581 --> 03:34:57,941
Khai báo hàm nghĩa là\nviệc bạn tạo một hàm.

3755
03:34:57,941 --> 03:35:01,511
Giống như, tôi đang tuyên bố rằng meow\nexts tồn tại, nhưng rõ ràng là tôi chưa

3756
03:35:02,501 --> 03:35:06,230
Và C99 là phiên bản của C từ năm 1999

3757
03:35:06,230 --> 03:35:09,190
mà chúng tôi thường sử dụng ở đây, đó là\n

3758
03:35:12,460 --> 03:35:16,030
Bạn có thể suy luận từ thực tế đơn thuần\n

3759
03:35:16,031 --> 03:35:19,041
của tập tin-- thì ổn\nin Scratch nhưng bây giờ thì tệ--

3760
03:35:21,865 --> 03:35:23,990
DAVID J. Malan: Vâng, C là một kiểu trường học cũ.

3761
03:35:23,990 --> 03:35:25,681
Nó đọc mã của bạn từ trên xuống dưới.

3762
03:35:25,681 --> 03:35:30,001
Và nếu nó không biết meo meo\n

3763
03:35:30,001 --> 03:35:32,911
nó chỉ hoảng loạn và in\n ra những thông báo lỗi này.

3764
03:35:32,911 --> 03:35:38,511
Vì vậy, giải pháp khá đơn giản là đừng\n

3765
03:35:38,511 --> 03:35:42,470
Nhưng bạn có thể tưởng tượng việc này sẽ nhận được\n

3766
03:35:42,470 --> 03:35:46,761
bởi vì theo tên, main là\nphần chính của chương trình của bạn.

3767
03:35:46,761 --> 03:35:49,970
Và thành thật mà nói, sẽ thật tuyệt\nnếu chính luôn luôn là

3768
03:35:51,099 --> 03:35:53,390
Bởi vì nếu bạn muốn\nhiểu một tập tin đang làm gì

3769
03:35:53,390 --> 03:35:55,400
thật hợp lý khi\nđọc nó từ trên xuống dưới.

3770
03:35:55,400 --> 03:35:57,575
Vâng, có một giải pháp cho việc này.

3771
03:35:57,575 --> 03:36:02,720
Bạn có thể đặt các hàm khác nhau\n

3772
03:36:02,720 --> 03:36:07,501
với tư cách là bạn-- và đây có lẽ là\n

3773
03:36:07,501 --> 03:36:10,671
miễn là bạn để lại một ít\nbreadcrumb cho trình biên dịch

3774
03:36:10,671 --> 03:36:13,130
ở đầu\ntệp của bạn theo đúng nghĩa đen

3775
03:36:13,130 --> 03:36:17,090
lặp lại giá trị trả về,\ntên và các đối số

3776
03:36:17,091 --> 03:36:19,681
cho hàm đó, dấu chấm phẩy.

3777
03:36:19,681 --> 03:36:22,791
Có thể nói, đây là\nkhai báo hàm của bạn--

3778
03:36:22,790 --> 03:36:25,260
và theo cách thực sự thú vị\nis đây là một nguyên mẫu.

3779
03:36:25,261 --> 03:36:27,541
Nó giống như,\nthứ này sẽ trông như thế nào?

3780
03:36:27,540 --> 03:36:30,480
Nhưng dấu chấm phẩy có nghĩa là tôi\nsẽ chưa giải quyết vấn đề này.

3781
03:36:30,480 --> 03:36:32,331
Thực ra tôi\nsẽ định nghĩa hàm

3782
03:36:32,331 --> 03:36:34,701
hoặc triển khai nó ở bên dưới đây.

3783
03:36:34,700 --> 03:36:36,680
Đây là một chi tiết ngu ngốc.

3784
03:36:36,681 --> 03:36:40,221
Các ngôn ngữ gần đây hơn\nloại bỏ nhu cầu này

3785
03:36:40,220 --> 03:36:41,993
bạn có thể đặt các chức năng của mình theo bất kỳ thứ tự nào.

3786
03:36:41,994 --> 03:36:43,911
Nhưng, một lần nữa, nếu bạn chỉ\nnghĩ về những điều cơ bản

3787
03:36:43,911 --> 03:36:46,230
của các ngôn ngữ lập trình\nnhư ngôn ngữ này ở đây--

3788
03:36:47,210 --> 03:36:49,350
nó chắc chắn chỉ đang đọc\nmã của bạn từ trên xuống dưới.

3789
03:36:49,351 --> 03:36:53,060
Thật khó chịu, vâng, nhưng\giải thích, vâng.

3790
03:36:53,060 --> 03:36:58,280
Vậy hãy để tôi tiếp tục và làm một cái meo meo\n

3791
03:36:58,281 --> 03:37:02,331
Và hãy để tôi thực hiện một cải tiến cuối cùng\ncho chương trình meo meo này tại đây.

3792
03:37:02,331 --> 03:37:05,220
Bây giờ hãy để tôi tiếp tục và\nnói điều gì đó như thế này.

3793
03:37:05,220 --> 03:37:07,190
Hãy để tôi tiếp tục và nói,\nđược rồi, phải không

3794
03:37:07,191 --> 03:37:12,941
thật tuyệt nếu chức năng meo meo của tôi có thể làm được\n

3795
03:37:12,941 --> 03:37:14,701
Vì vậy, giả sử tôi muốn làm điều này.

3796
03:37:14,700 --> 03:37:17,870
Chức năng meo meo này hiện tại\sẽ kêu meo meo ba lần.

3797
03:37:17,870 --> 03:37:21,110
Nhưng giả sử tôi muốn kêu meo\nn lần, trong đó n chỉ

3798
03:37:21,111 --> 03:37:23,181
một số số do người dùng cung cấp.

3799
03:37:23,181 --> 03:37:27,560
Vâng, giống như trong Scratch,\ncác hàm tùy chỉnh có thể nhận dữ liệu đầu vào

3800
03:37:27,560 --> 03:37:30,120
Hiện tại tôi chỉ đang nói vô hiệu.

3801
03:37:30,120 --> 03:37:34,550
Nhưng nếu tôi thay đổi nó thành int n,\ndo đó sẽ báo cho trình biên dịch

3802
03:37:34,550 --> 03:37:38,150
này, meo vẫn không\ntrả lại thứ gì đó

3803
03:37:38,150 --> 03:37:40,581
nhưng nó lấy một cái gì đó làm đầu vào.

3804
03:37:40,581 --> 03:37:43,581
Nó cần một số nguyên,\nvà tôi muốn gọi nó là n.

3805
03:37:43,581 --> 03:37:46,070
Vậy đây là một cách khác\nđể khai báo một biến

3806
03:37:46,070 --> 03:37:48,890
nhưng một cách khai báo một\nbiến được đưa vào

3807
03:37:50,431 --> 03:37:55,101
Vậy bây giờ nếu tôi thắt chặt phần chính ở đây, ngay bây giờ\n

3808
03:37:55,101 --> 03:37:58,551
giống như trong Scratch, đó là cái này.

3809
03:37:58,550 --> 03:38:01,040
Nếu bây giờ tôi nhìn vào\ncode-- để tôi phóng to ở đây--

3810
03:38:01,040 --> 03:38:04,310
bây giờ chương trình chính của tôi thực sự\nđược viết rất hay theo đúng nghĩa

3811
03:38:04,310 --> 03:38:07,190
rằng nó chỉ nói những gì nó\nlàm, kêu meo meo ba lần.

3812
03:38:07,191 --> 03:38:11,031
Tuy nhiên, điều này có tác dụng vì tôi\n

3813
03:38:11,031 --> 03:38:17,691
một số nguyên tên là n, sau đó sử dụng\n

3814
03:38:18,771 --> 03:38:21,271
Bạn có thể đã mắc phải một sai lầm của tôi.

3815
03:38:21,271 --> 03:38:25,101
Tôi cũng phải tự nhắc nhở mình\nở đây để thực hiện sự thay đổi đó.

3816
03:38:25,101 --> 03:38:27,891
Một lần nữa, đây là một trong những\ndư thừa hoặc sao chép-dán

3817
03:38:29,511 --> 03:38:32,031
Nhưng ở đó, bây giờ tôi có một phiên bản tốt hơn.

3818
03:38:32,031 --> 03:38:36,381
Vậy hãy để tôi tiếp tục và chạy lại\ncái này, kêu meo meo, ./meow.

3819
03:38:36,980 --> 03:38:39,530
Vì vậy, một lần nữa, độ chính xác không thay đổi nhưng bây giờ

3820
03:38:39,531 --> 03:38:41,391
một lần nữa, chúng tôi đang\nmô-đun hóa mã của mình.

3821
03:38:41,390 --> 03:38:44,720
Và, chết tiệt, điều bạn có thể làm bây giờ-- và\n

3822
03:38:45,501 --> 03:38:48,320
những tập tin tiêu đề mà chúng ta đã nói đến\ntrước đây, những thư viện đó

3823
03:38:48,320 --> 03:38:51,050
đây chính là kiểu mô-đun hóa\nchúng ta đang nói đến.

3824
03:38:51,050 --> 03:38:54,921
Chúng tôi, nhân viên, đã viết một hàm tên là\n

3825
03:38:54,921 --> 03:39:01,191
chúng tôi đặt nó vào một tập tin có tên CS50, và chúng tôi\n

3826
03:39:01,191 --> 03:39:03,381
những thứ này được gọi là nguyên mẫu--

3827
03:39:05,570 --> 03:39:10,251
Để khi tất cả các bạn, với tư cách là những\nlập trình viên đầy tham vọng, hãy đưa cs50.h vào

3828
03:39:10,251 --> 03:39:14,300
bạn đang bí mật nói với\n

3829
03:39:14,300 --> 03:39:16,290
menu các chức năng có sẵn là gì.

3830
03:39:16,790 --> 03:39:21,560
Bởi vì trong CS50 có những dòng như\nnày-- rõ ràng là không dành cho meo meo

3831
03:39:21,560 --> 03:39:24,140
nhưng đối với get_string,\nget_int, v.v.

3832
03:39:24,140 --> 03:39:29,540
Và stdio.h là cùng một dòng\nof mã cho những thứ như printf.

3833
03:39:29,540 --> 03:39:31,740
Đó là tất cả những gì đang diễn ra ở đó.

3834
03:39:31,740 --> 03:39:38,040
Đó chỉ là một cách để thông báo cho máy tính\n

3835
03:39:38,040 --> 03:39:40,920
Được rồi, có câu hỏi nào\nvề những điều này ở đây không?

3836
03:39:44,310 --> 03:39:47,130
Vậy nên nếu bạn không phiền, tôi\nmuốn tiếp tục vẫy tay

3837
03:39:47,130 --> 03:39:49,050
tay tôi ở chi tiết đó cho ngày hôm nay.

3838
03:39:49,050 --> 03:39:53,581
Quả thực, int main void có chút kỳ lạ,\n

3839
03:39:53,581 --> 03:39:55,667
Chúng tôi chưa có cơ chế\nđể cung cấp thông tin đầu vào.

3840
03:39:55,667 --> 03:39:57,751
Và việc\nmain trả lại bất kỳ thứ gì có ý nghĩa gì?

3841
03:39:57,751 --> 03:39:59,251
Giống như, nó đang quay trở lại với ai?

3842
03:39:59,251 --> 03:40:00,378
Để một ngày khác, nếu có thể.

3843
03:40:00,378 --> 03:40:02,461
Chúng sắp bắt đầu\nchơi nhưng hiện tại

3844
03:40:02,460 --> 03:40:05,100
hôm nay chỉ là thứ bạn\nnên coi theo mệnh giá

3845
03:40:05,101 --> 03:40:08,320
khi cần thiết hãy sao chép-dán\nđể bắt đầu chương trình.

3846
03:40:08,320 --> 03:40:11,490
Vậy meo meo là một hàm nhận\n

3847
03:40:11,490 --> 03:40:14,970
nhưng thực tế nó không có giá trị trả về\n, do đó nó bị bỏ trống.

3848
03:40:14,970 --> 03:40:17,520
Nhưng điều gì sẽ xảy ra nếu chúng ta thực sự muốn\ntạo ra hàm riêng của mình

3849
03:40:17,521 --> 03:40:20,431
không chỉ lấy 0 hoặc\nnhiều đầu vào làm đối số

3850
03:40:20,431 --> 03:40:24,060
nhưng cũng trả về một giá trị nào đó, có thể là\n

3851
03:40:24,990 --> 03:40:27,640
Ồ, hóa ra là trong C,\nchúng ta cũng có thể làm điều đó.

3852
03:40:27,640 --> 03:40:31,081
Hãy để tôi tiếp tục và tạo một\ntệp mới ở đây có tên là giảm giá.

3853
03:40:31,081 --> 03:40:33,121
Và hãy triển khai một\nchương trình nhanh chóng qua đó

3854
03:40:33,120 --> 03:40:35,640
chúng tôi có thể giảm giá\nthông thường theo một số phần trăm

3855
03:40:35,640 --> 03:40:37,740
như thể đang có đợt giảm giá\nđang diễn ra trong cửa hàng.

3856
03:40:37,740 --> 03:40:44,490
Hãy để tôi tiếp tục và thêm vào thông lệ của chúng ta\n

3857
03:40:44,490 --> 03:40:47,550
Hãy để tôi cho mình một khoảng trống chính như trước.

3858
03:40:47,550 --> 03:40:50,380
Và bên trong main, hãy bắt đầu và làm điều gì đó đơn giản.

3859
03:40:50,380 --> 03:40:52,470
Hãy tự tạo cho mình một\nfloat được gọi là thường xuyên

3860
03:40:52,470 --> 03:40:55,350
đại diện cho\ngiá thông thường của một thứ gì đó trong cửa hàng.

3861
03:40:55,351 --> 03:40:58,111
Hãy tiếp tục và nhận được float\ntừ người dùng yêu cầu họ

3862
03:41:00,480 --> 03:41:04,740
Sau đó, tiếp theo, chúng ta hãy tiếp tục và khai báo\n

3863
03:41:04,740 --> 03:41:07,950
được gọi là bán hàng, cuối cùng\nbiểu thị giá bán

3864
03:41:07,950 --> 03:41:09,810
sau khi giảm giá một số phần trăm.

3865
03:41:09,810 --> 03:41:13,020
Và hãy tiếp tục\nchỉ cần tính toán mức độ thông thường là bao nhiêu.

3866
03:41:13,021 --> 03:41:15,851
Và giả sử, mức giảm giá 15% là mức giảm giá\nkhá tốt.

3867
03:41:15,851 --> 03:41:20,471
Vì vậy, hãy tiếp tục và giảm giá\nthông thường, bất kể đó là gì, 15%

3868
03:41:20,470 --> 03:41:23,911
tất nhiên là tương đương với\n

3869
03:41:25,681 --> 03:41:30,126
Tất nhiên, nếu chúng tôi giảm 15%,\n

3870
03:41:30,126 --> 03:41:32,251
Bây giờ, hãy tiếp tục và\nin kết quả ra đây.

3871
03:41:32,251 --> 03:41:36,271
Hãy để tôi tiếp tục và nói\nin giá bán, dấu hai chấm--

3872
03:41:36,271 --> 03:41:38,941
hãy để tôi tiếp tục và %f,\nnhưng cụ thể hơn

3873
03:41:38,941 --> 03:41:43,951
%.2f vì, ít nhất là bằng tiền Mỹ\n

3874
03:41:45,751 --> 03:41:48,630
Sau đó hãy để tôi tiếp tục\ncắm vào giá trị bán hàng.

3875
03:41:48,630 --> 03:41:52,230
Được rồi, hãy xuống đây\nvà giảm giá, Enter.

3876
03:41:52,230 --> 03:41:54,780
Cho đến nay, rất tốt-- ./discount.

3877
03:41:54,781 --> 03:41:57,001
Và giá thông thường có thể là 100 USD.

3878
03:41:57,001 --> 03:41:59,560
Vì vậy, giá bán phải là $85.

3879
03:41:59,560 --> 03:42:01,483
Vì vậy số học của chúng ta\ncó vẻ đúng ở đây.

3880
03:42:01,483 --> 03:42:02,941
Nhưng bây giờ chúng ta hãy tua nhanh về thời gian.

3881
03:42:02,941 --> 03:42:04,801
Giả sử chúng ta thấy mình đang giảm giá

3882
03:42:04,800 --> 03:42:07,727
rất nhiều mức giá trong một\nứng dụng, có thể là một trang web

3883
03:42:07,727 --> 03:42:10,560
như Amazon nơi họ đang cung cấp\n

3884
03:42:10,560 --> 03:42:13,200
Và thật tuyệt khi có\na chức năng có thể tái sử dụng

3885
03:42:13,200 --> 03:42:16,420
chỉ thực hiện phép tính này cho\nus, mặc dù nó có thể đơn giản.

3886
03:42:16,421 --> 03:42:18,511
Vì vậy hãy tiếp tục\nsửa đổi mức giảm giá lần này

3887
03:42:18,511 --> 03:42:22,051
để tự cung cấp cho mình\nchức năng riêng được gọi là giảm giá

3888
03:42:22,050 --> 03:42:23,778
ví dụ: cần có đầu vào--

3889
03:42:23,778 --> 03:42:25,861
giống như mức giá thông thường\nmà bạn muốn giảm giá--

3890
03:42:25,861 --> 03:42:28,073
và sau đó nó cũng trả về một giá trị.

3891
03:42:28,073 --> 03:42:29,281
Nó không chỉ in nó ra.

3892
03:42:29,281 --> 03:42:34,081
Nó trả về một giá trị, cụ thể là một float\n

3893
03:42:34,081 --> 03:42:37,230
Vậy hãy để tôi đi xuống\nbên dưới phần chính và tiếp tục

3894
03:42:37,230 --> 03:42:39,900
và xác định một hàm sẽ trả về một float

3895
03:42:39,900 --> 03:42:42,118
bởi vì chúng ta vẫn đang giao dịch\nvới số tiền bằng đô la.

3896
03:42:42,118 --> 03:42:43,951
Chức năng này sẽ\nđược gọi là giảm giá.

3897
03:42:43,950 --> 03:42:47,970
Và nó sẽ cần một đầu vào, như\n

3898
03:42:47,970 --> 03:42:50,171
Ở đây, tôi sẽ làm\nmột việc rất đơn giản.

3899
03:42:50,171 --> 03:42:55,810
Tôi định nói bán thả nổi bằng\n

3900
03:42:55,810 --> 03:42:58,052
Và sau đó tôi sẽ tiếp tục và trả lại hàng đã bán.

3901
03:42:58,052 --> 03:43:00,511
Bây giờ, về vấn đề đó, tôi thực sự có thể thắt chặt điều này lại một chút.

3902
03:43:00,511 --> 03:43:04,081
Nếu tôi chỉ khai báo một biến\nđể lưu trữ một giá trị mà tôi đang

3903
03:43:04,081 --> 03:43:09,191
quay lại với từ khóa này return, tôi\n

3904
03:43:09,191 --> 03:43:11,041
Vì vậy, tôi có thể xóa dòng thứ hai.

3905
03:43:11,040 --> 03:43:13,680
Và tôi thực sự có thể tiếp tục\nvà loại bỏ biến đó

3906
03:43:13,681 --> 03:43:16,291
hoàn toàn và ngay lập tức\ntrả về bất kỳ số học nào

3907
03:43:16,290 --> 03:43:20,161
kết quả là lấy giá đầu vào,\n

3908
03:43:21,900 --> 03:43:25,681
Vì vậy, chức năng rất đơn giản\nthực hiện việc giảm giá cho tôi.

3909
03:43:25,681 --> 03:43:29,011
Như mọi khi, hãy để tôi\ntiếp tục và sao chép-dán--

3910
03:43:29,011 --> 03:43:32,251
lần duy nhất được phép sao chép-dán--\n

3911
03:43:32,251 --> 03:43:35,341
ở đầu tệp, để\nkhi biên dịch mã này

3912
03:43:35,341 --> 03:43:38,611
main đã thấy\ntừ giảm giá trước đây.

3913
03:43:38,611 --> 03:43:40,271
Và bây giờ hãy để tôi đi vào mã ở đây.

3914
03:43:40,271 --> 03:43:43,411
Và thay vì tự mình làm\ntoán tính toán trong main

3915
03:43:43,411 --> 03:43:46,470
hãy để tôi đoán rằng chúng ta đã có một số chức năng rồi

3916
03:43:46,470 --> 03:43:50,790
trong bộ công cụ của chúng tôi có tên là giảm giá\n

3917
03:43:52,845 --> 03:43:54,970
Và ở dưới đây, mã của tôi\nkhông cần thay đổi.

3918
03:43:54,970 --> 03:43:58,200
Tôi vẫn sẽ in ra\nbán biến mà tôi đang

3919
03:43:58,200 --> 03:44:00,440
lưu trữ kết quả đó. Nhưng\nhãy chú ý những gì tôi đã làm ở đây.

3920
03:44:00,441 --> 03:44:02,191
Tôi đã trừu tượng hóa\ncách khái niệm

3921
03:44:02,191 --> 03:44:06,091
về việc được giảm giá bằng cách tạo\n của tôi

3922
03:44:06,091 --> 03:44:07,951
giá hoặc bất cứ thứ gì khác làm đầu vào.

3923
03:44:07,950 --> 03:44:10,440
Nó thực hiện một chút phép toán,\nmặc dù ở đây nó đơn giản

3924
03:44:10,441 --> 03:44:12,011
và sau đó nó trả về một giá trị.

3925
03:44:12,011 --> 03:44:14,941
Nhưng lưu ý rằng giảm giá\nis không in giá trị đó.

3926
03:44:14,941 --> 03:44:17,191
Nghĩa đen là sử dụng\ntừ khóa khác có tên này

3927
03:44:17,191 --> 03:44:21,811
hãy quay lại để tôi có thể trao lại thứ đó\n

3928
03:44:21,810 --> 03:44:25,411
trả lại một giá trị, giống như get_int\n

3929
03:44:25,411 --> 03:44:29,851
cho bạn-- để tôi lên đây\nline 9 có thể tiếp tục và lưu trữ

3930
03:44:29,851 --> 03:44:33,721
giá trị đó trong một biến nếu tôi muốn\n

3931
03:44:33,720 --> 03:44:38,440
Hãy để tôi tiếp tục và biên dịch lại\nmã này với ưu đãi chiết khấu.

3932
03:44:38,441 --> 03:44:40,381
Hãy để tôi tiếp tục và thực hiện ./discount.

3933
03:44:43,040 --> 03:44:46,530
Giá bán cũng sẽ là $85.

3934
03:44:46,531 --> 03:44:50,721
Bây giờ, hóa ra các chức năng đó không\n

3935
03:44:51,261 --> 03:44:53,240
Họ thực sự có thể mất 2 hoặc 3 hoặc nhiều hơn.

3936
03:44:53,240 --> 03:44:57,200
Vì vậy, trên thực tế, giả sử bây giờ chúng ta muốn

3937
03:44:57,200 --> 03:45:01,400
và lấy làm đầu vào cho khoản giảm giá\n

3938
03:45:01,400 --> 03:45:03,890
mà tôi muốn giảm giá nhưng\ncũng muốn giảm phần trăm

3939
03:45:03,890 --> 03:45:08,150
qua đó cho phép chúng tôi hỗ trợ không chỉ\n

3940
03:45:08,870 --> 03:45:13,610
Thôi để tôi lên đây khai báo\n

3941
03:45:13,611 --> 03:45:15,951
Và để tôi hỏi người dùng\nbao nhiêu phần trăm

3942
03:45:15,950 --> 03:45:17,810
điểm họ muốn cất cánh.

3943
03:45:17,810 --> 03:45:21,501
Vì vậy tôi sẽ nói phần trăm_off\nin bên trong lời nhắc ở đây

3944
03:45:21,501 --> 03:45:23,751
lấy int đó gọi là phần trăm_off.

3945
03:45:23,751 --> 03:45:26,871
Và bây giờ ngoài việc\nchuyển thông thường làm đầu vào

3946
03:45:26,870 --> 03:45:30,800
sang hàm giảm giá, tôi\ncũng sẽ chuyển phần trăm_off.

3947
03:45:30,800 --> 03:45:34,820
Nhưng tôi cần nói với máy tính\n

3948
03:45:34,820 --> 03:45:37,130
và cách tôi làm điều này\nis chỉ bằng dấu phẩy

3949
03:45:37,130 --> 03:45:39,380
ở dưới đây theo định nghĩa riêng của hàm\n.

3950
03:45:39,380 --> 03:45:43,610
Đây sẽ là tỷ lệ phần trăm\nargument, đối số thứ hai

3951
03:45:44,511 --> 03:45:50,091
Và bây giờ tôi sẽ sử dụng nó\n

3952
03:45:50,091 --> 03:45:53,480
Tôi không muốn chỉ tính phần trăm\n

3953
03:45:53,480 --> 03:45:56,744
điều đó sẽ tăng\nquy mô của tổng giá.

3954
03:45:56,744 --> 03:45:59,661
Thực ra tôi cần phải làm một chút\n

3955
03:45:59,661 --> 03:46:03,380
giảm phần trăm, chẳng hạn như số\n15 cho 15 điểm phần trăm

3956
03:46:03,380 --> 03:46:06,590
Tôi cần phải trừ 100\nđiểm phần trăm đó

3957
03:46:06,591 --> 03:46:08,871
do đó cho tôi 100 trừ 15--

3958
03:46:09,710 --> 03:46:13,130
Và bây giờ tôi cần chia\nsố đó cho 100 theo thứ tự

3959
03:46:13,130 --> 03:46:18,030
để tự trả cho mình 0,85 lần\ngiá đã được chuyển vào.

3960
03:46:18,031 --> 03:46:22,911
Nhưng nếu bây giờ tôi tiếp tục và lưu cái này,\n

3961
03:46:22,911 --> 03:46:24,890
Tôi nhận thấy rằng thực sự tôi đã gặp lỗi ở đây.

3962
03:46:26,300 --> 03:46:28,220
Chà, tôi cũng cần thay đổi\nnguyên mẫu đó.

3963
03:46:28,220 --> 03:46:30,718
Và một lần nữa, phải thừa nhận rằng đây là khía cạnh khó chịu của C

3964
03:46:30,718 --> 03:46:32,510
rằng bạn phải duy trì\nsự nhất quán ở đây.

3965
03:46:33,177 --> 03:46:35,390
Tôi sắp đi lên\nđây, đổi cái này thành int

3966
03:46:35,390 --> 03:46:37,640
tỷ lệ phần trăm-- viết sai chính tả.

3967
03:46:37,640 --> 03:46:40,581
Và bây giờ hãy để tôi thử lại\nbiên dịch, giảm giá

3968
03:46:40,581 --> 03:46:42,111
vượt qua các ngón tay của tôi lần này.

3969
03:46:42,111 --> 03:46:46,701
Làm việc ổn. ./giảm giá, và thì đấy, 100 đô la.

3970
03:46:46,700 --> 03:46:49,220
Và giảm phần trăm, chẳng hạn, 15 điểm.

3971
03:46:52,980 --> 03:46:55,310
Bây giờ, điều đáng lưu ý\nlà tôi đã cố tình

3972
03:46:55,310 --> 03:46:58,400
trả về kết quả\nmath của tôi từ hàm này.

3973
03:46:58,400 --> 03:47:01,790
Tôi chưa làm phép tính trên\n

3974
03:47:01,790 --> 03:47:03,950
Trên thực tế, nếu chúng ta xem\na phiên bản thứ hai này

3975
03:47:03,950 --> 03:47:07,770
nơi chiết khấu hiện đang được áp dụng giá\n

3976
03:47:07,771 --> 03:47:10,041
nhận thấy rằng tôi không làm\nnhững việc như thế này.

3977
03:47:10,040 --> 03:47:14,420
Tôi không chỉ nói giá\nebằng giá nhân 100

3978
03:47:14,421 --> 03:47:18,261
trừ phần trăm chia\ncho 100 và để nguyên ở mức đó.

3979
03:47:18,261 --> 03:47:21,951
Vấn đề ở chỗ\ngiá biến đổi này đang diễn ra

3980
03:47:21,950 --> 03:47:24,290
nằm trong phạm vi chức năng chiết khấu đó.

3981
03:47:24,290 --> 03:47:27,230
Và chúng ta sẽ gặp lại điều này\n

3982
03:47:27,230 --> 03:47:32,091
chỉ đề cập đến nơi mà một\n

3983
03:47:33,210 --> 03:47:36,200
Vậy hóa ra nếu tôi thay đổi giá\n

3984
03:47:36,200 --> 03:47:38,600
hoạt động, điều đó sẽ không có tác dụng lâu dài.

3985
03:47:38,601 --> 03:47:40,310
Nếu tôi thực sự muốn\ngnhận lại kết quả

3986
03:47:40,310 --> 03:47:43,761
tới hàm đã sử dụng hàm\discount, cụ thể là main

3987
03:47:43,761 --> 03:47:47,001
Tôi thực sự cần áp dụng phương pháp này để thực sự quay trở lại

3988
03:47:47,001 --> 03:47:51,720
giá trị một cách rõ ràng để cuối cùng\n

3989
03:47:52,220 --> 03:47:54,345
Được rồi, hãy tiếp tục và\ncó lẽ chúng ta hãy cùng nhau

3990
03:47:54,345 --> 03:47:57,800
sử dụng những thứ cơ bản này theo\nchỉ một vài cách khác nhau.

3991
03:47:57,800 --> 03:48:02,300
Thế còn một trò chơi nhỏ của năm mới nhất, Super Mario Brothers thì sao?

3992
03:48:02,300 --> 03:48:05,661
Và trong Super Mario gốc\n

3993
03:48:05,661 --> 03:48:08,060
vậy là bạn có những\nthế giới cuộn bên này

3994
03:48:08,060 --> 03:48:11,470
trông như thế này nơi có vài đồng xu\n

3995
03:48:11,970 --> 03:48:15,230
Vì vậy chúng ta hãy sử dụng nó như một\nhình ảnh để xem xét làm thế nào trong C có thể

3996
03:48:15,230 --> 03:48:17,060
Tôi bắt đầu tạo\nthứ gì đó mang tính bán đồ họa.

3997
03:48:17,060 --> 03:48:20,270
Giống như, không phải màu sắc thực tế hay sự huyền ảo,\n

3998
03:48:20,271 --> 03:48:23,011
chỉ là việc gì đó giống như in\nout một số dấu chấm hỏi.

3999
03:48:23,011 --> 03:48:26,031
Chà, nếu tôi quay lại đây,\nhãy để tôi tạo tập tin thực sự đó

4000
03:48:30,290 --> 03:48:34,190
Hãy để tôi tiếp tục và thêm\nstdio.h, int main void, một lần nữa

4001
03:48:34,191 --> 03:48:36,320
mà chúng ta sẽ tiếp tục\nsao chép-dán cho ngày hôm nay.

4002
03:48:36,320 --> 03:48:40,431
Và sau đó hãy để tôi tiếp tục và\n

4003
03:48:41,421 --> 03:48:44,609
Được rồi, đây là cái mà chúng ta có thể gọi là nghệ thuật ASCII, mà

4004
03:48:44,609 --> 03:48:47,400
chỉ có nghĩa là đồ họa nhưng thực ra chỉ là\n

4005
03:48:47,400 --> 03:48:52,130
Và nếu tôi tạo Mario và làm ./mario,\n

4006
03:48:52,130 --> 03:48:55,911
như thế này, nhưng đây là sự khởi đầu\ncủa loại bản đồ này cho trò chơi.

4007
03:48:55,911 --> 03:49:00,050
Chà, nếu bây giờ tôi muốn in\n ra những thứ đó một cách linh hoạt

4008
03:49:00,050 --> 03:49:01,730
hãy để tôi quay lại mã của tôi ở đây.

4009
03:49:01,730 --> 03:49:03,831
Và thay vì in\nout tất cả cùng một lúc

4010
03:49:03,831 --> 03:49:08,451
Tôi có thể làm điều gì đó như bốn int i\n

4011
03:49:08,450 --> 03:49:13,230
Và sau đó ở bên trong đây, tôi có thể\n

4012
03:49:13,230 --> 03:49:15,890
Hãy để tôi lưu nó, làm Mario.

4013
03:49:15,890 --> 03:49:20,630
Và, trước nguy cơ thất vọng, quá gần

4014
03:49:20,630 --> 03:49:23,800
nhưng tôi đã phạm sai lầm,\nchỉ là một cách thẩm mỹ ngu ngốc thôi.

4015
03:49:23,800 --> 03:49:25,970
Lời nhắc không có trên dòng mới.

4016
03:49:29,060 --> 03:49:31,810
DAVID J. Malan: Vâng, tôi cần một\n

4017
03:49:35,540 --> 03:49:37,790
Được rồi, không, bởi vì điều đó\nsẽ đặt nó sau tất cả mọi người

4018
03:49:37,790 --> 03:49:40,498
và nó sẽ tạo ra thứ này\n

4019
03:49:40,498 --> 03:49:44,030
Vì vậy, về mặt logic, giống như trong Scratch, hãy đặt\n

4020
03:49:44,751 --> 03:49:48,300
Và chỉ cần in ra, chẳng hạn\không, trích dẫn, bỏ trích dẫn, dòng mới.

4021
03:49:48,300 --> 03:49:51,350
Và bây giờ nếu tôi thực hiện lại lệnh make\nmario, ./mario, OK.

4022
03:49:52,337 --> 03:49:54,171
Nhưng tốt hơn một chút\nđược thiết kế ở chỗ bây giờ tôi

4023
03:49:54,171 --> 03:49:57,390
không lặp lại nhiều lần,\n

4024
03:49:57,390 --> 03:50:00,710
Nhưng hãy làm một\nđiều khác ở đây với Mario.

4025
03:50:00,710 --> 03:50:05,960
Hãy để tôi tiếp tục và hỏi người dùng cách thực hiện\n

4026
03:50:05,960 --> 03:50:09,710
Điều đáng chú ý ở đây là có một cái khác\n

4027
03:50:09,710 --> 03:50:12,170
và nói chung nó được gọi là vòng lặp do\nwhile.

4028
03:50:12,171 --> 03:50:15,711
Vòng lặp do while\ntương tự như vòng lặp while

4029
03:50:15,710 --> 03:50:19,220
nhưng nó kiểm tra điều kiện\ncuối cùng thay vì đầu tiên.

4030
03:50:19,220 --> 03:50:21,038
Nhớ lại trước đó trên\nstrang trình bày, chúng ta đã có lúc

4031
03:50:21,039 --> 03:50:22,581
ngoặc mở, ngoặc đóng.

4032
03:50:22,581 --> 03:50:25,941
Và tôi tiếp tục khẳng định rằng chúng tôi đã kiểm tra\n

4033
03:50:25,941 --> 03:50:29,070
đó là 3 lần trước đó.

4034
03:50:29,070 --> 03:50:32,630
Vòng lặp do while chỉ đảo ngược logic\nđể bạn thực sự có thể

4035
03:50:34,040 --> 03:50:36,380
Ở đầu chương trình này,\ntôi sẽ tiếp tục ngay bây giờ

4036
03:50:36,380 --> 03:50:40,460
và tự tạo cho mình một biến\nn kiểu số nguyên như thế này.

4037
03:50:40,460 --> 03:50:44,870
Và sau đó tôi sẽ làm, theo nghĩa đen,\n

4038
03:50:44,870 --> 03:50:48,590
n bằng get_int-- và tôi sẽ\n hỏi người dùng về chiều rộng

4039
03:50:48,591 --> 03:50:51,441
như số\nký hiệu đô la cần in.

4040
03:50:51,441 --> 03:50:56,031
Và tôi sẽ làm điều này\ntrong khi n nhỏ hơn, chẳng hạn như 1.

4041
03:50:56,031 --> 03:50:59,031
Vì vậy, điều này hơi khó hiểu,\nnhưng điểm khác biệt nổi bật

4042
03:50:59,031 --> 03:51:04,191
biểu thức Boolean bây giờ là\n

4043
03:51:07,380 --> 03:51:11,390
Chà, sự khác biệt\nở đây nếu tôi tạo ra Mario là--

4044
03:51:12,890 --> 03:51:16,620
Tôi cần thêm cs50.h, vì\ntôi hiện đang sử dụng get_int.

4045
03:51:16,620 --> 03:51:22,050
Nếu bây giờ tôi biên dịch phiên bản này\nof Mario và thực hiện ./mario

4046
03:51:22,050 --> 03:51:26,640
vòng lặp do while rất hữu ích khi bạn muốn\n

4047
03:51:26,640 --> 03:51:30,931
rồi kiểm tra một số điều kiện hoặc một số\n

4048
03:51:30,931 --> 03:51:32,461
trong trường hợp này, người dùng đã hợp tác.

4049
03:51:32,460 --> 03:51:35,772
Sẽ vô nghĩa nếu\nngười dùng nhập vào, chẳng hạn như 0

4050
03:51:35,772 --> 03:51:37,230
vì không có việc gì để làm.

4051
03:51:37,230 --> 03:51:39,450
Sẽ thật kỳ lạ nếu\nhọ nói âm 100

4052
03:51:39,450 --> 03:51:41,220
bởi vì điều đó không có ý nghĩa về mặt logic.

4053
03:51:41,220 --> 03:51:46,261
Vì vậy, với cấu trúc đơn giản\nở đây, tôi đang làm như sau

4054
03:51:48,810 --> 03:51:53,077
Hàm ý là ngay sau đó\n

4055
03:51:53,077 --> 03:51:55,411
Tôi sắp thoát ra\nvòng lặp này và tôi đã có được chính mình

4056
03:51:55,411 --> 03:52:00,630
một biến tên là n chứa,\nvề cơ bản một giá trị dương, 1

4057
03:52:03,210 --> 03:52:07,320
Và bây giờ tôi có thể sử dụng cái này,\ví dụ, ở đây, đổi 4 thành n

4058
03:52:07,320 --> 03:52:09,810
vì vậy bây giờ chương trình của tôi hoàn toàn năng động.

4059
03:52:09,810 --> 03:52:13,710
Hãy để tôi tiếp tục và làm\nlàm lại mario, ./mario.

4060
03:52:18,751 --> 03:52:22,140
Và sự khác biệt ở đây với\n

4061
03:52:22,140 --> 03:52:25,320
liên quan đến việc lấy thông tin đầu vào của người dùng,\nkhông có câu hỏi nào để hỏi.

4062
03:52:25,320 --> 03:52:27,161
Người dùng chưa cung cấp cho bạn bất cứ điều gì.

4063
03:52:27,161 --> 03:52:31,111
Vì vậy trước tiên bạn phải làm điều gì đó,\n

4064
03:52:31,111 --> 03:52:35,808
chẳng hạn, nếu con người đã hợp tác\trong trường hợp này.

4065
03:52:35,808 --> 03:52:37,891
Được rồi, tại sao chúng ta không\nchuyển sang điều gì đó

4066
03:52:37,890 --> 03:52:41,940
giống thế này hơn trong cùng một trò chơi,\n

4067
03:52:41,941 --> 03:52:45,481
và cái này giống như một bức tường\nhai chiều đang hiện lên ở đây phải không?

4068
03:52:45,480 --> 03:52:48,480
Nó trông giống như 3 x 3, cho\n

4069
03:52:48,480 --> 03:52:51,931
Và nó giống như được làm bằng gạch vậy\n

4070
03:52:51,931 --> 03:52:53,761
Chà, hóa ra là chúng ta có thể làm tổ--

4071
03:52:53,761 --> 03:52:57,310
tức là kết hợp-- một số\nnhững ý tưởng tương tự như sau.

4072
03:52:57,310 --> 03:53:01,110
Bây giờ hãy để tôi tiếp tục và\nchuyển lại mã này.

4073
03:53:01,111 --> 03:53:05,501
Và tôi sẽ giữ lại vòng lặp\ndo while trước đó.

4074
03:53:05,501 --> 03:53:07,441
Và tôi sẽ hỏi câu hỏi này\n

4075
03:53:07,441 --> 03:53:09,091
kích thước của hình vuông này là bao nhiêu?

4076
03:53:09,091 --> 03:53:13,841
Tôi sẽ giả sử nó là n x\nn, nên 3 x 3, 4 x 4, sao cũng được.

4077
03:53:13,841 --> 03:53:16,621
Vậy tôi sẽ hỏi\nkích thước của hình vuông gạch này.

4078
03:53:18,373 --> 03:53:20,790
Chà, tôi sẽ tiếp tục,\nchẳng hạn, và in ra--

4079
03:53:20,790 --> 03:53:25,907
còn với int i =\n0, i nhỏ hơn n, i .

4080
03:53:25,907 --> 03:53:27,990
Hãy để tôi nói đơn giản\nvà in ra một cái gì đó

4081
03:53:27,990 --> 03:53:32,790
như thế này, chỉ một biểu tượng\nhash duy nhất là một viên gạch

4082
03:53:34,800 --> 03:53:36,270
Được rồi, hãy làm Mario nào.

4083
03:53:38,400 --> 03:53:40,320
Được rồi, gần như vậy rồi.

4084
03:53:41,431 --> 03:53:43,181
Được rồi, nhưng tôi cần nó rộng hơn.

4085
03:53:43,181 --> 03:53:45,751
Vì vậy giải pháp lần trước\nlà loại bỏ dòng mới

4086
03:53:45,751 --> 03:53:49,921
và sau đó có thể đặt\ndòng mới ở đây, sau vòng lặp.

4087
03:53:49,921 --> 03:53:55,951
Được rồi, hãy làm Mario nào,\n

4088
03:53:55,950 --> 03:54:00,480
Được rồi, vì vậy tôi cần phải\nkết hợp hai ý tưởng này bằng cách nào đó.

4089
03:54:00,480 --> 03:54:04,351
Vậy làm thế nào chúng ta có thể giải quyết vấn đề này?

4090
03:54:04,351 --> 03:54:10,591
Tôi muốn in hàng và\ncột, không phải hàng hoặc cột.

4091
03:54:12,630 --> 03:54:15,015
ĐỐI TƯỢNG: Thêm một\nvòng lặp khác trong vòng lặp for.

4092
03:54:15,890 --> 03:54:17,570
Thêm một vòng lặp khác vào vòng lặp for phải không?

4093
03:54:17,570 --> 03:54:21,890
Nếu bạn sử dụng một vòng lặp về mặt khái niệm\n

4094
03:54:21,890 --> 03:54:24,470
xuống dưới cùng rồi\ntrong mỗi hàng, sau đó bạn

4095
03:54:24,470 --> 03:54:26,870
kiểu máy đánh chữ--\nmáy đánh chữ kiểu cũ--

4096
03:54:26,870 --> 03:54:30,020
thích, nhân vật, nhân vật,\n

4097
03:54:30,021 --> 03:54:32,521
Tôi nghĩ chúng tôi có thể làm chính xác\nnhững gì chúng tôi muốn đạt được ở đây.

4098
03:54:33,421 --> 03:54:36,441
Hãy để tôi bỏ dòng này và\nbỏ dòng này ngay bây giờ.

4099
03:54:36,441 --> 03:54:39,201
Và hãy để tôi tự tạo cho mình một vòng lặp khác ở bên trong.

4100
03:54:39,200 --> 03:54:42,920
Và vì tôi đã sử dụng i,\nanother quy ước hợp lý

4101
03:54:42,921 --> 03:54:45,021
ở đây sẽ nói điều gì đó như j.

4102
03:54:45,021 --> 03:54:49,311
Vậy j cũng được 0, j nhỏ hơn n, j .

4103
03:54:49,310 --> 03:54:51,620
Và bây giờ, chuyện gì sẽ xảy ra?

4104
03:54:51,620 --> 03:54:56,180
Hãy để tôi tiếp tục và in ra\n

4105
03:54:56,181 --> 03:54:58,441
Và hãy để tôi lưu và để tôi chạy cái này.

4106
03:54:58,441 --> 03:54:59,990
Hãy để tôi xem chúng ta thân thiết đến mức nào.

4107
03:55:01,970 --> 03:55:06,421
Được rồi, ba, điều đó rõ ràng là sai, nhưng\n

4108
03:55:07,581 --> 03:55:12,890
Bây giờ tôi cần cách khắc phục nào\n

4109
03:55:12,890 --> 03:55:15,200
xuống hàng tiếp theo khi thích hợp?

4110
03:55:17,140 --> 03:55:19,091
Vâng, tôi cần một trong những dấu gạch chéo ngược n này.

4111
03:55:19,091 --> 03:55:23,921
Và bây giờ hãy để tôi thêm một số nhận xét vào\n

4112
03:55:23,921 --> 03:55:30,970
Với mỗi hàng, mỗi cột,\nhãy in một viên gạch--

4113
03:55:30,970 --> 03:55:33,100
chỉ để giải thích logic?

4114
03:55:33,101 --> 03:55:37,810
Và vì vậy tôi thêm nó vào vì\nbây giờ hãy chuyển sang hàng tiếp theo

4115
03:55:37,810 --> 03:55:40,390
Tôi có thể làm điều gì đó như\nthế này với dấu gạch chéo ngược n.

4116
03:55:40,390 --> 03:55:43,751
Vì vậy, đây là nơi nhận xét,\nthực sự, mã giả của tôi

4117
03:55:43,751 --> 03:55:46,730
thực sự đã làm sáng tỏ\ntình hình một chút.

4118
03:55:46,730 --> 03:55:51,353
Hãy để tôi tiếp tục và biên dịch lại\n

4119
03:55:51,353 --> 03:55:53,770
Nó không phải là một hình vuông hoàn hảo,\nchỉ vì những ký hiệu băm này

4120
03:55:53,771 --> 03:55:57,551
cao hơn một chút so với chiều rộng,\n

4121
03:55:57,550 --> 03:56:03,751
Bây giờ tôi đã làm một việc khá ổn\n

4122
03:56:03,751 --> 03:56:08,244
Được rồi, hãy để tôi tạm dừng ở đây\n

4123
03:56:08,244 --> 03:56:10,411
Một lần nữa, mã ngày càng phức tạp hơn một chút

4124
03:56:10,411 --> 03:56:14,115
nhưng chúng tôi chỉ đang xây dựng thêm\n

4125
03:56:14,115 --> 03:56:15,990
với những mảnh ghép\n quen thuộc-- một số biến

4126
03:56:15,990 --> 03:56:17,341
một số vòng lặp, một số điều kiện.

4127
03:56:17,341 --> 03:56:19,411
Tất cả đều giống như trước đây.

4128
03:56:20,880 --> 03:56:22,140
Bạn có thể nhân chuỗi trong C không?

4129
03:56:22,890 --> 03:56:25,807
Nhưng hãy hỏi lại câu hỏi đó trong\n

4130
03:56:25,808 --> 03:56:27,774
và câu trả lời sẽ là có.

4131
03:56:29,880 --> 03:56:32,520
Trong C, bạn phải chỉ định\nkiểu trả về, tên

4132
03:56:32,521 --> 03:56:34,581
của hàm và\đầu vào hoặc đối số

4133
03:56:34,581 --> 03:56:35,831
đến chức năng theo thứ tự đó.

4134
03:56:35,831 --> 03:56:39,181
Và nếu không có cái nào trong số đó có thể áp dụng được,\nbạn viết từ void.

4135
03:56:39,181 --> 03:56:42,060
Vì vậy, câu hỏi tương tự như trước đó, hãy để\ntôi khởi động cái đó trong khoảng một tuần

4136
03:56:42,060 --> 03:56:44,261
và chúng ta sẽ quay lại\nđiều đó và tìm hiểu lý do.

4137
03:56:44,261 --> 03:56:47,281
Nhưng hiện tại, hãy cứ vững tin\n

4138
03:56:47,281 --> 03:56:49,651
Bởi vì main có một chút\nđặc biệt, tương tự như

4139
03:56:51,031 --> 03:56:54,271
Nó cũng có một chút đặc biệt.

4140
03:57:02,411 --> 03:57:05,960
Nếu bạn muốn thoát khỏi\nvòng lặp sớm, bạn có thể làm điều này.

4141
03:57:05,960 --> 03:57:08,320
Vậy hãy để tôi trả lời câu hỏi này theo cách này.

4142
03:57:08,320 --> 03:57:14,390
Một cách thay thế cho vòng lặp do while\n

4143
03:57:15,880 --> 03:57:18,290
vì vậy hãy thực hiện những điều sau mãi mãi--

4144
03:57:18,290 --> 03:57:23,470
hãy để tôi tiếp tục và lấy thêm một inch từ\n

4145
03:57:26,771 --> 03:57:28,611
nghĩa là, một số nguyên dương--

4146
03:57:28,611 --> 03:57:32,411
sau đó tiếp tục và sử dụng\ntừ khóa mới có tên là break.

4147
03:57:32,411 --> 03:57:35,691
Điều này giống hệt với những gì chúng ta vừa làm.

4148
03:57:37,130 --> 03:57:39,671
Nó giống như một vài dòng\nbổ sung, rất nhiều dòng trống.

4149
03:57:39,671 --> 03:57:41,111
Và vì vậy nó chỉ là một sự thay thế.

4150
03:57:41,111 --> 03:57:43,856
Nhưng do while cũng làm điều tương tự\nnhưng chặt chẽ hơn một chút--

4151
03:57:43,855 --> 03:57:47,001
nếu đó là câu trả lời cho câu hỏi của bạn.

4152
03:57:47,001 --> 03:57:51,434
Được rồi, bây giờ chúng ta hãy giới thiệu,\n

4153
03:57:51,433 --> 03:57:53,350
mà tôi gần như đang\nquét dưới tấm thảm

4154
03:57:53,351 --> 03:57:55,781
mặc dù trước đó chúng tôi đã thấy một chút\nbằng chứng về điều này

4155
03:57:55,781 --> 03:57:57,881
khi chúng tôi cố gắng cộng 2\ntỷ và 2 tỷ

4156
03:57:57,880 --> 03:58:02,180
và nó đã tràn số\nbit trong một int, có thể nói như vậy.

4157
03:58:02,181 --> 03:58:06,431
Hãy để tôi tiếp tục và viết mã lại một\nchương trình có tên là máy tính.

4158
03:58:06,431 --> 03:58:09,221
Nhưng bây giờ tôi sẽ tiếp tục\nvà thay đổi nó thành float.

4159
03:58:09,220 --> 03:58:12,820
Vì vậy tôi sẽ đổi x thành float,\n

4160
03:58:12,820 --> 03:58:15,650
Và một lần nữa, một float chỉ là\na giá trị dấu phẩy động

4161
03:58:15,650 --> 03:58:19,070
đó là một cách nói hoa mỹ\n

4162
03:58:19,070 --> 03:58:22,480
Và ở dưới đây, tôi sẽ\ntiếp tục và sử dụng %f cho float.

4163
03:58:22,480 --> 03:58:24,851
Và tôi sẽ tiếp tục\nvà làm một việc nữa.

4164
03:58:24,851 --> 03:58:27,643
Thay vì cộng, tôi muốn làm\n

4165
03:58:29,501 --> 03:58:32,050
Và tôi sẽ tự tặng cho mình\nanmột chiếc phao thứ ba khác tên là z

4166
03:58:32,050 --> 03:58:33,730
như chúng ta đã làm vào đầu ngày hôm nay.

4167
03:58:33,730 --> 03:58:37,331
Và tôi sẽ in ra z\thay vì x và y một cách rõ ràng.

4168
03:58:37,331 --> 03:58:42,011
Vì vậy bây giờ tôi sẽ tiếp tục và\n

4169
03:58:42,011 --> 03:58:44,320
Và hãy làm điều gì đó như, ồ, 2/3.

4170
03:58:47,710 --> 03:58:49,600
Vì vậy, đó là những gì bạn mong đợi hơn.

4171
03:58:52,310 --> 03:58:54,501
Được rồi, 0,1, và một loạt số không.

4172
03:58:54,501 --> 03:58:56,521
Đó cũng chính là điều bạn\n mong đợi.

4173
03:58:56,521 --> 03:58:58,191
Nhưng bây giờ hãy để tôi tò mò một chút.

4174
03:58:58,191 --> 03:59:02,271
Hoá ra là trong C, bạn có thể\n

4175
03:59:03,230 --> 03:59:05,390
Theo mặc định, bạn nhận được khoảng 6 chữ số.

4176
03:59:05,390 --> 03:59:07,850
Giả sử bạn muốn\ncó được chính xác 2 chữ số.

4177
03:59:07,851 --> 03:59:11,816
Bạn có thể nói ngắn gọn hơn là 0,2\n

4178
03:59:11,816 --> 03:59:14,691
Đây là loại điều đó\n

4179
03:59:14,691 --> 03:59:16,911
và bạn thấy rằng, được rồi,\nmã định dạng cho các số float

4180
03:59:16,911 --> 03:59:19,531
sử dụng 0,2 để làm hai dấu thập phân.

4181
03:59:19,531 --> 03:59:23,061
Vì vậy, hãy để tôi tạo lại máy tính\nang, ./máy tính.

4182
03:59:25,501 --> 03:59:28,490
Vì vậy, nó xử lý việc hiển thị các chữ số không có nghĩa cho chúng ta ở đây.

4183
03:59:28,490 --> 03:59:32,181
Và bây giờ hãy để tôi tiếp tục\nvà tính 1/10 và 0,10.

4184
03:59:33,494 --> 03:59:35,661
Chà, có lẽ tôi thực sự muốn\na có độ chính xác cao, phải không?

4185
03:59:35,661 --> 03:59:37,161
Tôi có một chiếc máy tính thực sự mạnh mẽ.

4186
03:59:37,161 --> 03:59:39,681
Hãy để tôi xem 50 số\nsau dấu thập phân.

4187
03:59:39,681 --> 03:59:41,551
Đó là rất nhiều chữ số có nghĩa.

4188
03:59:41,550 --> 03:59:44,341
Hãy để tôi làm lại\nmáy tính-- rất tiếc, lỗi đánh máy.

4189
03:59:44,341 --> 03:59:48,980
Hãy để tôi làm lại máy tính,\n./mario máy tính.

4190
03:59:54,400 --> 03:59:58,390
Khá chắc chắn là như vậy\n

4191
03:59:59,531 --> 04:00:01,239
Được rồi, có lẽ\nđó chỉ là một lỗi.

4192
04:00:02,290 --> 04:00:05,050
OK, điều đó thực sự trở nên thú vị.

4193
04:00:06,400 --> 04:00:10,448
Có vẻ như chương trình của tôi\không thể thực hiện tốt phép cộng--

4194
04:00:10,448 --> 04:00:12,281
cuối cùng chúng tôi gặp phải\nvấn đề lên tới hàng tỷ--

4195
04:00:12,281 --> 04:00:16,861
chúng tôi thậm chí không thể đưa ra những con số rất\nchính xác ở đây.

4196
04:00:19,861 --> 04:00:22,201
Tóm lại, máy tính đang\n gần đúng câu trả lời

4197
04:00:22,200 --> 04:00:25,142
sử dụng nhiều số đó\nsau dấu thập phân.

4198
04:00:25,143 --> 04:00:26,851
Nhưng vấn đề\nvề cơ bản thực sự là

4199
04:00:26,851 --> 04:00:30,101
rất giống với số nguyên\noverflow đó trước đó.

4200
04:00:30,101 --> 04:00:31,801
Và bây giờ tôi đang sử dụng nó như một thuật ngữ nghệ thuật.

4201
04:00:31,800 --> 04:00:36,210
Số nguyên có thể tràn nếu bạn đang cố gắng\n

4202
04:00:37,128 --> 04:00:40,378
Bạn thay đổi tất cả chúng thành một, và\n

4203
04:00:40,378 --> 04:00:42,761
Điều tương tự ở đây, nhưng trong\nngữ cảnh khác của float--

4204
04:00:42,761 --> 04:00:45,060
nếu bạn chỉ có 32\nbit-- hoặc, chết tiệt, nếu chúng ta

4205
04:00:45,060 --> 04:00:48,720
đổi thành gấp đôi và chỉ có 64\n

4206
04:00:50,070 --> 04:00:54,070
Tuy nhiên, khá chắc chắn là có\n

4207
04:00:54,070 --> 04:00:59,040
Trên thế giới, có thể nói là một chiếc máy tính\n

4208
04:00:59,040 --> 04:01:01,413
đại diện cho tất cả\nnhững con số có thể có trên thế giới.

4209
04:01:01,414 --> 04:01:03,331
Bởi vì, một lần nữa,\nkhông có con số vô hạn

4210
04:01:03,331 --> 04:01:06,570
hoán vị 32 hoặc 64 bit.

4211
04:01:06,570 --> 04:01:10,351
Có thể là rất nhiều, hàng tỷ\n

4212
04:01:10,351 --> 04:01:13,771
Và quả thực, đây là phép tính gần đúng nhất\ncủa máy tính

4213
04:01:13,771 --> 04:01:15,971
đến những gì thực sự đang diễn ra ở đó.

4214
04:01:15,970 --> 04:01:18,990
Và đây là một ví dụ về những gì\n

4215
04:01:21,001 --> 04:01:26,341
Sự thiếu chính xác của dấu phẩy động đề cập đến\n

4216
04:01:26,341 --> 04:01:29,341
để biểu thị tất cả\nsố thực có thể 100%

4217
04:01:29,341 --> 04:01:33,118
chính xác, ít nhất là theo mặc định\nin ngôn ngữ như C. Rất may

4218
04:01:33,118 --> 04:01:35,201
trong thế giới khoa học\nmáy tính, v.v.

4219
04:01:35,200 --> 04:01:38,820
có giải pháp cho vấn đề này\n

4220
04:01:38,820 --> 04:01:42,070
Nhưng vấn đề về cơ bản\nis vẫn còn đó.

4221
04:01:42,070 --> 04:01:44,790
Vì vậy có lý do tôi\nthay đổi x và y thành float.

4222
04:01:44,790 --> 04:01:47,050
Hãy xem điều gì sẽ xảy ra nếu chúng ta tua lại một chút.

4223
04:01:47,050 --> 04:01:52,501
Và thay vì sử dụng số float cho x và y,\n

4224
04:01:52,501 --> 04:01:56,161
Và hãy quay lại xa\nvà sử dụng get_int

4225
04:01:56,161 --> 04:01:59,138
từ đó cho chúng ta số nguyên x và y.

4226
04:01:59,138 --> 04:02:01,721
Chúng ta vẫn để z ở dạng float,\nvì vào cuối ngày

4227
04:02:01,720 --> 04:02:04,440
chúng tôi muốn có khả năng xử lý\nphân số hoặc các giá trị dấu phẩy động.

4228
04:02:04,441 --> 04:02:07,381
Nhưng bây giờ hãy tiếp tục và\nin ra giá trị này của z

4229
04:02:07,380 --> 04:02:09,720
bây giờ đã thay đổi x và y thành int.

4230
04:02:09,720 --> 04:02:15,390
tạo máy tính, ./computer và\n

4231
04:02:16,710 --> 04:02:21,960
Và nó không phải là 0,666, và nó\nthậm chí còn không được làm tròn một cách kỳ lạ.

4232
04:02:21,960 --> 04:02:23,760
Lần này tất cả chỉ là số không.

4233
04:02:24,970 --> 04:02:28,770
Chà, hóa ra là C, khi\n

4234
04:02:28,771 --> 04:02:31,771
sẽ luôn cung cấp cho bạn\nmột số nguyên, int.

4235
04:02:31,771 --> 04:02:34,951
Vấn đề là các giá trị dấu phẩy động\n không vừa với int.

4236
04:02:34,950 --> 04:02:37,650
Chỉ phần tích phân ở bên trái\ncủa dấu thập phân mới có.

4237
04:02:37,650 --> 04:02:41,490
Mọi thứ ở trong và ngoài số thập phân\n

4238
04:02:41,490 --> 04:02:44,281
được biết đến như một tính năng trong\nC được gọi là cắt ngắn.

4239
04:02:44,281 --> 04:02:47,591
Khi chia một số nguyên cho một\ninteger, bạn sẽ nhận được một số nguyên.

4240
04:02:47,591 --> 04:02:51,181
Nhưng nếu bạn đang cố gắng lưu trữ\n

4241
04:02:51,181 --> 04:02:54,631
dẫn đến số nguyên đó, C chỉ\nsẽ vứt bỏ mọi thứ

4242
04:02:54,630 --> 04:02:57,421
tại và ngoài dấu thập phân,\nđể lại cho chúng ta trường hợp này

4243
04:02:57,421 --> 04:03:03,521
chỉ trong số 0 so với mức lẽ ra phải là 0,666666, v.v.

4244
04:03:03,521 --> 04:03:05,230
Vì vậy, hãy xem thêm một ví dụ nữa.

4245
04:03:05,229 --> 04:03:06,841
Hãy để tôi quay trở lại thiết bị đầu cuối của tôi ở đây.

4246
04:03:06,841 --> 04:03:08,550
Hãy để tôi làm lại ./computer.

4247
04:03:09,751 --> 04:03:13,751
Lần này, nó phải là\n1.33333, v.v.

4248
04:03:13,751 --> 04:03:20,729
Nhưng xem nào, 4 chia cho 3, cả hai đều là\n

4249
04:03:20,729 --> 04:03:23,761
nhưng ở đó\ncâu trả lời cũng phải là 1,333.

4250
04:03:23,761 --> 04:03:27,871
Nhưng phần dấu phẩy động\nbị cắt bớt hoặc bỏ đi

4251
04:03:30,370 --> 04:03:33,970
Vâng, chắc chắn là chúng ta có thể sử dụng\n

4252
04:03:33,970 --> 04:03:37,591
Nhưng nếu, theo bản chất của chương trình của bạn,\n

4253
04:03:37,591 --> 04:03:40,800
hoặc thậm chí có thể mong mỏi,\nvấn đề tương tự sẽ xảy ra--

4254
04:03:40,800 --> 04:03:44,069
những gì chúng ta thực sự có thể làm được gọi là chuyển đổi kiểu.

4255
04:03:44,069 --> 04:03:47,040
Và chúng ta có thể nói với\nmáy tính một cách rõ ràng rằng chúng ta thực sự

4256
04:03:47,040 --> 04:03:50,229
muốn coi int này như thể\nit là một giá trị dấu phẩy động.

4257
04:03:50,229 --> 04:03:52,020
Và chúng ta có thể làm điều đó cho cả x và y.

4258
04:03:52,021 --> 04:03:55,871
Vậy hãy để tôi quay lại mã của tôi ở đây, và\n

4259
04:03:55,870 --> 04:04:01,260
Tôi có thể chuyển y thành float bằng\n

4260
04:04:01,261 --> 04:04:04,261
bằng cách viết theo nghĩa đen kiểu\nfloat bên trong dấu ngoặc đơn

4261
04:04:05,431 --> 04:04:08,881
Và nếu tôi thực sự muốn nói rõ ràng,\n

4262
04:04:08,880 --> 04:04:12,790
Nhưng nói đúng ra thì thế là đủ\n

4263
04:04:14,069 --> 04:04:19,110
Bây giờ hãy để tôi tiếp tục và thực hiện lại make\ncomputer, ./computer

4264
04:04:19,111 --> 04:04:21,900
và hãy thử 2 chia cho 3.

4265
04:04:21,899 --> 04:04:25,139
Và bây giờ, chúng ta quay lại với\ncâu trả lời gần đúng hơn.

4266
04:04:25,139 --> 04:04:27,840
Tuy nhiên, thực sự, chúng tôi vẫn đang gặp\nmột số vấn đề về làm tròn ở đó.

4267
04:04:27,841 --> 04:04:31,621
Hãy chạy nó một lần nữa\nlần với 4 chia cho 3.

4268
04:04:31,620 --> 04:04:33,989
Ở đó, ít nhất chúng ta cũng tiến gần hơn đến\ncâu trả lời đúng.

4269
04:04:33,989 --> 04:04:36,450
Nhưng chúng ta vẫn có\nsự thiếu chính xác về dấu phẩy động đó

4270
04:04:36,450 --> 04:04:39,300
nhưng đó lại là một\nvấn đề khác cần giải quyết.

4271
04:04:39,300 --> 04:04:41,220
Và đây\nchi tiết hơn một chút là vấn đề đó

4272
04:04:41,220 --> 04:04:44,399
tràn số nguyên,\nis trong ngữ cảnh của int.

4273
04:04:44,399 --> 04:04:48,389
Giả sử chúng ta nghĩ lại\ntuần trước khi chúng ta có ba bit

4274
04:04:48,389 --> 04:04:53,970
và chúng tôi đếm từ 0 đến\n7, 0, 1, 2, 3, 4, 5, 6, 7.

4275
04:04:53,970 --> 04:04:56,220
Tôi nghĩ tôi đã đặt câu hỏi,\nlàm thế nào chúng ta đếm đến 8?

4276
04:04:56,220 --> 04:04:58,290
Có người đã đề xuất,\nchúng ta cần bit thứ tư.

4277
04:04:58,290 --> 04:05:01,559
Sẽ ổn thôi nếu bạn có\nbit thứ tư, nếu bạn có quyền truy cập

4278
04:05:01,559 --> 04:05:03,479
sang bóng đèn hoặc bóng bán dẫn khác.

4279
04:05:03,479 --> 04:05:09,239
Tuy nhiên, nếu không, số tiếp theo\n

4280
04:05:09,239 --> 04:05:13,110
Nhưng nếu bạn không có không gian cho\cũng như phần cứng cho bit thứ tư đó

4281
04:05:13,111 --> 04:05:16,341
bạn cũng có thể\nbiểu thị số 0.

4282
04:05:16,341 --> 04:05:19,640
Vì vậy, trong thế giới số nguyên, nếu\nbạn chỉ sử dụng ba bit

4283
04:05:19,639 --> 04:05:23,360
ba bit đó cuối cùng\noverchảy khi bạn đếm qua 7.

4284
04:05:23,361 --> 04:05:28,011
Bởi vì số 8 không thể khớp được, nên\n

4285
04:05:28,011 --> 04:05:30,841
Và vấn đề này có vẻ phức tạp như thế này

4286
04:05:30,841 --> 04:05:33,050
con người chúng ta đã\nlàm điều này một vài lần.

4287
04:05:33,050 --> 04:05:35,327
Bạn có thể nhớ lại\nđã biết hoặc đã đọc

4288
04:05:35,327 --> 04:05:37,161
về vấn đề Y2K,\nnơi có rất nhiều người

4289
04:05:37,161 --> 04:05:38,460
nghĩ rằng thế giới sắp kết thúc.

4290
04:05:38,960 --> 04:05:43,911
Bởi vì vào ngày 1 tháng 1\n2000, rất nhiều máy tính

4291
04:05:43,911 --> 04:05:48,501
có lẽ là họ sẽ cập nhật\n

4292
04:05:48,501 --> 04:05:51,831
Tuy nhiên, vấn đề là trong\nnhiều thập kỷ, để đạt được hiệu quả, con người chúng ta

4293
04:05:51,831 --> 04:05:54,710
thực lòng họ có thói quen\nkhông lưu năm dưới dạng bốn chữ số.

4294
04:05:55,233 --> 04:05:58,191
Bởi vì như thế là quá nhiều không gian\n

4295
04:05:59,460 --> 04:06:02,540
Vì vậy, rất nhiều hệ thống máy tính,\nđặc biệt là ở giai đoạn đầu khi

4296
04:06:02,540 --> 04:06:05,780
phần cứng rất đắt\nand bộ nhớ rất chật

4297
04:06:05,781 --> 04:06:08,390
chỉ lưu trữ hai chữ số cuối\ncuối của năm bất kỳ.

4298
04:06:08,389 --> 04:06:14,270
Tất nhiên, vấn đề là vào ngày 1 tháng 1\n

4299
04:06:14,271 --> 04:06:19,341
Nhưng nếu bạn không có chỗ cho\n chữ số khác thì đó chỉ là 00.

4300
04:06:19,341 --> 04:06:23,720
Và nếu mã của bạn giả định tiền tố là\n

4301
04:06:23,720 --> 04:06:26,862
1999 trở lại năm 1900

4302
04:06:26,862 --> 04:06:29,570
Rất may, câu chuyện dài ngắn, a\n

4303
04:06:29,570 --> 04:06:32,880
bằng nhiều ngôn ngữ cổ và\ngần như đã giải quyết được vấn đề này

4304
04:06:34,400 --> 04:06:39,980
Lần tiếp theo thế giới có thể kết thúc\n

4305
04:06:39,980 --> 04:06:42,560
Bây giờ, điều đó có thể\nnhư thể đã xa rồi

4306
04:06:42,560 --> 04:06:44,931
nhưng có thời điểm năm 2000 cũng vậy.

4307
04:06:44,931 --> 04:06:51,351
Tại sao đồng hồ lại có thể bị hỏng\n

4308
04:06:54,980 --> 04:06:57,150
Vì vậy, điều này đề cập đến một số\nsố giây.

4309
04:06:57,150 --> 04:07:00,560
Vậy hóa ra con đường đó\n

4310
04:07:00,560 --> 04:07:04,130
họ có đếm tổng số\ngiây kể từ kỷ nguyên đó không?

4311
04:07:04,130 --> 04:07:06,620
được xác định là ngày 1 tháng 1 năm 1970.

4312
04:07:07,220 --> 04:07:09,890
Đó chỉ là một năm tốt lành\nđể bắt đầu tính từ lúc

4313
04:07:09,890 --> 04:07:11,880
khi máy tính thực sự xuất hiện.

4314
04:07:11,880 --> 04:07:16,400
Thật không may, hầu hết các máy tính đều sử dụng 32\n

4315
04:07:16,400 --> 04:07:20,331
kể từ ngày 1 tháng 1 năm 1970,\nụ ý của việc này là chúng ta

4316
04:07:20,331 --> 04:07:23,210
chỉ có thể đếm tới\nkhoảng 2 tỷ giây.

4317
04:07:23,210 --> 04:07:29,810
2 tỷ giây sẽ\xảy ra vào năm 2038, lúc đó là 30 11 giây

4318
04:07:29,810 --> 04:07:31,700
sẽ cuộn qua như sau.

4319
04:07:31,700 --> 04:07:34,898
Con số 2 tỷ đó,\nlà số tối đa--

4320
04:07:34,898 --> 04:07:37,440
bởi vì nếu bạn đang biểu diễn\nsố dương và số âm

4321
04:07:37,441 --> 04:07:39,941
hãy nhớ rằng bạn chỉ có thể đếm\nas cao nhất là 2 tỷ

4322
04:07:42,380 --> 04:07:44,421
Đây gần như là con số\n2 tỷ trong hệ nhị phân.

4323
04:07:44,421 --> 04:07:47,041
Đó là tất cả những cách có\nkhông có cách nào ở đây.

4324
04:07:47,040 --> 04:07:50,990
Nếu tôi đếm một giây qua con số\n2 tỷ đó, hãy cho hoặc lấy--

4325
04:07:50,990 --> 04:07:54,050
điều đó có nghĩa là, được rồi,\ntôi cộng 1, tôi nhớ 1--

4326
04:07:54,050 --> 04:07:57,290
nó giống như số 9\ntrở thành số 0 trong số thập phân.

4327
04:07:57,290 --> 04:08:01,161
Nếu tôi cứ đơn giản như thế này\n

4328
04:08:01,161 --> 04:08:05,451
mang số 1, mang số 1, 1 giây\n

4329
04:08:05,450 --> 04:08:08,220
Tôi có số này trong\nbộ nhớ của máy tính.

4330
04:08:08,220 --> 04:08:11,780
Vậy vẫn còn 1 bit\na 1 ở tận bên trái.

4331
04:08:11,781 --> 04:08:16,041
Thật không may, bit đó\no thường tượng trưng cho sự tiêu cực

4332
04:08:16,040 --> 04:08:20,720
theo đó nếu bit đầu tiên đó là âm,\n

4333
04:08:20,720 --> 04:08:22,280
bằng cách nào đó đại diện cho một số âm.

4334
04:08:23,331 --> 04:08:24,831
Có một đại diện huyền ảo hơn.

4335
04:08:24,831 --> 04:08:27,800
Nhưng một con số rất lớn, dương\nrất đột ngột

4336
04:08:27,800 --> 04:08:29,690
trở thành một số âm rất lớn.

4337
04:08:29,691 --> 04:08:32,671
Và con số đó là khoảng\nâm 2 tỷ.

4338
04:08:32,671 --> 04:08:35,541
Điều đó có nghĩa là máy tính\nin 2038 vào ngày đó

4339
04:08:35,540 --> 04:08:37,970
sẽ vô tình\nnghĩ rằng đó là

4340
04:08:37,970 --> 04:08:43,610
đã âm 2 tỷ giây kể từ\n

4341
04:08:43,611 --> 04:08:46,731
máy tính có thể nghĩ đó là năm 1901.

4342
04:08:46,730 --> 04:08:50,990
Vậy có lẽ giải pháp cho\nvấn đề năm 2038 là gì?

4343
04:08:50,990 --> 04:08:53,601
Y2K là do chúng tôi\nsử dụng hai chữ số trong nhiều năm.

4344
04:08:55,970 --> 04:09:00,591
Và thật may mắn, chúng tôi đang nhận được một\n

4345
04:09:00,591 --> 04:09:03,320
và máy tính hiện đang sử dụng 64 bit ngày càng nhiều.

4346
04:09:03,320 --> 04:09:05,716
Và tất cả chúng ta sẽ dài\ngà cho đến khi chúng ta cạn kiệt

4347
04:09:05,716 --> 04:09:08,091
trong số giây đó, vậy\đó là vấn đề của người khác

4348
04:09:09,841 --> 04:09:11,774
Nhưng đó thực sự là giải pháp\ncơ bản.

4349
04:09:11,773 --> 04:09:13,940
Nếu bạn đang phải đối đầu với\nthứ gì đó hữu hạn, thì

4350
04:09:13,941 --> 04:09:16,371
chỉ cần đá cái lon đi xa hơn và\nchỉ cho bản thân thêm chút nữa.

4351
04:09:16,370 --> 04:09:18,710
Và thành thật mà nói, vì phần cứng ngày nay rẻ hơn rất nhiều

4352
04:09:18,710 --> 04:09:21,200
máy tính nhanh hơn rất nhiều,\đó không phải là vấn đề lớn

4353
04:09:21,200 --> 04:09:22,730
như nó có thể đã xảy ra từ nhiều thập kỷ trước.

4354
04:09:22,730 --> 04:09:24,501
Nhưng đó thực sự là giải pháp.

4355
04:09:24,501 --> 04:09:27,291
Nhưng điều này phát sinh trong những bối cảnh rất phổ biến.

4356
04:09:27,290 --> 04:09:32,120
Thực ra, hãy để tôi tiếp tục và viết một\n

4357
04:09:32,120 --> 04:09:35,150
Bạn có thể nghĩ rằng chỉ cần chuyển đổi\n

4358
04:09:35,150 --> 04:09:37,730
có thể đơn giản, nhưng hãy\ntôi tiếp tục và thực hiện việc này.

4359
04:09:37,730 --> 04:09:41,331
Trong pennys.c, tôi sẽ tiếp tục\ntiếp tục và đưa cs50.h vào.

4360
04:09:41,331 --> 04:09:48,271
Và tôi sẽ thêm vào stdio.h,\n

4361
04:09:48,271 --> 04:09:50,400
Và bây giờ ở dưới đây, tôi sẽ làm điều này.

4362
04:09:50,400 --> 04:09:52,370
Tôi sẽ nhận được số tiền được gọi là float\nvà tôi

4363
04:09:52,370 --> 04:09:56,540
sẽ yêu cầu người dùng một số tiền\n

4364
04:09:56,540 --> 04:09:59,270
và tôi sẽ lưu\nin đó vào một biến có tên là money.

4365
04:09:59,271 --> 04:10:07,461
Sau đó tôi sẽ chuyển đổi nó\n

4366
04:10:10,111 --> 04:10:16,281
Và sau đó tôi sẽ tiếp tục in\n

4367
04:10:16,281 --> 04:10:18,231
bởi vì đó chỉ là\nsố nguyên trong đồng xu--

4368
04:10:18,230 --> 04:10:22,490
dấu gạch chéo ngược n, trích dẫn\nunquote, dấu phẩy, đồng xu.

4369
04:10:22,490 --> 04:10:26,181
Được rồi, vậy nếu tôi không làm gì cả\n

4370
04:10:27,800 --> 04:10:31,700
Và giả sử tôi có, chẳng hạn, 0,99 đô la, vậy là 0,99.

4371
04:10:41,310 --> 04:10:42,931
Có vấn đề không chính xác đó.

4372
04:10:42,931 --> 04:10:45,240
Và đây thậm chí không phải là một số tiền lớn.

4373
04:10:45,240 --> 04:10:49,302
Bây giờ, không có gì to tát nếu nhân viên thu ngân đưa\n

4374
04:10:49,302 --> 04:10:50,761
nhưng bạn có thể tưởng tượng điều này cộng lại.

4375
04:10:50,761 --> 04:10:54,240
Bạn có thể tưởng tượng điều này thật đáng lo ngại\nvì những tác động tài chính

4376
04:10:54,240 --> 04:10:57,630
cho các giao dịch tài chính, cho\n

4377
04:10:57,630 --> 04:10:59,860
Chương trình của tôi thậm chí không thể xử lý việc này.

4378
04:10:59,861 --> 04:11:01,981
Vâng, có một số giải pháp ở đây.

4379
04:11:01,980 --> 04:11:04,171
Và có vẻ như những gì\nthực sự đang xảy ra--

4380
04:11:04,171 --> 04:11:08,730
nếu tôi in nó ra bằng %f với a\n

4381
04:11:09,450 --> 04:11:14,280
có lẽ máy tính đang gặp sự cố\n

4382
04:11:14,281 --> 04:11:20,761
Nó có thể đang lưu trữ 4 đô la\nvà 19,9999 xu gì đó.

4383
04:11:20,761 --> 04:11:23,551
Vì vậy, nó gần, nhưng nó không hoàn toàn ở đó.

4384
04:11:23,550 --> 04:11:28,081
Vì vậy, ít nhất tôi có thể giải quyết vấn đề này\nbằng cách làm tròn lên chẳng hạn.

4385
04:11:28,081 --> 04:11:31,081
Và hóa ra có\na hàm tròn ở đó.

4386
04:11:31,081 --> 04:11:33,841
Và hóa ra nó nằm trong một\nthư viện được gọi là thư viện toán học.

4387
04:11:33,841 --> 04:11:36,841
Và bạn sẽ biết điều này bằng cách nhìn\n

4388
04:11:37,950 --> 04:11:43,800
Và nếu bây giờ tôi lại kiếm được đồng xu và\n

4389
04:11:46,171 --> 04:11:49,531
Vì vậy, ít nhất trong bối cảnh này, nó\ncó vẻ như là một vấn đề có thể giải quyết được.

4390
04:11:49,531 --> 04:11:53,461
Nhưng chắc chắn đó là điều gì đó mà tôi\n

4391
04:11:53,460 --> 04:11:57,180
Thật không may, ngay cả chuyên nghiệp,\n

4392
04:11:57,181 --> 04:12:00,073
chưa đặc biệt chú ý đến những loại chi tiết này.

4393
04:12:00,073 --> 04:12:03,031
Và trong một lớp học như thế này, mục tiêu\n

4394
04:12:03,031 --> 04:12:06,551
nhưng để thực sự dạy cho bạn điều gì đang diễn ra\n

4395
04:12:06,550 --> 04:12:09,600
để bạn có hiểu biết từ dưới lên\nvề cách dữ liệu

4396
04:12:09,601 --> 04:12:11,980
được trình bày, cách máy tính\nang thao tác với nó

4397
04:12:11,980 --> 04:12:16,060
để bạn không gặp thất bại\n

4398
04:12:16,060 --> 04:12:19,360
Và để chúng ta với tư cách là một xã hội không\n

4399
04:12:19,861 --> 04:12:22,231
Và điều này xảy ra,\thật không may là mọi lúc.

4400
04:12:22,230 --> 04:12:26,011
Đây là chiếc máy bay Boeing\nmà cách đây vài năm đã cần

4401
04:12:26,011 --> 04:12:29,621
được khởi động lại sau mỗi 248 ngày.

4402
04:12:30,120 --> 04:12:34,740
Bởi vì phần mềm máy bay Boeing này\n

4403
04:12:34,740 --> 04:12:36,990
một phần mười giây để theo dõi\nthứ gì đó hoặc thứ khác

4404
04:12:36,990 --> 04:12:38,761
liên quan đến năng lượng điện của nó.

4405
04:12:38,761 --> 04:12:43,470
Và thật không may, sau 248 ngày\n

4406
04:12:43,470 --> 04:12:45,690
điều mà trong ngành hàng không\rõ ràng là không

4407
04:12:45,691 --> 04:12:49,381
hiếm khi kiếm được từng đô la,\n

4408
04:12:50,581 --> 04:12:54,511
số 32-bit sẽ\ncuộn qua và nguồn

4409
04:12:54,511 --> 04:12:57,601
sẽ tắt trên máy bay\na là một tác dụng phụ vì đại loại

4410
04:12:57,601 --> 04:12:59,681
của hành vi không xác định trong trường hợp đó.

4411
04:12:59,681 --> 04:13:02,941
Giải pháp tạm thời của Boeing tại\n

4412
04:13:02,941 --> 04:13:06,150
kiểu hệ điều hành,\n

4413
04:13:06,150 --> 04:13:09,841
Và đó thực sự là cách khắc phục cho đến khi họ\n

4414
04:13:11,351 --> 04:13:14,400
Và chúng tôi càng mang theo nhiều phần cứng\n

4415
04:13:14,400 --> 04:13:17,550
sử dụng những loại thiết bị này thì\nnhững vấn đề này càng xảy ra nhiều hơn

4416
04:13:17,550 --> 04:13:20,430
chúng ta sẽ chạy xuống đường.

4417
04:14:42,261 --> 04:14:45,086
DAVID Malan: Đây là\nCS50 và đây là tuần thứ 2.

4418
04:14:45,085 --> 04:14:47,710
Bây giờ bạn đã có một số\kinh nghiệm lập trình rồi

4419
04:14:47,710 --> 04:14:50,170
bằng ngôn ngữ phức tạp hơn này được gọi là c.

4420
04:14:50,171 --> 04:14:53,050
Một trong những mục tiêu của chúng tôi hôm nay là giúp đỡ\n

4421
04:14:53,050 --> 04:14:54,911
đã làm những ngày qua.

4422
04:14:54,911 --> 04:14:58,216
Vật lộn với các chương trình đầu tiên của bạn trong\n

4423
04:14:58,216 --> 04:15:00,341
hiểu biết hơn về chức năng của một số lệnh này.

4424
04:15:00,341 --> 04:15:02,841
Và cuối cùng, chúng ta có thể làm được gì hơn nữa với ngôn ngữ này.

4425
04:15:02,841 --> 04:15:06,011
Vậy việc thu hồi này chính là chương trình\nđầu tiên bạn viết

4426
04:15:06,011 --> 04:15:09,131
Tôi đã viết bằng ngôn ngữ này\ngọi là C, văn bản hơn nhiều

4427
04:15:09,130 --> 04:15:11,230
chắc chắn, hơn so với Scratch tương đương.

4428
04:15:11,230 --> 04:15:15,460
Nhưng xét cho cùng,\nmáy tính, máy Mac, PC của bạn

4429
04:15:15,460 --> 04:15:18,815
Mã VS không hiểu\nmã thực tế này.

4430
04:15:18,816 --> 04:15:21,941
Chúng ta cần định dạng nào\n

4431
04:15:23,462 --> 04:15:26,050
DAVID Malan: Vậy là nhị phân,\hay còn gọi là mã máy.

4432
04:15:26,550 --> 04:15:30,130
Số 0 và số 1 mà máy tính của bạn thực sự hiểu được.

4433
04:15:30,130 --> 04:15:32,290
Vì vậy, bằng cách nào đó chúng ta cần\nchuyển sang định dạng này.

4434
04:15:32,290 --> 04:15:34,990
Và cho đến bây giờ, chúng ta vẫn\nsử dụng lệnh này có tên là make

4435
04:15:34,990 --> 04:15:37,931
được đặt tên phù hợp vì\nit cho phép bạn tạo chương trình.

4436
04:15:37,931 --> 04:15:40,691
Và cách gọi đó\nh khá đơn giản.

4437
04:15:40,691 --> 04:15:44,711
Tạo cái nhìn xin chào trong hiện tại\n của bạn

4438
04:15:44,710 --> 04:15:49,360
hello.c, ngầm, và sau đó là\n

4439
04:15:49,361 --> 04:15:51,911
bản thân nó có thể thực thi được,\ncó nghĩa là có thể chạy được

4440
04:15:51,911 --> 04:15:54,161
để sau đó bạn có thể thực hiện ./hello.

4441
04:15:54,161 --> 04:15:58,451
Nhưng hóa ra bản thân make\thực ra không phải là một trình biên dịch.

4442
04:15:58,450 --> 04:16:00,100
Nó giúp bạn thực hiện các chương trình.

4443
04:16:00,101 --> 04:16:04,781
Nhưng hãy tạo ra tiện ích này xuất hiện\n

4444
04:16:04,781 --> 04:16:08,321
để thực sự biên dịch mã bằng cách\nsử dụng một trình biên dịch thực sự

4445
04:16:08,320 --> 04:16:12,550
chương trình chuyển đổi mã nguồn\n

4446
04:16:12,550 --> 04:16:14,921
hoặc bất kỳ môi trường đám mây nào\nbạn có thể đang sử dụng.

4447
04:16:14,921 --> 04:16:17,591
Trên thực tế, những gì make\n đang làm cho chúng tôi thực ra là

4448
04:16:17,591 --> 04:16:21,490
chạy một lệnh tự động\nđược gọi là clang, dành cho ngôn ngữ C.

4449
04:16:21,490 --> 04:16:25,851
Và, ví dụ ở đây, trong VS\n

4450
04:16:25,851 --> 04:16:27,730
lần này trong ngữ cảnh\ncủa một trình soạn thảo văn bản

4451
04:16:27,730 --> 04:16:30,940
và tôi có thể biên dịch\ncái này bằng make hello.

4452
04:16:30,941 --> 04:16:33,828
Hãy để tôi tiếp tục và sử dụng\ntrình biên dịch theo cách thủ công.

4453
04:16:33,827 --> 04:16:36,911
Và lát nữa chúng ta sẽ biết tại sao chúng ta\n

4454
04:16:36,911 --> 04:16:39,320
Thay vào đó tôi sẽ chạy clang.

4455
04:16:39,320 --> 04:16:41,601
Và sau đó tôi sẽ chạy hello.c.

4456
04:16:41,601 --> 04:16:43,751
Vì thế nó có một chút khác biệt\ncách sử dụng trình biên dịch.

4457
04:16:43,751 --> 04:16:46,421
Nó cần biết một cách rõ ràng\ntệp được gọi là gì.

4458
04:16:46,421 --> 04:16:49,541
Tôi sẽ tiếp tục chạy\nclang, hello.c, Enter.

4459
04:16:49,540 --> 04:16:52,675
Dường như không có gì xảy ra,\n

4460
04:16:52,675 --> 04:16:54,050
Bởi vì không có lỗi nào xuất hiện.

4461
04:16:54,050 --> 04:17:00,400
Và nếu tôi làm ls cho danh sách, bạn sẽ thấy\n

4462
04:17:00,400 --> 04:17:03,490
Nhưng có một tệp\ncó tên lạ là a.out.

4463
04:17:03,490 --> 04:17:06,880
Đây là một quy ước lịch sử,\nlà viết tắt của đầu ra của trình biên dịch chương trình.

4464
04:17:06,880 --> 04:17:09,640
Và đây chỉ là tên tệp\nmặc định cho một chương trình

4465
04:17:09,640 --> 04:17:13,661
mà bạn có thể tự biên dịch\ntheo cách thủ công bằng cách sử dụng chính clang.

4466
04:17:13,661 --> 04:17:16,091
Bây giờ hãy để tôi tiếp tục và\nchỉ ra rằng đó là

4467
04:17:16,091 --> 04:17:17,601
một cái tên ngu ngốc cho một chương trình.

4468
04:17:17,601 --> 04:17:20,695
Mặc dù nó hoạt động,\n./a.out vẫn hoạt động.

4469
04:17:20,695 --> 04:17:23,320
Nhưng nếu bạn thực sự muốn\ntùy chỉnh tên chương trình của mình

4470
04:17:23,320 --> 04:17:26,980
chúng tôi chỉ có thể thực hiện,\cũng không thể làm một cách rõ ràng

4471
04:17:28,181 --> 04:17:31,031
Hóa ra, một số\nchương trình trong số đó tạo ra

4472
04:17:31,031 --> 04:17:33,251
hỗ trợ những gì được gọi là\nđối số dòng lệnh

4473
04:17:33,251 --> 04:17:34,570
và nhiều hơn nữa về những điều đó sau ngày hôm nay.

4474
04:17:34,570 --> 04:17:37,931
Nhưng đây là những từ theo nghĩa đen hoặc\n

4475
04:17:37,931 --> 04:17:41,591
sau tên của một chương trình\n

4476
04:17:44,300 --> 04:17:47,200
Và hóa ra, nếu bạn đọc\ntài liệu về clang

4477
04:17:47,200 --> 04:17:52,300
bạn thực sự có thể chuyển -o, cho\n

4478
04:17:52,300 --> 04:17:54,520
cho phép bạn chỉ rõ\nrõ ràng bạn muốn gì

4479
04:17:54,521 --> 04:17:56,056
chương trình xuất ra của bạn sẽ được gọi?

4480
04:17:56,056 --> 04:17:58,931
Sau đó bạn tiếp tục và gõ\n

4481
04:17:58,931 --> 04:18:01,371
muốn biên dịch, từ\nmã nguồn tới mã máy.

4482
04:18:02,980 --> 04:18:06,251
Một lần nữa, dường như không có gì xảy ra,\nvà tôi gõ ls và thì đấy.

4483
04:18:06,251 --> 04:18:09,271
Bây giờ chúng ta vẫn còn a.out cũ,\nvì tôi chưa xóa nó.

4484
04:18:10,271 --> 04:18:14,681
Vì vậy, ./hello, thì đấy, chạy\nhello, world lần nữa.

4485
04:18:14,681 --> 04:18:16,421
Và hãy để tôi tiếp tục\nvà xóa tập tin này.

4486
04:18:16,421 --> 04:18:20,854
Tất nhiên, tôi có thể sử dụng\n

4487
04:18:20,853 --> 04:18:23,770
Mà, tôi có thói quen đóng cửa,\n

4488
04:18:23,771 --> 04:18:26,501
Nhưng tôi có thể tiếp tục và nhấp chuột phải\cũng không nhấp chuột điều khiển vào a.out

4489
04:18:26,501 --> 04:18:27,626
nếu tôi muốn thoát khỏi nó.

4490
04:18:27,626 --> 04:18:30,560
Hoặc một lần nữa, hãy để tôi tập trung vào\ngiao diện dòng lệnh.

4491
04:18:32,290 --> 04:18:35,260
Chúng tôi thực sự không sử dụng nó nhiều,\nnhưng lệnh nào sẽ xóa một tập tin?

4492
04:18:36,925 --> 04:18:40,690
DAVID Malan: Vậy nên hãy \nxóa bỏ. rm, a.out, Enter.

4493
04:18:40,691 --> 04:18:44,320
Xóa tệp thông thường,\na.out, y nếu có, hãy nhập.

4494
04:18:44,320 --> 04:18:46,900
Và bây giờ, nếu tôi làm lại, thì đấy, nó sẽ biến mất.

4495
04:18:46,900 --> 04:18:48,911
Được rồi, bây giờ chúng ta hãy\nnâng cao chương trình này

4496
04:18:48,911 --> 04:18:54,550
để thực hiện phiên bản thứ hai mà chúng tôi từng làm,\n

4497
04:18:54,550 --> 04:18:57,409
để chúng ta có quyền truy cập vào các chức năng\n

4498
04:18:57,409 --> 04:19:04,601
Để tôi làm chuỗi, tên, get,\nget chuỗi, tên bạn là gì

4499
04:19:05,810 --> 04:19:10,270
Và bây giờ, hãy để tôi tiếp tục và chào\n

4500
04:19:11,181 --> 04:19:13,421
Vậy đây là phiên bản 2 của chương trình\ncủa chúng tôi lần trước

4501
04:19:13,421 --> 04:19:17,560
được biên dịch rất dễ dàng bằng make\n

4502
04:19:17,560 --> 04:19:20,620
Nếu tôi muốn tự mình biên dịch thứ này bằng clang, hãy sử dụng

4503
04:19:20,620 --> 04:19:22,780
bài học tương tự đã được rút ra\nđược rồi, hãy làm đi.

4504
04:19:22,781 --> 04:19:29,561
clang-o, xin chào, chỉ để tôi thấy khá hơn\n

4505
04:19:29,560 --> 04:19:34,011
Và một lỗi mới xuất hiện là một số\n

4506
04:19:34,011 --> 04:19:37,841
Vì thế ở đây có chút phức tạp, và có\n

4507
04:19:37,841 --> 04:19:39,591
với tạm thời ở đó.

4508
04:19:39,591 --> 04:19:42,820
Nhưng bằng cách nào đó, vấn đề của tôi\nchính là vấn đề, như chúng ta có thể thấy ở đây.

4509
04:19:42,820 --> 04:19:44,518
Nó bằng cách nào đó liên quan đến hello.c.

4510
04:19:44,518 --> 04:19:47,351
Mặc dù chúng ta có thể chưa nhìn thấy\n

4511
04:19:47,351 --> 04:19:50,230
nhưng có một tham chiếu không xác định\nđể lấy chuỗi.

4512
04:19:50,230 --> 04:19:52,060
Như thể chuỗi get không tồn tại.

4513
04:19:52,060 --> 04:19:55,601
Bây giờ, bản năng đầu tiên của bạn có thể là, à\n

4514
04:19:56,441 --> 04:19:58,570
Đó là\ndòng đầu tiên trong chương trình của tôi.

4515
04:19:58,570 --> 04:20:02,171
Nhưng hóa ra, làm là làm\n

4516
04:20:02,171 --> 04:20:06,191
Chỉ cần đặt cs50.h hoặc bất kỳ tệp tiêu đề\n nào ở đầu mã của bạn

4517
04:20:06,191 --> 04:20:10,990
về vấn đề đó, chỉ dạy\n

4518
04:20:10,990 --> 04:20:13,570
Nó gần như hỏi trình biên dịch\nto-- nó hỏi trình biên dịch

4519
04:20:13,570 --> 04:20:16,870
để tin tưởng rằng cuối cùng tôi sẽ làm được,\n

4520
04:20:16,870 --> 04:20:22,390
như lấy chuỗi và cs50.h,\nand stdio.h, printf, trong đó.

4521
04:20:22,390 --> 04:20:28,091
Nhưng lỗi này ở đây, một dạng nào đó\n

4522
04:20:28,091 --> 04:20:30,220
rằng thực sự có một\nquy trình riêng biệt dành cho

4523
04:20:30,220 --> 04:20:34,540
tìm các số 0 và 1 mà\ncs50 đã biên soạn từ lâu cho bạn.

4524
04:20:34,540 --> 04:20:38,110
Tác giả của hoạt động này\n

4525
04:20:39,161 --> 04:20:42,101
Bằng cách nào đó, chúng ta cần phải nói với trình biên dịch rằng chúng ta

4526
04:20:42,101 --> 04:20:44,711
cần liên kết bằng mã\nmà người khác đã viết

4527
04:20:44,710 --> 04:20:48,010
mã máy thực sự mà ai đó\n

4528
04:20:48,011 --> 04:20:51,757
Vì vậy, để làm điều đó, chẳng hạn, bạn phải\nnhập -lcs50

4529
04:20:52,841 --> 04:20:55,809
Ngoài ra, nói với clang\n

4530
04:20:55,808 --> 04:20:58,600
một tập tin tên là xin chào, và bạn muốn\n

4531
04:20:58,601 --> 04:21:03,461
bạn cũng muốn trích dẫn-bỏ trích dẫn\nliên kết theo chuỗi 0 và 1

4532
04:21:03,460 --> 04:21:07,270
thực hiện chung chuỗi\nget và printf.

4533
04:21:07,271 --> 04:21:11,480
Vì vậy bây giờ, nếu tôi nhấn enter,\nlần này nó biên dịch OK.

4534
04:21:11,480 --> 04:21:17,403
Và bây giờ nếu tôi chạy ./hello, nó sẽ hoạt động\n

4535
04:21:17,403 --> 04:21:20,361
Nhưng thành thật mà nói, điều này sẽ xảy ra\n

4536
04:21:20,361 --> 04:21:22,191
Hãy chú ý, chỉ cần\nbiên dịch mã của tôi

4537
04:21:22,191 --> 04:21:25,677
Tôi phải chạy clang-o,\nhello, hello.c, lcs50

4538
04:21:25,677 --> 04:21:27,761
và bạn cũng sẽ phải\ngõ nhiều thứ hơn nữa.

4539
04:21:27,761 --> 04:21:31,150
Nếu bạn muốn sử dụng thư viện toán học,\n

4540
04:21:31,150 --> 04:21:33,700
bạn cũng sẽ phải\nlàm -lm, thông thường

4541
04:21:33,700 --> 04:21:37,150
để chỉ định, hãy cung cấp cho tôi các bit toán học mà người khác đã biên soạn.

4542
04:21:37,150 --> 04:21:39,230
Và các lệnh\nngày càng dài hơn.

4543
04:21:39,230 --> 04:21:43,780
Vì vậy, trong tương lai, chúng ta sẽ không có\n

4544
04:21:43,781 --> 04:21:45,591
nhưng clang thực sự là trình biên dịch.

4545
04:21:45,591 --> 04:21:48,640
Đó là chương trình chuyển đổi\n

4546
04:21:48,640 --> 04:21:52,699
Nhưng chúng ta sẽ tiếp tục sử dụng make vì\n

4547
04:21:52,699 --> 04:21:54,490
Và các lệnh\không nhận được nhiều hơn

4548
04:21:54,490 --> 04:21:58,900
khó hiểu càng phức tạp và\n

4549
04:21:58,900 --> 04:22:03,880
Và một lần nữa, make chỉ là một công cụ\ncó thể biến tất cả những điều đó thành hiện thực.

4550
04:22:03,880 --> 04:22:08,560
Hãy để tôi tạm dừng ở đó để xem liệu\n

4551
04:22:08,560 --> 04:22:10,150
hãy nhìn xa hơn dưới mui xe.

4552
04:22:11,445 --> 04:22:14,445
KHÁN GIẢ: Bạn có thể giải thích lại điều gì\n

4553
04:22:14,445 --> 04:22:16,779
DAVID Malan: Chắc chắn rồi, hãy để tôi\nquay lại vấn đề đó sau.

4554
04:22:18,011 --> 04:22:20,177
Chúng ta sẽ quay lại vấn đề đó\nbằng trực quan, chỉ sau giây lát.

4555
04:22:20,177 --> 04:22:23,111
Nhưng nó có nghĩa là liên kết trong\n0 và 1 mà cùng nhau

4556
04:22:23,111 --> 04:22:24,695
thực hiện lấy chuỗi và printf.

4557
04:22:24,695 --> 04:22:26,320
Nhưng chúng ta sẽ thấy điều đó một cách trực quan trong giây lát.

4558
04:22:31,334 --> 04:22:32,751
DAVID Malan: Câu hỏi thực sự hay.

4559
04:22:32,751 --> 04:22:35,111
Tại sao tôi không có\nliên kết trong I/O tiêu chuẩn?

4560
04:22:35,111 --> 04:22:37,211
Bởi vì tôi đã sử dụng printf trong phiên bản 1.

4561
04:22:37,210 --> 04:22:40,540
Theo nghĩa đen, I/O tiêu chuẩn chỉ là\ntiêu chuẩn được tích hợp sẵn

4562
04:22:43,060 --> 04:22:45,341
Nó không đi kèm với\nngôn ngữ C hoặc trình biên dịch.

4563
04:22:46,511 --> 04:22:50,861
Và các thư viện khác, mặc dù\n

4564
04:22:50,861 --> 04:22:54,861
chúng có thể không được bật theo mặc định,\n

4565
04:22:54,861 --> 04:22:57,731
Vì vậy, bạn không tải thêm 0\nand 1 vào bộ nhớ máy tính

4566
04:22:58,540 --> 04:23:01,510
Vì vậy, I/O tiêu chuẩn là đặc biệt, nếu bạn muốn.

4567
04:23:05,681 --> 04:23:07,421
DAVID Malan: Ồ, chữ -o có nghĩa gì?

4568
04:23:07,421 --> 04:23:10,451
Vậy -o là viết tắt của\nđầu ra từ tiếng Anh

4569
04:23:10,450 --> 04:23:15,520
và vì vậy -o đang yêu cầu clang\nvui lòng xuất ra một tệp có tên hello

4570
04:23:15,521 --> 04:23:18,111
bởi vì điều tiếp theo tôi\nđã viết sau dòng lệnh

4571
04:23:18,111 --> 04:23:24,190
nhớ lại là clang -o xin chào, vậy\n

4572
04:23:24,190 --> 04:23:27,667
Và đây là nơi các lệnh\ndo đó nhận được và duy trì khá phức tạp.

4573
04:23:27,667 --> 04:23:29,501
Chỉ nhờ vào cơ\ntrí nhớ và luyện tập

4574
04:23:29,501 --> 04:23:31,871
mà bạn sẽ bắt đầu nhớ, ồ\n

4575
04:23:31,870 --> 04:23:34,537
đối số dòng lệnh\nbạn có thể cung cấp cho chương trình là gì?

4576
04:23:34,538 --> 04:23:35,831
Nhưng chúng ta đã thấy điều này trước đây.

4577
04:23:35,831 --> 04:23:39,040
Về mặt kỹ thuật, khi bạn chạy make\n

4578
04:23:39,040 --> 04:23:41,240
xin chào là đối số dòng lệnh.

4579
04:23:41,240 --> 04:23:43,300
Đó là đầu vào cho hàm\nmake, mặc dù

4580
04:23:43,300 --> 04:23:46,510
được gõ vào dấu nhắc, nó sẽ cho biết\nlàm những gì bạn muốn làm.

4581
04:23:46,511 --> 04:23:50,441
Ngay cả khi tôi đã sử dụng rm một lúc\nago và thực hiện rm của a.out

4582
04:23:50,441 --> 04:23:52,541
đối số dòng lệnh\nđược gọi là a.out

4583
04:23:52,540 --> 04:23:55,000
và nó báo cho rm những gì cần xóa.

4584
04:23:55,001 --> 04:23:59,531
Nó hoàn toàn phụ thuộc vào các chương trình\n

4585
04:23:59,531 --> 04:24:02,351
cho dù bạn sử dụng dấu gạch ngang này\hay dấu gạch ngang đó, nhưng chúng tôi sẽ

4586
04:24:02,351 --> 04:24:05,066
theo thời gian, những điều nào\thực sự quan trọng trong thực tế.

4587
04:24:05,066 --> 04:24:10,481
Vì vậy, hãy quay lại câu hỏi đầu tiên\n

4588
04:24:10,480 --> 04:24:12,823
hãy xem xét mã kỹ hơn.

4589
04:24:12,823 --> 04:24:14,531
Vì vậy đây là\nphiên bản đầu tiên của mã

4590
04:24:14,531 --> 04:24:18,851
một lần nữa, với stdio.h và chỉ\nprintf, nên chưa có nội dung cs50.

4591
04:24:18,851 --> 04:24:21,101
Cho đến khi chúng tôi thêm nó trở lại\nvà có phiên bản thứ hai

4592
04:24:21,101 --> 04:24:23,891
nơi chúng tôi thực sự có được tên của con người.

4593
04:24:23,890 --> 04:24:27,043
Khi bạn chạy lệnh này,\ncó một số thứ

4594
04:24:27,043 --> 04:24:28,960
điều đó đang diễn ra\nằm bên dưới mui xe và chúng tôi

4595
04:24:28,960 --> 04:24:30,911
thực sự sẽ không tập trung vào những\nloại chi tiết này

4596
04:24:30,911 --> 04:24:33,130
chúng ta sẽ trừu tượng hóa nó bằng cách sử dụng make.

4597
04:24:33,130 --> 04:24:35,200
Nhưng điều đó đáng để hiểu\nngay từ đầu

4598
04:24:35,200 --> 04:24:38,140
mức độ tự động hóa đang diễn ra, vậy\n

4599
04:24:39,111 --> 04:24:42,201
Bạn có sự hiểu biết từ dưới lên\nvề những gì đang diễn ra.

4600
04:24:42,200 --> 04:24:45,790
Vì vậy, khi chúng tôi thông báo rằng bạn đã\nbiên dịch mã của mình bằng make

4601
04:24:45,790 --> 04:24:47,860
đó là một chút đơn giản hóa quá mức.

4602
04:24:47,861 --> 04:24:51,041
Về mặt kỹ thuật, mỗi khi\nbạn biên dịch mã của mình

4603
04:24:51,040 --> 04:24:53,831
bạn đang yêu cầu máy tính làm\nbốn việc riêng biệt cho bạn.

4604
04:24:53,831 --> 04:24:57,281
Và đây không phải là bốn điều khác biệt\n

4605
04:24:57,281 --> 04:24:59,441
mỗi khi bạn chạy\nchương trình của mình, chuyện gì đang xảy ra

4606
04:24:59,441 --> 04:25:02,081
nhưng nó giúp chia nhỏ\nthành các khối xây dựng

4607
04:25:02,081 --> 04:25:06,371
về cách chúng tôi lấy từ nguồn\n

4608
04:25:06,370 --> 04:25:10,900
Hoá ra là khi bạn biên dịch,\n

4609
04:25:10,900 --> 04:25:14,771
đang nói, bạn đang làm bốn việc\n

4610
04:25:14,771 --> 04:25:18,221
Xử lý trước, biên dịch,\ntập hợp và liên kết nó.

4611
04:25:18,220 --> 04:25:21,610
Chỉ là con người quyết định thôi, chúng ta hãy\n

4612
04:25:21,611 --> 04:25:24,490
Nhưng trong giây lát, chúng ta hãy\nxem xét những bước này là gì.

4613
04:25:24,490 --> 04:25:26,950
Vì vậy, tiền xử lý đề cập đến điều này.

4614
04:25:26,950 --> 04:25:30,970
Nếu chúng ta xem mã nguồn của mình,\n

4615
04:25:30,970 --> 04:25:34,702
và do đó nhận được chuỗi, lưu ý rằng\n

4616
04:25:34,702 --> 04:25:36,911
Và chúng khá đặc biệt\nso với tất cả các mã khác

4617
04:25:36,911 --> 04:25:39,970
chúng tôi đã viết vì chúng bắt đầu\n

4618
04:25:39,970 --> 04:25:41,921
Và đó là một\ncú pháp đặc biệt có nghĩa là

4619
04:25:41,921 --> 04:25:44,861
về mặt kỹ thuật, đây\nđược gọi là các chỉ thị tiền xử lý.

4620
04:25:44,861 --> 04:25:49,551
Cách thú vị để nói rằng họ đã được xử lý\n

4621
04:25:49,550 --> 04:25:54,130
Trên thực tế, nếu chúng ta tập trung vào\ncs50.h, hãy nhớ lại tuần trước

4622
04:25:54,130 --> 04:26:00,130
rằng tôi đã đưa ra gợi ý về những gì\n

4623
04:26:00,130 --> 04:26:04,840
Điều nổi bật\n là gì

4624
04:26:04,841 --> 04:26:07,736
tại sao chúng tôi lại thêm\nit ngay từ đầu?

4625
04:26:08,611 --> 04:26:11,111
DAVID Malan: Vì vậy, hãy lấy\nchuỗi, cụ thể là

4626
04:26:11,111 --> 04:26:13,421
nguyên mẫu cho chuỗi get.

4627
04:26:13,421 --> 04:26:15,671
Chúng tôi chưa tạo ra nhiều\nchức năng của riêng mình

4628
04:26:15,671 --> 04:26:18,101
nhưng hãy nhớ rằng bất cứ lúc nào\nchúng ta cũng đã thực hiện các chức năng của riêng mình

4629
04:26:18,101 --> 04:26:20,591
và chúng tôi đã viết chúng\nbên dưới phần chính trong một tệp

4630
04:26:20,591 --> 04:26:23,050
chúng tôi cũng đã phải sao chép và dán một cách hơi ngu ngốc

4631
04:26:23,050 --> 04:26:25,630
nguyên mẫu của hàm\na ở đầu tệp

4632
04:26:25,630 --> 04:26:29,470
chỉ để dạy trình biên dịch rằng\n

4633
04:26:29,470 --> 04:26:31,690
nó có ở dưới đó, nhưng nó sẽ tồn tại.

4634
04:26:32,560 --> 04:26:35,240
Một lần nữa, đó chính là những gì\nnguyên mẫu này đang làm cho chúng ta.

4635
04:26:35,240 --> 04:26:37,601
Vì vậy, trong\ncode của tôi, nếu tôi muốn sử dụng

4636
04:26:37,601 --> 04:26:41,021
một hàm như lấy chuỗi,\hay printf, cho vấn đề đó

4637
04:26:41,021 --> 04:26:43,411
chúng không được triển khai\nrõ ràng trong cùng một tệp

4638
04:26:43,411 --> 04:26:44,661
chúng được triển khai ở nơi khác.

4639
04:26:44,661 --> 04:26:46,952
Vì vậy tôi cần nói với trình biên dịch\nhãy tin tôi rằng chúng

4640
04:26:46,952 --> 04:26:48,261
được thực hiện ở một nơi khác.

4641
04:26:48,261 --> 04:26:51,070
Và về mặt kỹ thuật,\bên trong cs50.h,

4642
04:26:51,070 --> 04:26:54,671
có thể nói là được cài đặt ở đâu đó trong ổ cứng của\ncloud

4643
04:26:54,671 --> 04:26:59,081
mà tất cả các bạn đang truy cập thông qua VS Code,\n

4644
04:26:59,081 --> 04:27:03,130
Nguyên mẫu của hàm lấy chuỗi\n

4645
04:27:03,130 --> 04:27:07,090
lấy chuỗi, nó cần một đầu vào,\cũng không phải đối số, được gọi là dấu nhắc

4646
04:27:07,091 --> 04:27:09,970
và kiểu\nprompt đó là một chuỗi.

4647
04:27:09,970 --> 04:27:15,411
Nhận chuỗi, không có gì đáng ngạc nhiên, có\n

4648
04:27:15,411 --> 04:27:19,060
Vì vậy, theo nghĩa đen, dòng đó và một\ncác dòng khác đều nằm trong cs50.h.

4649
04:27:19,060 --> 04:27:22,540
Vì vậy, thay vì tất cả các bạn phải\n sao chép, dán nguyên mẫu

4650
04:27:22,540 --> 04:27:25,420
bạn chỉ có thể tin tưởng rằng\ncs50 đã tìm ra nó là gì.

4651
04:27:25,421 --> 04:27:29,230
Bạn có thể bao gồm cs50.h\nvà trình biên dịch đang hoạt động

4652
04:27:29,230 --> 04:27:31,681
để đi tìm nguyên mẫu đó cho bạn.

4653
04:27:31,681 --> 04:27:33,740
Điều tương tự ở tiêu chuẩn\nI/O. Một người khác-- cái gì

4654
04:27:33,740 --> 04:27:37,880
rõ ràng phải có trong stdio.h,\namtrong số những thứ khác,

4655
04:27:37,880 --> 04:27:41,850
cũng thúc đẩy chúng tôi bao gồm cả stdio.h?

4656
04:27:43,058 --> 04:27:45,290
DAVID Malan: Printf,\nnguyên mẫu cho printf

4657
04:27:45,290 --> 04:27:48,270
và tôi sẽ thay đổi nó ở đây\nmàu vàng, cho giống nhau.

4658
04:27:48,271 --> 04:27:49,671
Và hóa ra, định dạng--

4659
04:27:49,671 --> 04:27:52,851
thực ra, nguyên mẫu của printf\nis khá lạ mắt

4660
04:27:52,851 --> 04:27:56,001
bởi vì, như bạn có thể đã nhận thấy,\n

4661
04:27:56,001 --> 04:28:00,171
thứ gì đó để in, 2, nếu bạn muốn\n

4662
04:28:00,171 --> 04:28:02,880
Vì vậy, dấu chấm chấm\nbiểu thị chính xác điều đó.

4663
04:28:02,880 --> 04:28:06,590
Nó không đơn giản như một nguyên mẫu\n

4664
04:28:07,376 --> 04:28:10,310
Vậy việc\nxử lý trước mã của bạn có ý nghĩa gì?

4665
04:28:10,310 --> 04:28:14,120
Điều đầu tiên mà\ntrình biên dịch, clang, trong trường hợp này

4666
04:28:14,120 --> 04:28:18,530
đang giúp ích cho bạn khi nó đọc\n của bạn

4667
04:28:18,531 --> 04:28:22,221
thông báo, ồ, đây là hàm băm bao gồm,\n

4668
04:28:22,220 --> 04:28:27,350
Và về cơ bản, nó tìm thấy những tập tin đó\n

4669
04:28:27,351 --> 04:28:31,251
và thực hiện tương đương với việc sao chép\n

4670
04:28:31,251 --> 04:28:33,621
vào mã của bạn ở trên cùng.

4671
04:28:33,620 --> 04:28:36,710
Qua đó dạy trình biên dịch\nnhận chuỗi và printf

4672
04:28:36,710 --> 04:28:38,690
cuối cùng sẽ tồn tại ở đâu đó.

4673
04:28:38,691 --> 04:28:42,740
Vì vậy, đó là bước tiền xử lý\n, theo đó, một lần nữa, đó là

4674
04:28:42,740 --> 04:28:46,341
chỉ đang tìm và thay thế\n

4675
04:28:46,341 --> 04:28:48,771
Nó đang cắm các tập tin\nở đó để về cơ bản bạn

4676
04:28:48,771 --> 04:28:52,041
tự động lấy tất cả các nguyên mẫu\nbạn cần.

4677
04:28:53,091 --> 04:28:55,490
Vậy thì\nviệc tổng hợp các kết quả có nghĩa là gì?

4678
04:28:55,490 --> 04:28:57,710
Bởi vì tại thời điểm\ncủa câu chuyện, mã của bạn

4679
04:28:57,710 --> 04:28:59,938
bây giờ trông như thế này trong\nbộ nhớ của máy tính.

4680
04:28:59,939 --> 04:29:01,730
Nó không thay đổi\ntập tin của bạn, nó làm tất cả

4681
04:29:01,730 --> 04:29:04,251
của điều này trong\nbộ nhớ hoặc RAM của máy tính dành cho bạn.

4682
04:29:04,251 --> 04:29:06,331
Nhưng về cơ bản nó trông như thế này.

4683
04:29:06,331 --> 04:29:09,861
Vâng, bước tiếp theo là\nvề mặt kỹ thuật, thực sự biên dịch những gì.

4684
04:29:09,861 --> 04:29:12,681
Mặc dù vậy, một lần nữa, chúng tôi sử dụng\ncompile như một thuật ngữ chung.

4685
04:29:12,681 --> 04:29:15,771
Biên dịch mã trong C\ncó nghĩa là lấy mã

4686
04:29:15,771 --> 04:29:18,001
bây giờ trông như thế này trong\nbộ nhớ của máy tính

4687
04:29:18,001 --> 04:29:21,150
và biến nó thành thứ gì đó\ntrông như thế này.

4688
04:29:22,611 --> 04:29:25,251
Nhưng chỉ cách đây vài\nthập kỷ trước, nếu bạn

4689
04:29:25,251 --> 04:29:28,191
đang tham gia một lớp như\nCS50 ở dạng trước đó

4690
04:29:28,191 --> 04:29:32,001
chúng tôi sẽ không sử dụng C, nó không tồn tại\n

4691
04:29:32,001 --> 04:29:33,951
thứ gọi là ngôn ngữ lắp ráp.

4692
04:29:33,950 --> 04:29:37,490
Và có nhiều loại khác nhau,\n

4693
04:29:37,490 --> 04:29:41,271
Nhưng đây là mức độ thấp như\n

4694
04:29:41,271 --> 04:29:43,671
hiểu, cho dù đó là\nMac, PC hay điện thoại

4695
04:29:43,671 --> 04:29:46,911
trước khi bạn bắt đầu nhận được\ncác số 0 và 1 thực tế.

4696
04:29:46,911 --> 04:29:48,273
Và hầu hết điều này là khó hiểu.

4697
04:29:48,273 --> 04:29:51,440
Tôi không thể nói cho bạn biết cái này đang làm gì\n

4698
04:29:51,441 --> 04:29:54,561
và hồi phục lại tinh thần, nhiều năm trước, sau khi nghiên cứu nó

4699
04:29:54,560 --> 04:29:57,140
nhưng hãy đánh dấu một\ntừ khóa màu vàng.

4700
04:29:57,140 --> 04:30:01,640
Lưu ý rằng hợp ngữ này\n

4701
04:30:01,640 --> 04:30:04,790
tự động dành cho bạn,\nvẫn đề cập đến chính

4702
04:30:04,790 --> 04:30:07,550
và nó có đề cập đến chuỗi get,\nvà nó có đề cập đến printf.

4703
04:30:07,550 --> 04:30:10,618
Vì vậy, có một số mối liên hệ với\nmã C mà chúng ta đã thấy lúc trước.

4704
04:30:10,619 --> 04:30:12,411
Và sau đó nếu tôi đánh dấu\nnhững thứ khác này

4705
04:30:12,411 --> 04:30:14,691
đây là những gì được gọi là\nhướng dẫn máy tính.

4706
04:30:14,691 --> 04:30:17,001
Vào cuối ngày,\nmáy Mac, PC của bạn

4707
04:30:17,001 --> 04:30:20,601
điện thoại của bạn thực sự chỉ\nhiểu được những hướng dẫn rất cơ bản

4708
04:30:20,601 --> 04:30:25,281
như cộng, trừ, chia,\n

4709
04:30:25,281 --> 04:30:30,451
tải từ bộ nhớ, in nội dung nào đó vào\n

4710
04:30:30,450 --> 04:30:32,015
Và đó là những gì bạn đang thấy ở đây.

4711
04:30:32,015 --> 04:30:37,011
Những hướng dẫn lắp ráp này\nang là những gì máy tính thực sự làm

4712
04:30:37,011 --> 04:30:41,131
truyền vào bộ não của máy tính,\n

4713
04:30:41,130 --> 04:30:44,030
Và đó là CPU Intel\hay bất cứ thứ gì bạn có

4714
04:30:44,031 --> 04:30:47,481
hiểu hướng dẫn này và\n

4715
04:30:47,480 --> 04:30:50,120
Và nói chung,\ntruyện dài, tất cả những gì họ làm

4716
04:30:50,120 --> 04:30:52,880
được in hello, world trên\nmàn hình, nhưng theo một cách nào đó

4717
04:30:52,880 --> 04:30:56,171
rằng máy hiểu cách thực hiện.

4718
04:30:58,761 --> 04:31:01,271
Có bất kỳ câu hỏi nào về\ný nghĩa của việc xử lý trước không?

4719
04:31:01,271 --> 04:31:05,111
Cái nào tìm và thay thế hàm băm\n

4720
04:31:05,111 --> 04:31:08,711
và biên dịch, về mặt kỹ thuật\nsẽ lấy mã nguồn của bạn

4721
04:31:08,710 --> 04:31:12,430
sau khi được xử lý trước và chuyển đổi nó thành\n

4722
04:31:12,431 --> 04:31:14,603
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] mỗi CPU có--

4723
04:31:15,550 --> 04:31:18,970
Mỗi loại CPU đều có tập lệnh riêng.

4724
04:31:19,540 --> 04:31:23,230
Và với tư cách là đoạn giới thiệu, đây là lý do tại sao,\nang ít nhất là vào thời đó, khi

4725
04:31:23,230 --> 04:31:27,161
chúng tôi đã từng cài đặt phần mềm từ\n

4726
04:31:27,161 --> 04:31:32,483
đây là lý do bạn không thể tham gia chương trình\n

4727
04:31:32,483 --> 04:31:33,941
và chạy nó trên máy Mac hoặc ngược lại.

4728
04:31:33,941 --> 04:31:38,681
Bởi vì các lệnh, các hướng dẫn\n

4729
04:31:39,761 --> 04:31:44,411
Giờ đây Microsoft hoặc bất kỳ công ty nào có thể\n

4730
04:31:44,411 --> 04:31:48,370
như C hay cái khác, và họ có thể\n

4731
04:31:50,050 --> 04:31:54,369
Công việc sẽ gấp đôi và đôi khi\n

4732
04:31:54,370 --> 04:31:57,401
nhưng đó là lý do tại sao các bước này\n có phần khác biệt.

4733
04:31:57,400 --> 04:32:00,970
Bây giờ bạn có thể sử dụng cùng một mã và\n

4734
04:32:03,911 --> 04:32:07,060
Rất may là phần này khá\n

4735
04:32:07,060 --> 04:32:10,511
Để tập hợp mã, đó là bước\nba trong bốn bước, chỉ cần

4736
04:32:10,511 --> 04:32:14,621
xảy ra với bạn mỗi khi\nbạn chạy make hoặc lần lượt, kêu vang

4737
04:32:14,620 --> 04:32:17,830
ngôn ngữ hợp ngữ này, mà\n

4738
04:32:17,831 --> 04:32:21,341
đối với bạn từ mã nguồn của bạn,\nis biến thành 0 và 1.

4739
04:32:21,341 --> 04:32:25,043
Đó là bước mà\ntuần trước tôi đã đơn giản hóa và nói

4740
04:32:25,043 --> 04:32:28,210
khi bạn biên dịch mã của mình, bạn chuyển đổi\n

4741
04:32:29,230 --> 04:32:31,945
Về mặt kỹ thuật, điều đó xảy ra\nkhi bạn tập hợp mã của mình.

4742
04:32:31,945 --> 04:32:35,200
Nhưng không ai trong những cuộc trò chuyện bình thường\nnói điều đó, họ chỉ

4743
04:32:35,200 --> 04:32:37,540
nói biên dịch cho tất cả các điều khoản này.

4744
04:32:43,331 --> 04:32:46,661
Ngay cả trong chương trình đơn giản này\no việc lấy tên người dùng

4745
04:32:46,661 --> 04:32:51,380
rồi cắm nó vào printf, tôi\n

4746
04:32:51,880 --> 04:32:54,460
Của riêng tôi, có trong hello.c.

4747
04:32:54,460 --> 04:32:59,860
Một số CS50, đó là\nin hello.c, xin lỗi--

4748
04:32:59,861 --> 04:33:03,341
nằm trong cs50.c, đây chưa phải là tệp mà tôi đã đề cập

4749
04:33:03,341 --> 04:33:07,480
nhưng nó có lý, rằng nếu\n

4750
04:33:07,480 --> 04:33:09,640
hóa ra, việc thực hiện\nithực tế của chuỗi get

4751
04:33:09,640 --> 04:33:11,861
và những thứ khác đều có trong cs50.c.

4752
04:33:11,861 --> 04:33:15,550
Và có tệp thứ ba\nở đâu đó trên ổ cứng

4753
04:33:15,550 --> 04:33:18,521
liên quan đến việc biên dịch\ngay cả chương trình đơn giản này.

4754
04:33:18,521 --> 04:33:24,231
hello.c, cs50.c, và theo logic đó, cái còn lại có thể là gì?

4755
04:33:27,861 --> 04:33:30,951
Và đó là một lời nói dối trắng trợn,\n

4756
04:33:30,951 --> 04:33:34,011
rằng thực sự có nhiều tệp\n

4757
04:33:34,010 --> 04:33:35,640
và chúng ta sẽ thực hiện sự đơn giản hóa.

4758
04:33:35,640 --> 04:33:40,460
Vì vậy, khi tôi có mã này\nand tôi biên dịch mã của mình

4759
04:33:40,460 --> 04:33:45,560
Tôi nhận được những số 0 và 1 mà cuối cùng lại lấy\n

4760
04:33:45,561 --> 04:33:51,091
thành 0 và 1 được kết hợp với\n

4761
04:33:52,100 --> 04:33:57,560
Đây có thể là số 0 và số 1 cho mã của tôi,\n

4762
04:33:57,561 --> 04:34:02,181
Đây có thể là số 0 và số 1 cho cái gì\n

4763
04:34:02,181 --> 04:34:06,471
Đây có thể là số 0 và số 1 mà ai đó\n

4764
04:34:06,471 --> 04:34:09,980
Bước cuối cùng\là lệnh liên kết

4765
04:34:09,980 --> 04:34:12,591
liên kết tất cả những\n0 và 1 này với nhau

4766
04:34:12,591 --> 04:34:18,081
về cơ bản là gắn chúng lại với nhau\n

4767
04:34:18,080 --> 04:34:20,645
hoặc được gọi là a.out, bất kể bạn đặt tên nó là gì.

4768
04:34:20,646 --> 04:34:25,911
Bước cuối cùng đó là bước kết hợp tất cả\n

4769
04:34:25,911 --> 04:34:28,311
Và Chúa ơi, giờ chúng ta\nthực sự đang ở trong đám cỏ dại.

4770
04:34:28,311 --> 04:34:31,281
Ai muốn nghĩ đến\nmã đang chạy ở cấp độ này?

4771
04:34:33,440 --> 04:34:36,008
Khi bạn đang thực hiện,\ncó một số bước rất cụ thể

4772
04:34:36,008 --> 04:34:38,550
những điều đang xảy ra mà con người\nh đã phát triển qua nhiều năm

4773
04:34:38,550 --> 04:34:41,960
trong nhiều thập kỷ, sự cố đó\n

4774
04:34:41,960 --> 04:34:46,670
thành 0 và 1 hoặc mã máy\nvào các bước rất cụ thể này.

4775
04:34:46,670 --> 04:34:50,360
Nhưng từ nay trở đi, bạn có thể\ngọi tất cả quá trình biên dịch này.

4776
04:34:52,856 --> 04:34:55,064
ĐỐI TƯỢNG: Bạn có thể giải thích\nmột lần nữa a.out nghĩa là gì không?

4777
04:34:57,530 --> 04:35:02,150
a.out chỉ là thông thường,\n

4778
04:35:02,151 --> 04:35:05,541
mà bạn biên dịch trực tiếp\nbằng một trình biên dịch, như clang.

4779
04:35:05,541 --> 04:35:07,941
Tuy nhiên, đó là một cái tên vô nghĩa.

4780
04:35:07,940 --> 04:35:11,510
Nó là viết tắt của đầu ra của trình biên dịch mã và\n

4781
04:35:11,510 --> 04:35:12,950
từ quá trình lắp ráp này.

4782
04:35:12,951 --> 04:35:15,411
Đó là một cái tên khập khiễng cho một\nchương trình máy tính, và chúng tôi

4783
04:35:15,411 --> 04:35:20,710
thay vào đó có thể ghi đè nó bằng cách xuất ra\nthứ gì đó như xin chào.

4784
04:35:27,687 --> 04:35:32,121
DAVID Malan: Tóm lại, có\n

4785
04:35:32,120 --> 04:35:36,170
cs50.h, stdio.h, về mặt kỹ thuật, chúng\n

4786
04:35:36,170 --> 04:35:38,720
mặc dù bạn,\nnói đúng ra, không cần hầu hết chúng

4787
04:35:38,721 --> 04:35:42,451
nhưng chúng vẫn ở đó,\ntrong trường hợp bạn có thể muốn chúng.

4788
04:35:42,451 --> 04:35:43,921
Và cuối cùng, còn câu hỏi nào khác không?

4789
04:35:48,138 --> 04:35:51,181
DAVID Malan: Thứ tự nào cũng quan trọng\n

4790
04:35:51,181 --> 04:35:53,401
Đôi khi với các thư viện,\nyes, điều đó quan trọng

4791
04:35:53,401 --> 04:35:55,781
chúng được liên kết với nhau theo thứ tự nào.

4792
04:35:55,780 --> 04:35:58,591
Nhưng với mục đích của chúng tôi, điều đó\nthực sự không thành vấn đề.

4793
04:35:58,591 --> 04:36:03,010
Nó sẽ-- làm sẽ mất\n

4794
04:36:03,510 --> 04:36:06,055
Như đã nói, từ nay trở đi,\nbiên dịch, về mặt kỹ thuật

4795
04:36:06,931 --> 04:36:10,951
Nhưng chúng ta sẽ tập trung vào nó như một khái niệm cấp độ\ncao hơn, một sự trừu tượng

4796
04:36:14,140 --> 04:36:16,771
Vì vậy, một quy trình khác mà bây giờ chúng ta\nsẽ bắt đầu tập trung vào tất cả

4797
04:36:16,771 --> 04:36:19,951
nhiều hơn trong tuần này bởi vì, luôn luôn,\n

4798
04:36:19,951 --> 04:36:21,421
đã phải đối mặt với một số thử thách.

4799
04:36:21,420 --> 04:36:24,810
Có lẽ bạn đã tạo ra nó lần đầu tiên\n

4800
04:36:24,811 --> 04:36:28,201
vậy nên hãy tập trung một chút vào\n

4801
04:36:28,201 --> 04:36:31,320
Khi bạn dành nhiều thời gian hơn\ntrong học kỳ này, trong những năm

4802
04:36:31,320 --> 04:36:34,530
sắp tới Nếu bạn tiếp tục lập trình,\n

4803
04:36:34,530 --> 04:36:37,837
Cuối cùng, tôi sẽ viết mã\nkhông có lỗi.

4804
04:36:37,837 --> 04:36:40,920
Mặc dù chương trình của bạn sẽ nhận được\n

4805
04:36:40,920 --> 04:36:44,490
và tất cả chúng ta sẽ bắt đầu\n

4806
04:36:44,491 --> 04:36:46,831
Và cho đến ngày nay, tôi vẫn luôn viết\nmã có lỗi.

4807
04:36:46,830 --> 04:36:48,780
Và tôi luôn cảm thấy kinh hãi\nkhi làm điều đó ở đây.

4808
04:36:48,780 --> 04:36:50,880
Nhưng hy vọng điều đó\nsẽ không xảy ra quá thường xuyên.

4809
04:36:50,881 --> 04:36:54,361
Nhưng khi điều đó xảy ra, đó là một quá trình\nbây giờ, của việc gỡ lỗi, cố gắng

4810
04:36:54,361 --> 04:36:56,491
để tìm ra lỗi trong chương trình của bạn.

4811
04:36:56,491 --> 04:36:59,861
Bạn không cần phải nhìn chằm chằm vào mã của mình,\n

4812
04:36:59,861 --> 04:37:02,851
Có những công cụ thực tế\nmà các lập trình viên trong thế giới thực

4813
04:37:02,850 --> 04:37:06,120
sử dụng để giúp gỡ lỗi\ncode của họ và tìm ra những lỗi này.

4814
04:37:06,120 --> 04:37:08,716
Vậy một số kỹ thuật\nvà công cụ mà mọi người sử dụng là gì?

4815
04:37:08,716 --> 04:37:13,701
Ngoài ra, nếu bạn đã từng--

4816
04:37:13,701 --> 04:37:17,101
một lỗi trong chương trình là một lỗi,\n

4817
04:37:17,100 --> 04:37:22,270
Nếu bạn đã từng nghe câu chuyện này,\nkhoảng hơn 50 năm trước, vào năm 1947.

4818
04:37:22,271 --> 04:37:27,030
Đây là một mục trong sổ nhật ký được viết\n

4819
04:37:27,030 --> 04:37:29,490
như-- tên là Grace Hopper,\nngười tình cờ là người

4820
04:37:29,491 --> 04:37:33,606
để ghi lại phát hiện đầu tiên về một\n

4821
04:37:33,605 --> 04:37:36,120
Điều này giống như một con bướm\nđã bay vào

4822
04:37:36,120 --> 04:37:41,341
vào thời điểm đó, một hệ thống rất phức tạp\n

4823
04:37:41,341 --> 04:37:44,311
hệ thống loại\nrất lớn, có kích thước bằng tủ lạnh

4824
04:37:44,311 --> 04:37:48,421
trong đó một lỗi thực tế đã gây ra sự cố.

4825
04:37:48,420 --> 04:37:51,450
Tuy nhiên, từ nguyên của lỗi\ncó trước trường hợp cụ thể này

4826
04:37:51,451 --> 04:37:54,841
nhưng ở đây bạn có, như bất kỳ máy tính nào\n

4827
04:37:54,841 --> 04:37:57,105
về lỗi vật lý đầu tiên trong máy tính.

4828
04:37:57,105 --> 04:37:59,582
Tuy nhiên, bạn làm cách nào để loại bỏ một thứ như vậy?

4829
04:37:59,582 --> 04:38:02,040
Chà, hãy xem xét một kịch bản rất\nđơn giản ở lần trước

4830
04:38:02,041 --> 04:38:05,041
chẳng hạn, khi chúng tôi đang cố gắng\n

4831
04:38:05,041 --> 04:38:07,230
như cột 3 viên gạch này.

4832
04:38:07,230 --> 04:38:10,920
Hãy xem xét cách tôi có thể thực hiện\n

4833
04:38:10,920 --> 04:38:15,390
Hãy để tôi chuyển trở lại VS\nCode ở đây và tôi sẽ chạy--

4834
04:38:17,010 --> 04:38:18,900
Và tôi sẽ không tin tưởng vào bản thân mình, nên tôi

4835
04:38:18,901 --> 04:38:20,768
sẽ gọi nó là\nbuggy.c ngay từ đầu

4836
04:38:20,768 --> 04:38:22,600
biết rằng tôi sắp làm hỏng chuyện gì đó.

4837
04:38:22,600 --> 04:38:25,411
Nhưng tôi sẽ tiếp tục\nvà đưa vào stdio.h.

4838
04:38:25,411 --> 04:38:28,201
Và tôi sẽ định nghĩa main như thường lệ.

4839
04:38:28,201 --> 04:38:30,210
Vì vậy, hy vọng là chưa có sai sót nào.

4840
04:38:30,210 --> 04:38:32,970
Và bây giờ, tôi muốn in những viên gạch\n3 đó lên màn hình bằng cách sử dụng

4841
04:38:34,530 --> 04:38:40,681
Vậy còn 4 int tôi nhận được 0, tôi ít hơn\n

4842
04:38:40,681 --> 04:38:42,541
Bây giờ, bên trong dấu ngoặc nhọn, tôi sẽ

4843
04:38:42,541 --> 04:38:48,221
để tiếp tục và in ra hàm băm\n

4844
04:38:48,221 --> 04:38:52,236
Được rồi, đang lưu tệp, đang thực hiện\n

4845
04:38:52,236 --> 04:38:57,601
Vì vậy không có lỗi cú pháp,\n

4846
04:38:57,600 --> 04:39:00,900
Nhưng có lẽ một số bạn đã\nnhận thấy lỗi logic rồi

4847
04:39:00,901 --> 04:39:03,631
bởi vì khi tôi chạy\nchương trình này tôi không nhận được

4848
04:39:03,631 --> 04:39:09,691
bức tranh này là 3 viên gạch\n

4849
04:39:09,690 --> 04:39:12,190
Bây giờ, điều này có thể khiến bạn bất ngờ, tại sao nó lại xảy ra

4850
04:39:12,190 --> 04:39:14,190
nhưng tôi đã giữ chương trình\nđơn giản chỉ để chúng ta

4851
04:39:14,190 --> 04:39:18,271
không cần phải tìm ra lỗi thực sự, chúng ta có thể\n

4852
04:39:20,230 --> 04:39:23,311
Chiến lược đầu tiên\nđể tìm ra lỗi như thế này có thể là gì

4853
04:39:23,311 --> 04:39:27,552
thay vì nhìn chằm chằm vào mã của bạn,\n

4854
04:39:28,385 --> 04:39:31,950
Được rồi, chúng ta hãy thử chẩn đoán\n

4855
04:39:31,951 --> 04:39:34,681
Và cách đơn giản nhất để thực hiện\nviệc này ngay bây giờ và nhiều năm nữa

4856
04:39:34,681 --> 04:39:38,131
thành thật mà nói thì\nsẽ sử dụng một hàm như printf.

4857
04:39:38,131 --> 04:39:40,050
Printf là một hàm\nhữu ích tuyệt vời, không phải

4858
04:39:40,050 --> 04:39:42,810
để định dạng-- in\ncác chuỗi được định dạng và tất cả những thứ đó, dành cho

4859
04:39:42,811 --> 04:39:45,691
chỉ nhìn vào bên trong\ngiá trị của các biến

4860
04:39:45,690 --> 04:39:48,612
rằng bạn có thể tò mò muốn biết chuyện gì đang xảy ra.

4861
04:39:50,580 --> 04:39:53,370
Tôi thấy có 4 cái sắp ra, nhưng tôi dự định là 3.

4862
04:39:53,370 --> 04:39:56,001
Rõ ràng là có điều gì đó không ổn với các biến i của tôi.

4863
04:39:56,001 --> 04:39:58,350
Vì vậy, hãy để tôi mô phạm hơn một chút.

4864
04:39:58,350 --> 04:40:01,560
Hãy để tôi đi vào bên trong\nvòng lặp này và tạm thời

4865
04:40:01,561 --> 04:40:04,741
nói điều gì đó rõ ràng, như, tôi là--

4866
04:40:04,741 --> 04:40:09,461
andi /n, rồi\ncắm vào giá trị của i.

4867
04:40:09,960 --> 04:40:13,230
Đây không phải là chương trình tôi muốn\n

4868
04:40:13,230 --> 04:40:18,661
đang viết, bởi vì bây giờ tôi sẽ\nnói tạo ra lỗi, ./buggy.

4869
04:40:18,661 --> 04:40:20,760
Và bây giờ, nếu tôi nhìn vào kết quả, tôi có

4870
04:40:20,760 --> 04:40:25,350
một số thông tin chẩn đoán hữu ích.\n

4871
04:40:25,350 --> 04:40:27,870
và tôi nhận được một hàm băm, 2 và tôi nhận được một hàm băm, 3 và tôi nhận được một hàm băm.

4872
04:40:28,788 --> 04:40:30,870
Rõ ràng là tôi đang đi quá nhiều\nbước vì có lẽ tôi

4873
04:40:30,870 --> 04:40:33,510
quên rằng về cơ bản máy tính đang đếm từ 0

4874
04:40:33,510 --> 04:40:35,710
và bây giờ, ồ, nó nhỏ hơn hoặc bằng.

4875
04:40:37,291 --> 04:40:40,201
Một lần nữa, ví dụ tầm thường,\nnhưng chỉ bằng cách sử dụng printf

4876
04:40:40,201 --> 04:40:43,171
bạn có thể nhìn thấy bên trong\nbộ nhớ của máy tính

4877
04:40:43,170 --> 04:40:45,390
chỉ bằng cách in ra những thứ như thế này.

4878
04:40:45,390 --> 04:40:50,030
Và bây giờ, khi bạn đã tìm ra, ồ,\n

4879
04:40:50,030 --> 04:40:52,400
hoặc tôi nên bắt đầu\nđếm từ 1, có

4880
04:40:52,401 --> 04:40:53,901
bất kỳ cách nào tôi có thể khắc phục điều này.

4881
04:40:53,901 --> 04:40:56,916
Nhưng thông thường nhất có lẽ chỉ nói ít hơn 3.

4882
04:40:56,916 --> 04:41:03,441
Bây giờ, tôi có thể xóa bản in tạm thời của mình\n

4883
04:41:06,050 --> 04:41:08,091
Được rồi, và cho đến ngày nay, tôi vẫn làm điều này.

4884
04:41:08,091 --> 04:41:11,120
Cho dù đó là tạo một dòng lệnh\n

4885
04:41:11,120 --> 04:41:13,310
hoặc ứng dụng dành cho thiết bị di động,\nViệc sử dụng này rất phổ biến

4886
04:41:13,311 --> 04:41:15,531
printf hoặc một số ngôn ngữ tương đương\nbất kỳ ngôn ngữ nào

4887
04:41:15,530 --> 04:41:19,611
chỉ để lục lọi và xem có gì\bên trong bộ nhớ máy tính.

4888
04:41:19,611 --> 04:41:22,831
May mắn thay, có nhiều công cụ\ntinh vi hơn thế này.

4889
04:41:22,830 --> 04:41:25,190
Hãy để tôi tiếp tục\ngiới thiệu lại lỗi ở đây.

4890
04:41:25,190 --> 04:41:28,880
Và hãy để tôi mở lại\nthanh bên của tôi ở bên trái ở đây.

4891
04:41:28,881 --> 04:41:32,811
Bây giờ hãy để tôi biên dịch lại mã\nđể đảm bảo nó cập nhật.

4892
04:41:32,811 --> 04:41:35,570
Và tôi sẽ chạy một\nlệnh tên là debug50.

4893
04:41:35,570 --> 04:41:39,350
Lệnh nào\nđại diện cho một loại chương trình

4894
04:41:41,001 --> 04:41:43,940
Và trình gỡ lỗi này thực sự được tích hợp vào VS Code.

4895
04:41:43,940 --> 04:41:47,960
Và tất cả những gì debug50 đang làm cho chúng ta là\n

4896
04:41:47,960 --> 04:41:49,911
Trình gỡ lỗi tích hợp của VS Code.

4897
04:41:49,911 --> 04:41:52,521
Vì vậy, đây thậm chí không phải là một công cụ dành riêng cho\nCS50, chúng tôi đã

4898
04:41:52,521 --> 04:41:55,431
vừa cung cấp cho bạn lệnh debug50\n để làm cho nó dễ dàng hơn

4899
04:41:55,431 --> 04:41:57,116
để bắt đầu nó ngay từ đầu.

4900
04:41:57,116 --> 04:42:01,821
Và cách bạn chạy trình gỡ lỗi này\n

4901
04:42:01,820 --> 04:42:04,381
tên của chương trình\nmà bạn muốn gỡ lỗi.

4902
04:42:06,471 --> 04:42:08,271
Vì vậy, bạn không đề cập đến tập tin c của bạn.

4903
04:42:08,271 --> 04:42:10,911
Bạn đề cập đến mã đã được biên dịch của bạn.

4904
04:42:10,911 --> 04:42:16,491
Và trình gỡ lỗi này đang diễn ra như thế nào\n

4905
04:42:16,491 --> 04:42:19,191
hãy xem qua mã của tôi từng bước một.

4906
04:42:19,190 --> 04:42:23,190
Bởi vì mọi chương trình chúng tôi đã viết\n

4907
04:42:23,190 --> 04:42:26,585
ngay cả khi tôi chưa nghĩ xong\ntừng bước một.

4908
04:42:26,585 --> 04:42:30,111
Với trình gỡ lỗi, tôi thực sự có thể nhấp vào số dòng

4909
04:42:30,111 --> 04:42:33,441
và nói tạm dừng thực thi\ntại đây và trình gỡ lỗi

4910
04:42:33,440 --> 04:42:38,390
sẽ để tôi xem qua mã của mình\n

4911
04:42:38,390 --> 04:42:41,001
từng phút một,\ntheo tốc độ con người của tôi.

4912
04:42:41,001 --> 04:42:43,730
Điều này cực kỳ hấp dẫn khi\ncác chương trình trở nên phức tạp hơn

4913
04:42:43,730 --> 04:42:46,861
và nếu không thì chúng có thể bay ngang qua trên màn hình.

4914
04:42:46,861 --> 04:42:50,120
Vì vậy tôi sẽ nhấp vào\nở bên trái dòng 5.

4915
04:42:50,120 --> 04:42:52,230
Và hãy chú ý rằng\nnhững chấm đỏ nhỏ này xuất hiện.

4916
04:42:52,230 --> 04:42:55,550
Và nếu tôi nhấp vào một cái thì nó\n vẫn giữ nguyên và thậm chí còn đỏ hơn.

4917
04:42:55,550 --> 04:42:58,490
Và tôi sẽ chạy debug50 trên ./buggy.

4918
04:42:58,491 --> 04:43:03,351
Và chỉ trong chốc lát, bạn sẽ thấy rằng\n

4919
04:43:03,350 --> 04:43:06,170
Nó đang thực hiện một số\ncấu hình màn hình.

4920
04:43:06,170 --> 04:43:10,950
Hãy để tôi thu nhỏ ở đây một chút vậy\n

4921
04:43:10,951 --> 04:43:14,701
Và đôi khi, bạn sẽ thấy trong VS\n

4922
04:43:14,701 --> 04:43:18,741
trông rất khó hiểu, hãy quay lại\n

4923
04:43:18,741 --> 04:43:22,136
Bởi vì ở cửa sổ terminal là nơi\n

4924
04:43:22,135 --> 04:43:24,380
Và bây giờ chúng ta hãy\nxem chuyện gì đang xảy ra.

4925
04:43:24,381 --> 04:43:28,911
Nếu tôi phóng to mã\nbuggy.c của tôi ở đây, bạn sẽ

4926
04:43:28,911 --> 04:43:35,151
lưu ý rằng chúng ta có cùng một chương trình\n

4927
04:43:36,080 --> 04:43:39,920
Không phải ngẫu nhiên, đó là dòng\n

4928
04:43:39,920 --> 04:43:44,661
Dấu chấm nhỏ màu đỏ có nghĩa là ngắt\ntại đây, tạm dừng thực thi tại đây.

4929
04:43:44,661 --> 04:43:47,976
Và đường màu vàng\nvẫn chưa được thực thi.

4930
04:43:47,976 --> 04:43:51,860
Nhưng nếu bây giờ tôi đang ở trên đỉnh\n

4931
04:43:53,010 --> 04:43:55,010
Có một cái cho cái này,\nnếu tôi di chuột qua nó

4932
04:43:55,010 --> 04:43:58,400
nói Bước qua, có một\nđiều khác sẽ nói Bước vào

4933
04:43:58,401 --> 04:44:00,081
có một phần ba nói rằng Bước ra ngoài.

4934
04:44:00,080 --> 04:44:02,780
Tôi sẽ sử dụng\nđầu tiên trong số này, Step Over.

4935
04:44:02,780 --> 04:44:05,841
Và tôi sẽ làm điều này, và\n

4936
04:44:05,841 --> 04:44:09,921
đã chuyển từ dòng 5 sang dòng\n7 vì giờ nó đã sẵn sàng

4937
04:44:09,920 --> 04:44:12,215
nhưng vẫn chưa in ra hàm băm đó.

4938
04:44:12,216 --> 04:44:16,078
Nhưng điều mạnh mẽ nhất ở đây\nđể ý, là phần trên cùng bên trái ở đây.

4939
04:44:16,078 --> 04:44:18,411
Nó hơi khó hiểu, vì\ncó rất nhiều thứ

4940
04:44:18,411 --> 04:44:21,170
tiếp tục điều đó sẽ có ý nghĩa hơn theo thời gian, nhưng ở trên cùng

4941
04:44:21,170 --> 04:44:22,730
có một phần gọi là biến.

4942
04:44:22,730 --> 04:44:25,010
Bên dưới đó, một thứ\nđược gọi là địa phương, có nghĩa là

4943
04:44:25,010 --> 04:44:27,080
local vào hàm hiện tại của tôi, main.

4944
04:44:27,080 --> 04:44:31,670
Và để ý, có biến của tôi\n

4945
04:44:31,670 --> 04:44:37,070
Vì vậy bây giờ, khi tôi nhấp vào Bước qua\nlần nữa, hãy xem điều gì sẽ xảy ra.

4946
04:44:37,070 --> 04:44:39,920
Chúng ta đi từ dòng 7 trở lại dòng 5.

4947
04:44:39,920 --> 04:44:43,715
Nhưng hãy nhìn vào cửa sổ terminal,\không có giá trị băm nào được in.

4948
04:44:43,716 --> 04:44:46,311
Nhưng bây giờ, nó được in theo tốc độ của riêng tôi.

4949
04:44:46,311 --> 04:44:48,291
Tôi có thể suy nghĩ từng bước một.

4950
04:44:48,291 --> 04:44:50,601
Lưu ý rằng tôi vẫn chưa thay đổi.

4951
04:44:50,600 --> 04:44:53,960
Nó vẫn là 0 vì màu vàng\n

4952
04:44:53,960 --> 04:44:58,400
Nhưng ngay khi tôi nhấp vào Bước qua,\nit sẽ thực thi dòng 5.

4953
04:44:58,401 --> 04:45:05,271
Bây giờ, hãy để ý ở trên cùng bên trái, tôi đã trở thành\n

4954
04:45:05,271 --> 04:45:07,550
bởi vì bây giờ, được đánh dấu là dòng 7.

4955
04:45:07,550 --> 04:45:12,260
Vì vậy, nếu tôi nhấp vào Bước qua\nlần nữa, chúng ta sẽ thấy hàm băm.

4956
04:45:12,260 --> 04:45:16,190
Nếu tôi lặp lại quá trình này với tốc độ thoải mái như con người hiện tại của mình

4957
04:45:16,190 --> 04:45:21,300
Tôi có thể thấy các biến của mình đang thay đổi, tôi\n

4958
04:45:21,300 --> 04:45:24,163
và tôi chỉ có thể nghĩ\nđiều đó có nên xảy ra không.

4959
04:45:24,163 --> 04:45:26,120
Tôi có thể tạm dừng và suy nghĩ về những gì thực sự

4960
04:45:26,120 --> 04:45:30,501
tiếp tục mà không cố gắng chạy đua\n

4961
04:45:30,501 --> 04:45:32,751
Tôi sẽ tiếp tục và\ndừng ở đây vì chúng ta đã

4962
04:45:32,751 --> 04:45:35,690
biết vấn đề cụ thể này\nis là gì và điều đó khiến tôi quay trở lại

4963
04:45:35,690 --> 04:45:36,980
vào cửa sổ terminal mặc định của tôi.

4964
04:45:36,980 --> 04:45:40,440
Nhưng trình gỡ lỗi này, hãy để tôi\vô hiệu hóa điểm dừng ngay bây giờ

4965
04:45:40,440 --> 04:45:42,830
để nó không bị lỗi liên tục, trình gỡ lỗi này

4966
04:45:42,830 --> 04:45:45,020
sẽ là bạn của bạn\ntiến về phía trước theo thứ tự

4967
04:45:45,021 --> 04:45:49,550
để xem qua mã của bạn từng bước một,\n

4968
04:45:49,550 --> 04:45:51,080
có điều gì đó không ổn ở đâu.

4969
04:45:51,080 --> 04:45:54,657
Printf rất tuyệt, nhưng sẽ khó chịu nếu\n

4970
04:45:54,657 --> 04:45:57,740
in cái này, in cái này, in cái này,\n

4971
04:45:59,241 --> 04:46:04,041
Trình gỡ lỗi cho phép bạn thực hiện\tương đương nhưng tự động.

4972
04:46:04,041 --> 04:46:10,221
Bạn sẽ có câu hỏi về trình gỡ lỗi này\n

4973
04:46:12,814 --> 04:46:14,820
ĐỐI TƯỢNG: Bạn đang sử dụng tính năng\na Step Over.

4974
04:46:14,820 --> 04:46:17,563
Những\ntính năng khác trong trình gỡ lỗi--

4975
04:46:17,563 --> 04:46:18,980
DAVID Malan: Câu hỏi thực sự hay.

4976
04:46:18,980 --> 04:46:21,980
Chúng ta sẽ sớm thấy điều này, nhưng những điều đó\n

4977
04:46:21,980 --> 04:46:26,721
thực ra là bước vào và bước ra\n

4978
04:46:26,721 --> 04:46:28,461
nếu tôi có nhiều hơn main.

4979
04:46:28,460 --> 04:46:31,220
Vì vậy, nếu hàm chính được gọi là một\nhàm được gọi là gì đó

4980
04:46:31,221 --> 04:46:34,640
và một thứ gọi là hàm\n

4981
04:46:34,640 --> 04:46:38,990
bước qua toàn bộ quá trình thực thi\n

4982
04:46:38,991 --> 04:46:41,366
và lần lượt xem qua\ncác dòng mã của nó.

4983
04:46:41,366 --> 04:46:43,281
Vì vậy, bất cứ khi nào bạn gặp\na một vấn đề, bạn

4984
04:46:43,280 --> 04:46:46,400
đang làm việc trên đó có nhiều chức năng,\n

4985
04:46:46,401 --> 04:46:50,511
nếu bạn muốn, hoặc bạn có thể đặt nó bên trong\n

4986
04:46:50,510 --> 04:46:53,390
chỉ tập trung sự chú ý của bạn vào đó.

4987
04:46:53,390 --> 04:46:56,900
Và chúng ta sẽ thấy các ví dụ\nvề điều đó theo thời gian.

4988
04:46:58,041 --> 04:47:02,361
Và có thể nói như thế nào, con voi\trong phòng, có thể nói như vậy

4989
04:47:02,361 --> 04:47:04,011
thực sự là một con vịt trong trường hợp này.

4990
04:47:04,010 --> 04:47:06,420
Tại sao lại có con vịt này và tất cả những con vịt này ở đây?

4991
04:47:06,420 --> 04:47:10,700
Chà, hóa ra, thứ ba, thực sự\n

4992
04:47:10,701 --> 04:47:14,316
đang nói chuyện thông qua các vấn đề, đang nói chuyện\n

4993
04:47:14,315 --> 04:47:16,880
Bây giờ, trong trường hợp không có\na thành viên gia đình hoặc bạn bè

4994
04:47:16,881 --> 04:47:20,781
hoặc một người bạn cùng phòng thực sự muốn\n

4995
04:47:20,780 --> 04:47:25,580
nói chung, các lập trình viên chuyển sang\n

4996
04:47:25,580 --> 04:47:27,620
nếu một cái gì đó hoạt hình không có sẵn.

4997
04:47:27,620 --> 04:47:31,021
Có thể nói, ý tưởng đằng sau việc gỡ lỗi con vịt cao su\ngỡ lỗi

4998
04:47:31,021 --> 04:47:37,011
có phải chỉ đơn giản bằng cách nhìn vào mã của bạn\n

4999
04:47:37,010 --> 04:47:41,300
Tôi đang bắt đầu vòng lặp 4 và\nTôi đang khởi tạo i thành 0.

5000
04:47:41,300 --> 04:47:43,251
Được rồi, tôi đang in ra một hàm băm.

5001
04:47:43,251 --> 04:47:48,372
Chỉ bằng cách nói qua\ncode của bạn, từng bước một, luôn luôn

5002
04:47:48,372 --> 04:47:51,080
thấy bạn có câu tục ngữ\n

5003
04:47:51,080 --> 04:47:53,300
bởi vì bạn nhận ra, đợi một chút\ntôi vừa nói điều gì đó ngu ngốc

5004
04:47:53,300 --> 04:47:54,771
hoặc tôi vừa nói điều gì đó sai.

5005
04:47:54,771 --> 04:47:58,761
Và đây thực sự chỉ là một proxy cho bất kỳ\n

5006
04:48:00,320 --> 04:48:02,701
Nhưng trong sự vắng mặt của bất kỳ ai trong số những người đó trong phòng

5007
04:48:02,701 --> 04:48:04,618
bạn có thể thoải mái tham gia,\không phải lối thoát của bạn ngay hôm nay.

5008
04:48:04,617 --> 04:48:08,540
Một trong những con vịt cao su nhỏ này và\n

5009
04:48:08,541 --> 04:48:12,081
bạn muốn nói về một\n vấn đề của mình trong CS50

5010
04:48:12,080 --> 04:48:13,400
hoặc có thể là cuộc sống nói chung hơn.

5011
04:48:13,401 --> 04:48:15,741
Nhưng để nó ở đó\nbàn làm việc của bạn chỉ là một cách

5012
04:48:15,741 --> 04:48:19,401
để giúp bạn nghe được những gì bạn nghĩ phi logic

5013
04:48:19,401 --> 04:48:22,051
nếu không thì có thể là mã logic.

5014
04:48:22,050 --> 04:48:26,661
Vì vậy, printf, gỡ lỗi, vịt cao su\n

5015
04:48:26,661 --> 04:48:29,468
theo thời gian bạn sẽ thấy,\ncó được nguồn mã

5016
04:48:29,468 --> 04:48:31,050
rằng bạn sẽ viết có sai sót.

5017
04:48:31,050 --> 04:48:33,140
Điều đó sẽ xảy ra,\nnhưng nó sẽ tiếp thêm sức mạnh cho bạn

5018
04:48:33,140 --> 04:48:36,260
hơn thế nữa là giải quyết được những sai lầm đó.

5019
04:48:36,260 --> 04:48:41,700
Được rồi, mọi câu hỏi về việc gỡ lỗi,\n

5020
04:48:44,001 --> 04:48:46,911
DAVID Malan: Có gì khác biệt\n

5021
04:48:46,911 --> 04:48:50,241
Hiện tại, điều duy nhất đó\n

5022
04:48:50,241 --> 04:48:53,601
là Step Over, vì nó có nghĩa\nbước qua từng dòng mã.

5023
04:48:53,600 --> 04:48:58,310
Tuy nhiên, nếu tôi có chức năng khác\n

5024
04:48:58,311 --> 04:49:03,561
có thể hạ xuống trong tập tin, tôi\n

5025
04:49:03,561 --> 04:49:05,730
và lần lượt đi qua chúng.

5026
04:49:05,729 --> 04:49:07,911
Vì vậy chúng ta sẽ quay lại vấn đề này\nvới một ví dụ thực tế

5027
04:49:07,911 --> 04:49:10,491
nhưng bước vào sẽ cho phép\ntôi thực hiện chính xác điều đó.

5028
04:49:10,491 --> 04:49:13,471
Trên thực tế, đây là một bước chuyển hoàn hảo để\n

5029
04:49:13,471 --> 04:49:15,893
Hãy để tôi tiếp tục và mở\nup một tệp khác ở đây.

5030
04:49:15,893 --> 04:49:17,600
Và trên thực tế, chúng ta\nsẽ sử dụng điều tương tự, buggy.

5031
04:49:17,600 --> 04:49:20,580
Và chúng ta cũng sẽ viết một\nthứ khác có lỗi.

5032
04:49:20,580 --> 04:49:24,260
Hãy để tôi đi lên đây và\nbao gồm, như trước đây, cs50.h.

5033
04:49:29,780 --> 04:49:32,310
Vì vậy, tôi nghĩ rằng tất cả những điều này đều đúng cho đến nay.

5034
04:49:32,311 --> 04:49:35,541
Và hãy làm điều này, hãy tự tạo cho mình một int tên là i

5035
04:49:35,541 --> 04:49:38,791
và hãy hỏi người dùng\nmột số nguyên âm.

5036
04:49:38,791 --> 04:49:41,561
Về mặt kỹ thuật, đây chưa phải là một chức năng tồn tại.

5037
04:49:41,561 --> 04:49:44,311
Nhưng tôi sẽ giả sử, vì\n

5038
04:49:44,311 --> 04:49:47,961
Sau đó, tôi sẽ in\nout, với %i và một dòng mới

5039
04:49:47,960 --> 04:49:49,620
bất cứ điều gì con người gõ vào.

5040
04:49:49,620 --> 04:49:52,580
Vì vậy, tại thời điểm này của câu chuyện,\ntôi nghĩ chương trình của tôi là đúng.

5041
04:49:52,580 --> 04:49:55,190
Ngoại trừ thực tế là\nget âm int thì không

5042
04:49:55,190 --> 04:49:57,950
một chức năng trong thư viện CS50\n hoặc bất kỳ nơi nào khác.

5043
04:49:57,951 --> 04:49:59,721
Tôi sẽ cần phải tự mình phát minh ra nó.

5044
04:49:59,721 --> 04:50:05,570
Vì vậy, giả sử, trong trường hợp này, tôi tuyên bố\n

5045
04:50:05,570 --> 04:50:09,890
Có thể nói, đó là kiểu trả về\n

5046
04:50:09,890 --> 04:50:12,620
Tôi muốn trả lại cho người dùng số nguyên\nin và nó sẽ

5047
04:50:12,620 --> 04:50:14,570
không cần đầu vào để giữ cho nó đơn giản.

5048
04:50:14,570 --> 04:50:16,070
Vì vậy, tôi sẽ chỉ nói void ở đó.

5049
04:50:16,070 --> 04:50:19,070
Không có thông tin đầu vào, không có lời nhắc\nđặc biệt nào, không có gì giống như vậy.

5050
04:50:19,070 --> 04:50:21,861
Bây giờ, hãy để tôi tự tạo cho mình\n vài dấu ngoặc nhọn.

5051
04:50:21,861 --> 04:50:24,771
Và hãy để tôi làm điều gì đó quen thuộc,\ncó lẽ, từ tập bài tập 1.

5052
04:50:24,771 --> 04:50:29,811
Hãy để tôi tự đặt cho mình một biến,\n

5053
04:50:31,580 --> 04:50:37,850
Gán n giá trị của get int, hỏi\n

5054
04:50:39,111 --> 04:50:43,011
Và tôi muốn làm điều này khi\nn nhỏ hơn 0, bởi vì tôi

5055
04:50:43,010 --> 04:50:44,650
muốn nhận được phản hồi tiêu cực từ người dùng.

5056
04:50:44,651 --> 04:50:48,401
Và nhớ lại, đã\nsử dụng khối này trong quá khứ

5057
04:50:48,401 --> 04:50:52,031
Bây giờ tôi có thể trả lại n là\nbước cuối cùng để trao lại

5058
04:50:52,030 --> 04:50:56,050
bất cứ điều gì người dùng đã nhập vào, vì vậy\n

5059
04:50:58,010 --> 04:51:00,970
Bây giờ, tôi đã cố tình\nlàm sai ở đây

5060
04:51:00,971 --> 04:51:03,341
và đó là một vấn đề toán học,\nngớ ngẩn, tinh tế

5061
04:51:03,341 --> 04:51:08,171
nhưng hãy để tôi biên dịch chương trình này sau\n

5062
04:51:08,170 --> 04:51:09,640
để tôi không phạm sai lầm đó nữa.

5063
04:51:09,640 --> 04:51:12,730
Hãy để tôi làm buggy, Enter.

5064
04:51:14,980 --> 04:51:18,280
Tôi sẽ cho nó một số nguyên âm\n, như âm 50.

5065
04:51:29,260 --> 04:51:33,341
Vậy rõ ràng là nó đang hoạt động ngược\n

5066
04:51:33,341 --> 04:51:35,061
Vậy làm thế nào tôi có thể gỡ lỗi này?

5067
04:51:35,061 --> 04:51:36,686
Chà, tôi có thể làm những gì tôi đã làm trước đây không?

5068
04:51:36,686 --> 04:51:43,181
Tôi có thể sử dụng kỹ thuật printf của mình và\n

5069
04:51:43,181 --> 04:51:49,570
dòng mới, dấu phẩy, chỉ để in\nit ra, để tôi biên dịch lại lỗi

5070
04:51:49,570 --> 04:51:52,901
để tôi chạy lại buggy, để tôi gõ âm 50.

5071
04:51:54,890 --> 04:51:57,434
Vì vậy, điều đó không thực sự giúp ích cho tôi vào thời điểm này

5072
04:51:57,434 --> 04:51:58,851
bởi vì nó cũng giống như trước đây.

5073
04:51:58,850 --> 04:52:02,290
Vậy hãy để tôi làm điều này, debug50, ./buggy.

5074
04:52:02,291 --> 04:52:04,131
Ồ, nhưng tôi đã phạm sai lầm.

5075
04:52:04,131 --> 04:52:05,961
Vì vậy, tôi chưa đặt điểm dừng của mình.

5076
04:52:05,960 --> 04:52:09,190
Vì vậy, hãy để tôi làm điều này và lần này tôi sẽ\nđặt một điểm ngắt.

5077
04:52:09,190 --> 04:52:11,591
Tôi có thể đặt nó ở đây, trên dòng 8.

5078
04:52:11,591 --> 04:52:13,600
Hãy làm điều đó trong phần chính, như trước đây.

5079
04:52:17,230 --> 04:52:19,451
Giao diện người dùng ưa thích\nis đó sẽ bật lên.

5080
04:52:19,451 --> 04:52:22,570
Nó sẽ làm nổi bật dòng\nmà tôi đã đặt điểm dừng.

5081
04:52:22,570 --> 04:52:25,510
Lưu ý rằng, ở phía bên trái\ncủa màn hình

5082
04:52:25,510 --> 04:52:28,911
tôi đang mặc định, hiện tại là 0,\n

5083
04:52:29,411 --> 04:52:35,076
Nhưng bây giờ hãy để tôi bước qua đây\n

5084
04:52:35,076 --> 04:52:36,701
và bạn sẽ thấy rằng tôi đang được nhắc nhở.

5085
04:52:36,701 --> 04:52:40,480
Vì vậy, hãy nhập số âm 50 của tôi, Enter.

5086
04:52:40,480 --> 04:52:45,730
Bây giờ hãy chú ý rằng tôi\nbị mắc kẹt trong chức năng đó.

5087
04:52:46,510 --> 04:52:50,780
Rõ ràng là vấn đề có vẻ là\n

5088
04:52:50,780 --> 04:52:54,380
Vì vậy, được rồi, hãy để tôi dừng việc thực hiện này.

5089
04:52:54,381 --> 04:52:57,436
Vấn đề của tôi dường như không nằm ở\n

5090
04:52:58,061 --> 04:53:00,251
Hãy để tôi đặt điểm dừng tương tự ở dòng 8.

5091
04:53:00,251 --> 04:53:02,771
Hãy để tôi chạy lại debug50 một lần nữa.

5092
04:53:02,771 --> 04:53:07,370
Nhưng lần này, thay vì chỉ bước\n

5093
04:53:07,370 --> 04:53:09,670
Vì vậy, dòng thông báo 8\nđược đánh dấu màu vàng một lần nữa.

5094
04:53:09,670 --> 04:53:11,950
Trước đây tôi\nđã nhấp vào Bước qua.

5095
04:53:14,440 --> 04:53:17,740
Khi tôi nhấp vào Bước vào,\nbùm, bây giờ, trình gỡ lỗi

5096
04:53:17,741 --> 04:53:20,651
nhảy vào chức năng cụ thể đó.

5097
04:53:20,651 --> 04:53:23,591
Bây giờ, tôi có thể duyệt qua\ncác dòng mã này nhiều lần.

5098
04:53:23,591 --> 04:53:25,960
Tôi có thể thấy giá trị của\nn khi tôi nhập nó vào.

5099
04:53:25,960 --> 04:53:27,760
Tôi có thể suy nghĩ thông qua logic của mình và thì đấy.

5100
04:53:27,760 --> 04:53:31,900
Hy vọng rằng sau khi tôi giải quyết được vấn đề,\n

5101
04:53:33,440 --> 04:53:36,310
Vì vậy, Step Over chỉ duyệt qua\ndòng nhưng thực thi nó

5102
04:53:36,311 --> 04:53:41,471
Step Into cho phép bạn truy cập\ncác chức năng khác mà bạn đã viết.

5103
04:53:41,471 --> 04:53:43,661
Vì vậy chúng ta hãy tiếp tục và làm điều này.

5104
04:53:43,661 --> 04:53:47,811
Chúng tôi có rất nhiều\ncách tiếp cận khả thi mà chúng tôi

5105
04:53:47,811 --> 04:53:49,811
có thể giải quyết một số\nvấn đề hãy tiếp tục

5106
04:53:49,811 --> 04:53:50,991
và tăng tốc bản thân ngày hôm nay, mặc dù.

5107
04:53:50,991 --> 04:53:52,161
Chúng ta hãy nghỉ giải lao năm phút ở đây.

5108
04:53:52,161 --> 04:53:54,949
Và khi chúng tôi quay lại, chúng tôi sẽ mang theo\n

5109
04:54:05,260 --> 04:54:11,120
Cho đến nay, cả hai, tính đến tuần 1\n

5110
04:54:11,120 --> 04:54:14,920
chúng tôi vừa dịch từ Scratch sang\n

5111
04:54:14,920 --> 04:54:17,960
như vòng lặp và điều kiện,\nbiểu thức Boolean, biến.

5112
04:54:17,960 --> 04:54:19,210
Vì vậy, giống nhau hơn.

5113
04:54:19,210 --> 04:54:22,690
Nhưng có những tính năng trong C\n

5114
04:54:22,690 --> 04:54:26,560
như kiểu dữ liệu, kiểu biến\n

5115
04:54:26,561 --> 04:54:28,711
nhưng trên thực tế, điều đó có tồn tại ở các ngôn ngữ khác.

5116
04:54:28,710 --> 04:54:30,460
Trên thực tế, có một số thứ\nchúng ta sẽ sớm thấy.

5117
04:54:30,460 --> 04:54:34,931
Vì vậy, để tóm tắt các loại chúng ta đã thấy lần trước\n

5118
04:54:34,931 --> 04:54:39,311
Chúng ta có số nguyên, số float,\nđộ dài, số nhân đôi và ký tự

5119
04:54:39,311 --> 04:54:42,771
còn có Booles và cả chuỗi,\n

5120
04:54:42,771 --> 04:54:46,091
Nhưng hôm nay, chúng ta hãy thực sự bắt đầu\n

5121
04:54:46,091 --> 04:54:50,021
và thực tế thì máy Mac và PC của bạn là gì\n

5122
04:54:50,021 --> 04:54:53,431
dưới dạng int so với char, so với chuỗi\na, so với một thứ khác.

5123
04:54:53,431 --> 04:54:56,181
Và xem liệu chúng ta có thể đặt thêm công cụ không\n

5124
04:54:56,181 --> 04:54:59,890
để chúng ta có thể bắt đầu viết nhanh\n

5125
04:55:01,061 --> 04:55:04,901
Hóa ra là trên\nhầu hết các hệ thống hiện nay

5126
04:55:04,901 --> 04:55:07,271
mặc dù điều này có thể khác nhau tùy theo\máy tính thực tế, điều này

5127
04:55:07,271 --> 04:55:10,300
mỗi loại\ndữ liệu lớn đến mức nào, thông thường

5128
04:55:10,300 --> 04:55:15,850
nằm trong C. Khi bạn lưu trữ một giá trị Boolean,\n

5129
04:55:17,111 --> 04:55:19,361
Điều đó hơi quá đáng,\nbởi vì, nói đúng ra

5130
04:55:19,361 --> 04:55:22,841
bạn chỉ cần 1 bit,\nbằng 1/8 kích thước này.

5131
04:55:22,841 --> 04:55:25,451
Nhưng để đơn giản,\nmáy tính sử dụng cả một byte

5132
04:55:25,451 --> 04:55:28,001
để biểu diễn một Boole, đúng hoặc sai.

5133
04:55:28,001 --> 04:55:32,300
Một ký tự mà chúng ta đã thấy tuần trước\nis chỉ có 1 byte hoặc 8 bit.

5134
04:55:32,300 --> 04:55:37,210
Và đây là lý do tại sao ASCII sử dụng 1\n

5135
04:55:37,210 --> 04:55:41,861
bật, chỉ giới hạn ở 256\nký tự tối đa có thể.

5136
04:55:41,861 --> 04:55:46,201
Lưu ý rằng int là\n4 byte hoặc 32 bit.

5137
04:55:46,201 --> 04:55:48,841
Một float cũng có kích thước 4 byte hoặc 32 bit.

5138
04:55:48,841 --> 04:55:52,111
Nhưng những thứ mà chúng ta gọi là dài,\n

5139
04:55:54,690 --> 04:55:58,161
Giá trị gấp đôi là độ chính xác 64 bit\nđối với các giá trị dấu phẩy động.

5140
04:55:58,161 --> 04:56:01,475
Và một chuỗi, hôm nay, chúng ta\n

5141
04:56:01,475 --> 04:56:03,600
Chúng ta sẽ quay lại vấn đề đó\nsau hôm nay và tuần sau

5142
04:56:03,600 --> 04:56:06,780
về việc một chuỗi chiếm bao nhiêu không gian, nhưng chỉ cần nói thế là đủ

5143
04:56:06,780 --> 04:56:09,748
nó sẽ chiếm một\nkhông gian không đổi

5144
04:56:09,748 --> 04:56:11,791
tùy theo chuỗi\n ngắn hay dài.

5145
04:56:11,791 --> 04:56:14,730
Nhưng chúng ta sẽ sớm biết chính xác điều đó có nghĩa là gì.

5146
04:56:14,730 --> 04:56:19,291
Đây là bức ảnh\na của một phần ký ức điển hình

5147
04:56:19,291 --> 04:56:22,021
bên trong máy Mac, PC hoặc điện thoại của bạn.

5148
04:56:22,021 --> 04:56:24,421
Điều lạ lùng là nó có thể nhỏ hơn một chút\nở một số thiết bị.

5149
04:56:24,420 --> 04:56:27,210
Đây được gọi là RAM\hay bộ nhớ truy cập ngẫu nhiên.

5150
04:56:27,210 --> 04:56:29,670
Mỗi chip đen nhỏ trên mạch này

5151
04:56:29,670 --> 04:56:31,980
bảng, vật màu xanh lá cây,\nnhững con chip nhỏ màu đen này

5152
04:56:31,980 --> 04:56:34,890
là nơi các số 0 và 1 thực sự được lưu trữ.

5153
04:56:34,890 --> 04:56:36,931
Mỗi trong số đó lưu trữ\nmột số byte.

5154
04:56:36,931 --> 04:56:39,390
Ngày nay có thể là megabyte, có thể\thậm chí là gigabyte.

5155
04:56:39,390 --> 04:56:45,690
Vì vậy, hãy tập trung vào một trong những khối đó,\n

5156
04:56:45,690 --> 04:56:49,650
Hãy xem xét thực tế rằng, thậm chí\n

5157
04:56:49,651 --> 04:56:53,731
thứ này được tạo ra như thế nào, nếu\n

5158
04:56:53,730 --> 04:56:56,190
vì mục đích thảo luận,\nit có lý do là

5159
04:56:56,190 --> 04:57:00,091
nếu thứ này đang lưu trữ 1\n tỷ byte, thì 1 gigabyte

5160
04:57:00,091 --> 04:57:02,370
thì chúng ta có thể đánh số chúng một cách tùy ý.

5161
04:57:02,370 --> 04:57:05,850
Có thể đây sẽ là byte\n0, 1, 2, 3, 4, 5, 6, 7, 8.

5162
04:57:05,850 --> 04:57:09,260
Sau đó, có lẽ, ở phía dưới đây\n

5163
04:57:09,260 --> 04:57:13,020
Chúng ta chỉ có thể đánh số những thứ này,\nas có thể là quy ước của chúng ta.

5164
04:57:13,021 --> 04:57:14,971
Hãy vẽ đồ họa đó.

5165
04:57:14,971 --> 04:57:17,351
Không phải với một tỷ ô vuông,\nnhưng ít hơn số đó.

5166
04:57:17,350 --> 04:57:19,670
Và hãy phóng to hơn nữa\nvà xem xét điều đó.

5167
04:57:19,670 --> 04:57:21,420
Tại thời điểm này trong\ncâu chuyện, hãy tóm tắt

5168
04:57:21,420 --> 04:57:23,640
loại bỏ tất cả phần cứng\nvà tất cả các dây nhỏ

5169
04:57:23,640 --> 04:57:27,990
và chỉ nghĩ về ký ức như đang lấy đi\n

5170
04:57:27,991 --> 04:57:30,431
như chiếm một số byte.

5171
04:57:30,431 --> 04:57:34,081
Vì vậy, ví dụ, nếu bạn định lưu trữ\n

5172
04:57:34,080 --> 04:57:38,490
là 1 byte, nó có thể được lưu trữ\na vị trí trên cùng bên trái này

5173
04:57:38,491 --> 04:57:40,456
của chip trí nhớ đen này.

5174
04:57:40,455 --> 04:57:44,550
Nếu bạn định lưu trữ thứ gì đó như\n

5175
04:57:44,550 --> 04:57:47,820
nó có thể sử dụng bốn byte đó,\n

5176
04:57:47,820 --> 04:57:49,480
quay lại quay lại, trong trường hợp này.

5177
04:57:49,480 --> 04:57:53,530
Nếu bạn định lưu trữ một giá trị dài hoặc gấp đôi,\n

5178
04:57:53,530 --> 04:57:55,650
Vì vậy tôi đang điền vào\ncác ô vuông này để biểu thị

5179
04:57:55,651 --> 04:58:00,421
bao nhiêu bộ nhớ và biến đã cho\n

5180
04:58:00,420 --> 04:58:03,490
1, hoặc 4, hoặc 8, trong trường hợp này, ở đây.

5181
04:58:03,491 --> 04:58:06,421
Chà, từ đây, hãy trừu tượng\nngoài tất cả phần cứng

5182
04:58:06,420 --> 04:58:08,580
và thực sự tập trung vào\nbộ nhớ như một mạng lưới.

5183
04:58:08,580 --> 04:58:11,911
Hoặc thực sự, giống như một bức vẽ mà\nchúng ta có thể vẽ bất kỳ loại dữ liệu nào

5184
04:58:13,111 --> 04:58:16,861
Vào cuối ngày, tất cả những điều này\n

5185
04:58:16,861 --> 04:58:20,761
Nhưng việc xây dựng\n sự trừu tượng trên đó là tùy thuộc vào bạn và tôi.

5186
04:58:20,760 --> 04:58:24,390
Những thứ như số thực,\nmàu sắc, hình ảnh, phim và hơn thế nữa.

5187
04:58:24,390 --> 04:58:26,701
Nhưng trước tiên chúng ta sẽ bắt đầu\nở cấp độ thấp hơn ở đây.

5188
04:58:26,701 --> 04:58:30,210
Giả sử tôi có một chương trình\ncần ba số nguyên.

5189
04:58:30,210 --> 04:58:33,060
Một chương trình đơn giản có mục đích\trong cuộc sống là tính trung bình ba

5190
04:58:33,061 --> 04:58:36,661
điểm trong một bài kiểm tra, hoặc một số thứ như vậy.

5191
04:58:36,661 --> 04:58:41,280
Giả sử rằng ba điểm của bạn là\n

5192
04:58:42,405 --> 04:58:47,290
Hãy viết một chương trình thực hiện kiểu tính trung bình này cho chúng ta.

5193
04:58:47,291 --> 04:58:49,121
Hãy để tôi quay lại VS Code ở đây.

5194
04:58:49,120 --> 04:58:52,530
Hãy để tôi mở một tập tin có tên là Score.c.

5195
04:58:52,530 --> 04:58:55,091
Hãy để tôi thực hiện điều này như sau.

5196
04:58:55,091 --> 04:59:00,120
Hãy để tôi đưa stdio.h vào\ntop, int main(void) như trước.

5197
04:59:00,120 --> 04:59:05,580
Sau đó, bên trong phần chính, hãy để tôi\nkhai báo điểm 1, tức là 72.

5198
04:59:08,251 --> 04:59:11,401
Sau đó, điểm thứ ba, được gọi là\nsscore 3, sẽ là 33.

5199
04:59:11,401 --> 04:59:15,001
Bây giờ tôi sẽ sử dụng printf để in\n

5200
04:59:15,001 --> 04:59:16,780
và tôi có thể làm điều này bằng\na một vài cách khác nhau.

5201
04:59:16,780 --> 04:59:22,111
Nhưng tôi sẽ in ra %f, và\n

5202
04:59:22,111 --> 04:59:28,021
cộng điểm 3, chia cho 3,\nđóng dấu chấm phẩy trong ngoặc đơn.

5203
04:59:28,021 --> 04:59:31,561
Một số phép tính tương đối đơn giản\n

5204
04:59:31,561 --> 04:59:34,831
nếu tôi tò mò điểm trung bình của tôi là bao nhiêu\n

5205
04:59:35,881 --> 04:59:39,877
Bây giờ hãy để tôi ghi điểm.

5206
04:59:39,877 --> 04:59:43,501
Được rồi, vậy là tôi đã\nđã mắc lỗi bằng cách nào đó rồi.

5207
04:59:43,501 --> 04:59:49,411
Nhưng thực ra đây là một vấn đề mà chúng tôi hy vọng

5208
04:59:49,411 --> 04:59:51,120
sẽ không gặp quá thường xuyên.

5209
04:59:52,120 --> 04:59:55,620
Vì vậy, được gạch chân để đạt điểm 1, cộng thêm\n

5210
04:59:55,620 --> 05:00:00,510
Định dạng chỉ định loại gấp đôi, nhưng\n

5211
05:00:02,791 --> 05:00:04,691
Bởi vì số học\ndường như đã được kiểm chứng.

5212
05:00:05,190 --> 05:00:08,820
ĐỐI TƯỢNG: Vậy là máy tính đang thực hiện\n

5213
05:00:08,820 --> 05:00:13,521
chỉ đưa ra một giá trị tại\nend bởi vì, à [KHÔNG NGHE ĐƯỢC]

5214
05:00:14,471 --> 05:00:15,901
Và chúng ta sẽ quay lại\nchi tiết hơn

5215
05:00:15,901 --> 05:00:18,783
nhưng, thực sự, chuyện gì đang xảy ra ở đây\n

5216
05:00:18,782 --> 05:00:20,740
hiển nhiên rồi, bởi vì tôi\nđịnh nghĩa chúng ngay tại đây.

5217
05:00:20,741 --> 05:00:23,731
Và tôi đang chia cho người khác\nint, 3, nhưng số cá bắt được

5218
05:00:23,730 --> 05:00:28,150
là, nhớ lại C đó khi nó thực hiện phép toán,\n

5219
05:00:28,151 --> 05:00:30,070
Nhưng số nguyên không phải là\ngiá trị dấu phẩy động.

5220
05:00:30,070 --> 05:00:33,151
Vì vậy, nếu bạn thực sự muốn có được\nchính xác, hãy lấy điểm trung bình

5221
05:00:33,151 --> 05:00:37,021
mà không vứt bỏ phần còn lại,\n

5222
05:00:37,021 --> 05:00:39,690
hóa ra, chúng ta sẽ phải--

5223
05:00:42,690 --> 05:00:46,980
[CƯỜI] chúng ta sẽ phải\n

5224
05:00:47,611 --> 05:00:50,491
Và có một số cách để\nlàm điều này nhưng cách dễ nhất

5225
05:00:50,491 --> 05:00:52,801
bây giờ, tôi sẽ tiếp tục và làm điều này ở đây

5226
05:00:52,800 --> 05:00:55,620
Tôi sẽ thay đổi\nchia cho 3 thành chia cho 3.0.

5227
05:00:55,620 --> 05:00:59,701
Bởi vì hóa ra, câu chuyện dài,\n

5228
05:00:59,701 --> 05:01:01,561
tham gia vào một\biểu thức số học

5229
05:01:01,561 --> 05:01:03,991
như thế này là thứ gì đó\ngiống như một cái phao, phần còn lại

5230
05:01:03,991 --> 05:01:08,471
cũng sẽ được coi là được thăng cấp lên\na giá trị dấu phẩy động.

5231
05:01:08,471 --> 05:01:13,756
Vì vậy, bây giờ hãy để tôi biên dịch lại\ncode này với điểm số, Enter.

5232
05:01:13,756 --> 05:01:17,761
Lần này nó hoạt động tốt vì\nTôi đang coi một cái float là một cái float.

5233
05:01:19,861 --> 05:01:24,411
Được rồi, mức trung bình của tôi là\n59,33333, v.v.

5234
05:01:24,911 --> 05:01:27,600
Vì vậy, có lẽ phép toán đã được kiểm chứng.

5235
05:01:27,600 --> 05:01:30,480
Bỏ qua sự thiếu chính xác của dấu phẩy động\nmỗi tuần trước.

5236
05:01:30,480 --> 05:01:33,541
Nhưng hãy xem xét\nthiết kế của chương trình này.

5237
05:01:33,541 --> 05:01:40,941
Nó là gì, kiểu gì, xấu về nó, hoặc nếu\n

5238
05:01:40,940 --> 05:01:43,740
liệu chúng ta có hối hận về\nthiết kế của chương trình này không?

5239
05:01:43,741 --> 05:01:45,251
Điều gì có thể không lý tưởng ở đây?

5240
05:01:54,625 --> 05:01:58,480
DAVID Malan: Vâng, vậy trong trường hợp này,\n

5241
05:01:58,480 --> 05:02:01,400
Vì vậy, nếu tôi nghe nhầm\nthì chương trình này

5242
05:02:01,401 --> 05:02:03,861
sẽ chỉ cho tôi biết mức trung bình cụ thể này.

5243
05:02:03,861 --> 05:02:05,991
Tôi thậm chí không sử dụng\nthứ gì đó như, get int

5244
05:02:05,991 --> 05:02:09,051
hoặc nổi lên để nhận được ba\nđiểm khác nhau, vì vậy điều đó không tốt.

5245
05:02:09,050 --> 05:02:11,202
Và giả sử rằng chúng ta đợi\ncuối học kỳ

5246
05:02:11,203 --> 05:02:12,661
Tôi nghĩ những vấn đề khác có thể phát sinh.

5247
05:02:13,161 --> 05:02:15,280
KHÁN GIẢ: Chỉ suy nghĩ\ncũng là một vấn đề

5248
05:02:15,280 --> 05:02:17,161
rằng bạn không thể sử dụng lại số đó.

5249
05:02:17,161 --> 05:02:19,710
DAVID Malan: Tôi không thể\nsử dụng lại số này bởi vì tôi

5250
05:02:19,710 --> 05:02:23,348
chưa lưu trữ mức trung bình ở một số\n

5251
05:02:23,348 --> 05:02:25,890
một vấn đề lớn, nhưng chắc chắn, nếu\ntôi muốn sử dụng lại nó ở nơi khác

5252
05:02:26,911 --> 05:02:29,286
Hãy tua nhanh lại,\nmột lát sau trong học kỳ

5253
05:02:29,286 --> 05:02:31,651
Tôi không chỉ có ba\nđiểm kiểm tra hay điểm thi

5254
05:02:34,951 --> 05:02:36,562
KHÁN GIẢ: Vâng, nếu bạn\không bao giờ muốn phải nhận

5255
05:02:36,562 --> 05:02:39,161
mức trung bình của mọi số\nđiểm khác 3, [KHÔNG NGHE ĐƯỢC]

5256
05:02:39,161 --> 05:02:42,370
DAVID Malan: Vâng, tôi đã sắp xếp\nof, giới hạn chương trình này ở mức 3.

5257
05:02:42,370 --> 05:02:45,202
Và thành thật mà nói, đây gần như là kiểu sao chép và dán.

5258
05:02:45,203 --> 05:02:48,161
Mặc dù các biến, vâng, có\n

5259
05:02:49,061 --> 05:02:51,491
Hãy tưởng tượng bạn đang làm điều này cho một\nsổ sách toàn lớp cho một lớp học.

5260
05:02:51,491 --> 05:02:57,251
Phải đạt điểm 4, 5, 6, 11 10, 12,\n

5261
05:02:57,251 --> 05:02:59,681
Bạn có thể tưởng tượng\nmã bắt đầu xấu đến mức nào

5262
05:02:59,681 --> 05:03:02,896
để nhận nếu bạn chỉ định nghĩa biến\n

5263
05:03:02,896 --> 05:03:07,001
Hóa ra là có\nnhững cách tốt hơn, trong các ngôn ngữ như C

5264
05:03:07,001 --> 05:03:11,501
nếu bạn muốn có nhiều\ngiá trị được lưu trữ trong bộ nhớ

5265
05:03:11,501 --> 05:03:13,300
tình cờ có cùng kiểu dữ liệu.

5266
05:03:13,300 --> 05:03:14,681
Chúng ta hãy nhìn lại\n ký ức này, tại đây

5267
05:03:14,681 --> 05:03:16,806
để xem những thứ này\ncó thể trông như thế nào trong bộ nhớ.

5268
05:03:16,806 --> 05:03:18,431
Đây là mạng lưới bộ nhớ.

5269
05:03:18,431 --> 05:03:20,710
Mỗi lần thu hồi này đại diện cho một byte.

5270
05:03:20,710 --> 05:03:23,951
Để rõ ràng, nếu tôi lưu\nscore 1 vào bộ nhớ trước

5271
05:03:23,951 --> 05:03:25,390
nó sẽ chiếm bao nhiêu byte?

5272
05:03:28,690 --> 05:03:32,838
Vì vậy tôi có thể chấm điểm 1 để lấp đầy phần này của bộ nhớ.

5273
05:03:32,838 --> 05:03:36,131
Việc đó có tùy thuộc vào máy tính hay không\n

5274
05:03:36,131 --> 05:03:39,550
Tôi chỉ đang giữ những bức ảnh sạch sẽ\n

5275
05:03:39,550 --> 05:03:42,341
Sau đó, nếu tôi khai báo một biến\nkhác, được gọi là điểm 2

5276
05:03:42,341 --> 05:03:44,991
nó có thể kết thúc ở đó\ncũng chiếm 4 byte.

5277
05:03:44,991 --> 05:03:47,591
Và sau đó điểm 3 có thể kết thúc ở đây.

5278
05:03:47,591 --> 05:03:51,140
Vậy đó chỉ là thể hiện những gì đang diễn ra\n

5279
05:03:51,140 --> 05:03:54,940
Nhưng về mặt kỹ thuật,\nphải rõ ràng, mỗi tuần 0, cái gì

5280
05:03:54,940 --> 05:03:58,841
thực sự được lưu trữ trong máy tính\n

5281
05:03:58,841 --> 05:04:03,611
Trong trường hợp này, tổng cộng là 32,\nvì 32 bit là 4 byte.

5282
05:04:03,611 --> 05:04:07,541
Nhưng một lần nữa, việc suy nghĩ và nhìn lại trở nên nhàm chán\nnhanh chóng

5283
05:04:09,021 --> 05:04:11,381
Vì vậy, nói chung, chúng ta sẽ trừu tượng\nđiều này chỉ bằng cách sử dụng

5284
05:04:11,381 --> 05:04:13,811
thay vào đó là số thập phân, trong trường hợp này.

5285
05:04:13,811 --> 05:04:18,431
Nhưng có thể có cách tốt hơn để\n

5286
05:04:18,431 --> 05:04:21,761
nhưng có thể là bốn, có thể,\nnăm, có thể là 10, có thể, nhiều hơn

5287
05:04:21,760 --> 05:04:27,370
bằng cách khai báo một biến để lưu trữ\n

5288
05:04:27,370 --> 05:04:30,010
hoặc nhiều biến riêng lẻ.

5289
05:04:30,010 --> 05:04:34,510
Cách để thực hiện điều này là bằng cách\nmột thứ được gọi là mảng.

5290
05:04:34,510 --> 05:04:42,580
Mảng là một loại dữ liệu khác\n

5291
05:04:42,580 --> 05:04:45,240
cùng loại, nối tiếp nhau.

5292
05:04:45,241 --> 05:04:46,491
Tức là liền kề nhau.

5293
05:04:46,491 --> 05:04:54,101
Vì vậy, một mảng có thể cho phép bạn tạo\n

5294
05:04:54,100 --> 05:04:56,860
hoặc thậm chí nhiều hơn\nnhưng hãy mô tả chúng

5295
05:04:56,861 --> 05:05:00,651
tất cả đều sử dụng cùng một biến\nname, cùng một tên.

5296
05:05:00,651 --> 05:05:05,001
Vì vậy, ví dụ, nếu, với một\n

5297
05:05:05,001 --> 05:05:10,061
nhưng tôi không muốn tuyên bố một cách lộn xộn\n

5298
05:05:11,221 --> 05:05:13,390
Đây là đoạn cú pháp mới\nđầu tiên của ngày hôm nay

5299
05:05:13,390 --> 05:05:15,550
dấu ngoặc vuông\nmà chúng ta đang thấy.

5300
05:05:15,550 --> 05:05:21,400
Dòng mã này ở đây\ntương tự như int point 1 dấu chấm phẩy

5301
05:05:21,401 --> 05:05:24,621
hoặc int điểm 1 bằng 72 dấu chấm phẩy.

5302
05:05:24,620 --> 05:05:30,040
Dòng mã này đang khai báo cho\n

5303
05:05:30,041 --> 05:05:33,521
Và mảng đó sẽ\nlưu trữ ba số nguyên.

5304
05:05:34,030 --> 05:05:39,251
Bởi vì kiểu\narray đó là int ở đây.

5305
05:05:39,251 --> 05:05:42,370
Dấu ngoặc vuông cho\nmáy tính biết bạn muốn bao nhiêu int.

5306
05:05:43,241 --> 05:05:45,401
Và cái tên đó tất nhiên là điểm số.

5307
05:05:45,401 --> 05:05:47,801
Mà, trong tiếng Anh, tôi đã\ncố tình số nhiều

5308
05:05:47,800 --> 05:05:52,361
để tôi có thể mô tả mảng này\n

5309
05:05:52,361 --> 05:05:57,230
Vì vậy nếu bây giờ tôi muốn gán giá trị\n

5310
05:05:59,021 --> 05:06:04,421
Tôi có thể nói, khung điểm 0 bằng\n

5311
05:06:04,420 --> 05:06:06,450
và điểm ở khung 2 bằng 33.

5312
05:06:06,451 --> 05:06:08,201
Phải thừa nhận rằng điều kỳ lạ duy nhất là\ncó

5313
05:06:08,201 --> 05:06:10,091
dấu ngoặc vuông vẫn còn mới.

5314
05:06:10,091 --> 05:06:14,081
Nhưng lưu ý, chúng tôi cũng đang lập chỉ mục\n0 mọi thứ.

5315
05:06:14,080 --> 05:06:16,605
Chỉ số bằng 0 có nghĩa là\nbắt đầu đếm từ 0.

5316
05:06:16,605 --> 05:06:18,730
Khi chúng ta đã nói về\nđiều đó trước đây, bốn vòng lặp của chúng ta

5317
05:06:18,730 --> 05:06:20,260
nói chung là không được lập chỉ mục.

5318
05:06:20,260 --> 05:06:24,130
Mảng trong C được lập chỉ mục bằng 0.

5319
05:06:24,131 --> 05:06:25,691
Và bạn không có sự lựa chọn về điều đó.

5320
05:06:25,690 --> 05:06:28,810
Bạn không thể bắt đầu đếm ở mảng 1\nin vì bạn muốn

5321
05:06:28,811 --> 05:06:31,091
bạn sẽ hy sinh\không có yếu tố nào.

5322
05:06:31,091 --> 05:06:33,881
Bạn phải bắt đầu trong\nars đếm từ 0.

5323
05:06:33,881 --> 05:06:37,390
Vì vậy, nằm ngoài ngữ cảnh, điều này\nkhông giải quyết được vấn đề

5324
05:06:37,390 --> 05:06:39,460
nhưng chắc chắn là nó\nsẽ xảy ra khi chúng ta có nhiều hơn

5325
05:06:39,460 --> 05:06:41,170
hơn, thậm chí, ba điểm ở đây.

5326
05:06:41,170 --> 05:06:44,010
Thực ra, hãy để tôi thay đổi\nchương trình này một chút.

5327
05:06:45,710 --> 05:06:48,280
Và xóa ba dòng này ở đây.

5328
05:06:48,280 --> 05:06:51,341
Và thay thế nó bằng biến\nscores

5329
05:06:51,341 --> 05:06:54,401
sẵn sàng lưu trữ ba số nguyên tổng cộng.

5330
05:06:54,401 --> 05:06:58,391
Và sau đó, khởi tạo chúng như\nsau, khung điểm 0 là 72

5331
05:06:58,390 --> 05:07:02,560
như trước, khung điểm 1 sẽ là 73, khung điểm 2

5332
05:07:04,001 --> 05:07:08,329
Lưu ý, tôi không cần phải nói\nint trước bất kỳ dòng nào trong số này

5333
05:07:08,329 --> 05:07:10,121
bởi vì việc đó đã được\quan tâm rồi

5334
05:07:10,120 --> 05:07:14,830
đối với tôi ở dòng 5, nơi tôi đã có\n

5335
05:07:17,591 --> 05:07:21,280
Bây giờ, ở dưới đây, mã này cần\n

5336
05:07:21,280 --> 05:07:23,560
ba biến số 1, 2 và 3.

5337
05:07:23,561 --> 05:07:28,211
Tôi có 1 biến nhưng\nmà tôi có thể lập chỉ mục.

5338
05:07:28,210 --> 05:07:33,010
Sau đó, tôi sẽ ghi điểm\n

5339
05:07:33,010 --> 05:07:37,630
cộng với điểm số ở khung 2, tức là\n

5340
05:07:37,631 --> 05:07:39,161
trả lại cho tôi ba số nguyên đó.

5341
05:07:39,161 --> 05:07:42,120
Nhưng hãy lưu ý, mọi lúc tôi đều sử dụng cùng một tên biến.

5342
05:07:42,120 --> 05:07:45,330
Và một lần nữa, tôi đang sử dụng hình vuông mới này\n

5343
05:07:45,330 --> 05:07:50,850
lập chỉ mục vào mảng để lấy số đầu tiên\n

5344
05:07:50,850 --> 05:07:53,100
và sau đó, làm lại điều đó ở dưới đây.

5345
05:07:53,100 --> 05:07:56,167
Bây giờ, chương trình này, vẫn chưa thực sự\n

5346
05:07:56,168 --> 05:07:58,501
Tôi vẫn chỉ có thể lưu được ba\nsđiểm, nhưng chúng tôi sẽ quay lại

5347
05:07:58,501 --> 05:08:00,190
đến một cái gì đó như thế không lâu sau.

5348
05:08:00,190 --> 05:08:03,210
Nhưng hiện tại, chúng tôi chỉ đang giới thiệu\n

5349
05:08:03,210 --> 05:08:09,240
nhờ đó, bây giờ tôi có thể lưu trữ nhiều\ngiá trị trong cùng một biến.

5350
05:08:09,241 --> 05:08:11,371
Chà, hãy nâng cao điều này hơn một chút.

5351
05:08:11,370 --> 05:08:14,920
Thay vì mã hóa cứng các điểm số này,\n

5352
05:08:14,920 --> 05:08:19,050
hãy sử dụng get int để hỏi\nngười dùng cho điểm.

5353
05:08:19,050 --> 05:08:22,591
Sau đó, hãy sử dụng get int để\nêu người dùng một điểm khác.

5354
05:08:22,591 --> 05:08:25,800
Hãy sử dụng get int để yêu cầu\nngười dùng cho điểm thứ ba

5355
05:08:25,800 --> 05:08:28,661
lưu trữ chúng ở những vị trí\ntương ứng đó.

5356
05:08:28,661 --> 05:08:34,080
Và bây giờ, nếu tôi tiếp tục và lưu\n

5357
05:08:35,161 --> 05:08:38,251
Bây giờ những lỗi này có lẽ đã quen thuộc một chút.

5358
05:08:41,010 --> 05:08:42,135
Hãy để tôi cho mọi người một chút thời gian.

5359
05:08:45,361 --> 05:08:48,480
Đó không phải là cố ý nên vẫn\n

5360
05:08:50,580 --> 05:08:53,830
Bây giờ tôi sẽ quay lại phía dưới\n

5361
05:08:54,330 --> 05:08:55,930
Chúng tôi đã quay trở lại hoạt động kinh doanh, ./scores.

5362
05:08:55,931 --> 05:08:58,181
Bây giờ, chương trình đang trở nên thú vị hơn một chút.

5363
05:08:58,181 --> 05:09:02,280
Vì vậy có lẽ năm nay tốt hơn và tôi đã có\n

5364
05:09:05,161 --> 05:09:06,631
Vì thế bây giờ nó năng động hơn một chút.

5365
05:09:06,631 --> 05:09:07,531
Nó thú vị hơn một chút.

5366
05:09:07,530 --> 05:09:10,238
Nhưng nó vẫn đạt giới hạn số lượng\n

5367
05:09:10,239 --> 05:09:15,001
Nhưng bây giờ, tôi đã giới thiệu một người khác,\n

5368
05:09:15,001 --> 05:09:18,368
Có biểu thức này trong lập trình,\n

5369
05:09:18,368 --> 05:09:20,161
[SNIFFS AIR] có gì đó\ncó mùi hơi khó chịu.

5370
05:09:20,161 --> 05:09:24,811
Và có điều gì đó không ổn ở đây\n

5371
05:09:24,811 --> 05:09:29,341
Có ai nhìn thấy cơ hội để\n

5372
05:09:29,341 --> 05:09:32,491
nếu mục tiêu của tôi vẫn là giành được ba\n

5373
05:09:32,491 --> 05:09:34,691
mà không có mùi [SNIFF] thì có tệ không?

5374
05:09:35,190 --> 05:09:37,200
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] sử dụng vòng lặp 4?

5375
05:09:37,201 --> 05:09:40,219
Bằng cách đó, bạn không cần phải sao chép\và dán tất cả các điểm số đó.

5376
05:09:40,219 --> 05:09:41,421
DAVID Malan: Vâng, chính xác.

5377
05:09:41,420 --> 05:09:43,282
Những dòng mã\gần như giống hệt nhau.

5378
05:09:43,282 --> 05:09:45,740
Và thành thật mà nói, điều duy nhất\nđang thay đổi là con số

5379
05:09:45,741 --> 05:09:47,361
và nó chỉ tăng thêm 1.

5380
05:09:47,361 --> 05:09:49,591
Chúng tôi có tất cả\nkhối nền tảng để thực hiện việc này tốt hơn.

5381
05:09:49,591 --> 05:09:51,390
Vì vậy, hãy để tôi tiếp tục và cải thiện điều này.

5382
05:09:55,980 --> 05:10:00,411
Vì vậy, với int tôi nhận được 0, i\nnhỏ hơn 3, i cộng cộng.

5383
05:10:00,411 --> 05:10:03,320
Sau đó, bên trong vòng lặp 4 này,\ntôi có thể chắt lọc cả ba

5384
05:10:03,320 --> 05:10:05,120
của những dòng đó thành\nthứ gì đó chung chung hơn

5385
05:10:05,120 --> 05:10:10,790
giống như khung điểm tôi bằng get\n

5386
05:10:10,791 --> 05:10:13,166
một lần, thông qua get int, để ghi điểm.

5387
05:10:13,166 --> 05:10:16,261
Vì vậy, đây là lúc mảng\nbắt đầu trở nên khá mạnh mẽ.

5388
05:10:16,260 --> 05:10:18,260
Bạn không cần phải hard\ncode, nghĩa là theo nghĩa đen

5389
05:10:18,260 --> 05:10:20,722
gõ vào tất cả những con số\nma thuật này như 0, 1 và 2.

5390
05:10:20,723 --> 05:10:22,431
Bạn có thể bắt đầu thực hiện\nit theo chương trình

5391
05:10:24,030 --> 05:10:25,611
Vì thế bây giờ tôi đã thắt chặt mọi thứ lại.

5392
05:10:25,611 --> 05:10:28,491
Hiện tại tôi đang nhận được\nba điểm số khác nhau

5393
05:10:28,491 --> 05:10:31,027
nhưng đặt chúng ở ba vị trí khác nhau.

5394
05:10:31,026 --> 05:10:34,730
Và cuối cùng, chương trình này là\n

5395
05:10:34,730 --> 05:10:41,780
Ghi điểm, ./scores và 100, 99,\n

5396
05:10:41,780 --> 05:10:43,700
Nhưng nó cũng được thiết kế tốt hơn một chút.

5397
05:10:43,701 --> 05:10:45,620
Nếu tôi thực sự muốn\nchọn, thì có điều gì đó

5398
05:10:45,620 --> 05:10:47,361
vẫn còn mùi, một chút, ở đây.

5399
05:10:47,361 --> 05:10:51,800
Sự thật là tôi có cái này\n

5400
05:10:51,800 --> 05:10:54,150
phải giống với con số này ở đây.

5401
05:10:54,151 --> 05:10:56,431
Nếu không thì ai biết\nđiều gì sẽ xảy ra.

5402
05:10:56,431 --> 05:10:58,640
Vậy đâu là\ngiải pháp cho tuần trước

5403
05:10:58,640 --> 05:11:01,221
để làm sạch mã đó hơn nữa?

5404
05:11:01,221 --> 05:11:04,011
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC]\ntheo quyết định của người dùng

5405
05:11:04,010 --> 05:11:06,002
có bao nhiêu điểm đầu vào [KHÔNG NGHE ĐƯỢC].

5406
05:11:06,003 --> 05:11:09,050
DAVID Malan: Được rồi, vậy chúng ta có thể rời đi\n

5407
05:11:09,050 --> 05:11:11,760
Và thực ra, chúng tôi có thể\nlàm điều gì đó như thế này.

5408
05:11:11,760 --> 05:11:13,460
Hãy để tôi thực hiện điều này trước một vài bước.

5409
05:11:13,460 --> 05:11:20,490
Hãy để tôi nói điều gì đó như, int n gets\n

5410
05:11:20,491 --> 05:11:24,861
thì tôi thực sự có thể thay đổi điều này\n

5411
05:11:24,861 --> 05:11:27,230
và thực sự, làm cho\ntoàn bộ chương trình trở nên năng động?

5412
05:11:27,230 --> 05:11:29,931
Hỏi con người đã có bao nhiêu bài kiểm tra trong học kỳ này?

5413
05:11:29,931 --> 05:11:31,761
Sau đó, bạn có thể nhập\nmỗi điểm số đó

5414
05:11:31,760 --> 05:11:33,968
vì vòng lặp sẽ\n lặp đi lặp lại nhiều lần như vậy.

5415
05:11:33,969 --> 05:11:37,281
Và sau đó bạn sẽ nhận được điểm trung bình\ncủa một bài kiểm tra, hai bài kiểm tra, ba--

5416
05:11:37,280 --> 05:11:41,780
à, thua một cái khác-- hoặc tuy nhiên\nnhiều điểm số thực sự là

5417
05:11:41,780 --> 05:11:45,021
do người dùng chỉ định Vâng, câu hỏi?

5418
05:11:45,021 --> 05:11:50,026
ĐỐI TƯỢNG: Có bao nhiêu bit hoặc\nbyte được sử dụng trong một mảng?

5419
05:11:50,026 --> 05:11:52,320
DAVID Malan: Có bao nhiêu\nbyte được sử dụng trong một mảng?

5420
05:11:52,320 --> 05:11:56,784
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC] mục đích\nlàm điều này là để lưu [KHÔNG NGHE ĐƯỢC]

5421
05:11:56,784 --> 05:11:59,760
DAVID Malan: Vậy mục đích của mảng\nan không phải để tiết kiệm không gian.

5422
05:11:59,760 --> 05:12:03,270
Đó là để loại bỏ việc có\nnhiều tên biến

5423
05:12:03,271 --> 05:12:05,161
bởi vì điều đó sẽ rất lộn xộn một cách nhanh chóng.

5424
05:12:05,161 --> 05:12:09,241
Nếu bạn có điểm 1, điểm 2,\nsđiểm 3, chấm, chấm, chấm, điểm 99

5425
05:12:09,241 --> 05:12:12,361
đó là khoảng 99 biến\nkhác nhau, có khả năng

5426
05:12:12,361 --> 05:12:18,421
rằng bạn có thể thu gọn thành một\nbiến có 99 vị trí.

5427
05:12:18,420 --> 05:12:20,490
Tại các chỉ số, hoặc chỉ mục khác nhau.

5428
05:12:20,491 --> 05:12:22,831
Như ai đó sẽ nói,\nchỉ mục cho một mảng

5429
05:12:22,830 --> 05:12:25,016
là bất cứ điều gì trong ngoặc vuông.

5430
05:12:35,820 --> 05:12:37,541
DAVID Malan: Vì vậy đó là một câu hỏi hay.

5431
05:12:37,541 --> 05:12:39,631
Vì vậy nếu bạn-- Tôi đang sử dụng\nints cho mọi thứ--

5432
05:12:39,631 --> 05:12:41,820
và thành thật mà nói, chúng ta\nthực sự không cần int cho điểm số

5433
05:12:41,820 --> 05:12:46,030
bởi vì tôi không có khả năng nhận được\n

5434
05:12:46,030 --> 05:12:47,880
Và vì vậy bạn có thể sử dụng\ncác loại dữ liệu khác nhau.

5435
05:12:47,881 --> 05:12:50,548
Và danh sách chúng ta có trên màn hình\gần hơn không phải là tất cả.

5436
05:12:50,547 --> 05:12:54,030
Có một kiểu dữ liệu tên là short,\nngắn hơn int

5437
05:12:54,030 --> 05:12:59,111
về mặt kỹ thuật, bạn có thể sử dụng char, trong\n

5438
05:12:59,111 --> 05:13:01,201
Nói chung, vào năm 2021, những

5439
05:13:01,201 --> 05:13:05,251
có xu hướng đưa ra các quyết định quá tối ưu--\tối ưu hóa quá mức.

5440
05:13:05,251 --> 05:13:07,201
Mọi người chỉ sử dụng\nint, mặc dù không có ai

5441
05:13:07,201 --> 05:13:10,561
sẽ nhận được điểm kiểm tra là 2\n

5442
05:13:11,521 --> 05:13:14,512
Nhiều năm trước, bộ nhớ rất đắt tiền.

5443
05:13:14,512 --> 05:13:16,470
Và mọi bản năng của bạn sẽ

5444
05:13:16,471 --> 05:13:18,961
ngay lập tức vì trí nhớ quá eo hẹp.

5445
05:13:18,960 --> 05:13:21,190
Nhưng ngày nay, chúng ta không còn lo lắng nhiều về điều đó nữa.

5446
05:13:21,690 --> 05:13:26,816
ĐỐI TƯỢNG: Tôi có câu hỏi\nvề lỗi [KHÔNG NGHE ĐƯỢC]..

5447
05:13:26,816 --> 05:13:30,865
Có thể nào-- khi bạn đang thực hiện một\nhash vấn đề trên tập hợp vấn đề--

5448
05:13:30,866 --> 05:13:34,271
DAVID Malan: Vậy\sự khác biệt giữa việc chia hai số nguyên là gì

5449
05:13:34,271 --> 05:13:36,640
và không gặp lỗi như\nbạn có thể đã gặp phải

5450
05:13:36,640 --> 05:13:40,181
trong một chương trình như tiền mặt,\nso với việc chia hai số nguyên

5451
05:13:40,181 --> 05:13:42,411
và gặp lỗi\ngiống như tôi vừa làm cách đây không?

5452
05:13:42,411 --> 05:13:46,541
Sự cố với kịch bản tôi đã tạo\n

5453
05:13:46,541 --> 05:13:52,241
Và tôi đã bảo printf sử dụng %f,\n

5454
05:13:52,241 --> 05:13:54,841
chia một số nguyên cho một số nguyên khác.

5455
05:13:54,841 --> 05:13:57,190
Vì vậy, chính printf đã la mắng tôi.

5456
05:13:57,190 --> 05:14:00,190
Tôi đoán trong trường hợp này bạn\n

5457
05:14:00,190 --> 05:14:03,440
printf không liên quan đến\ndòng mã cụ thể đó.

5458
05:14:03,440 --> 05:14:05,126
Vì vậy, đó là sự khác biệt, ở đó.

5459
05:14:05,920 --> 05:14:09,370
Vì vậy, bây giờ, chúng ta có\nkhả năng này để tạo một mảng.

5460
05:14:09,370 --> 05:14:11,771
Và một mảng có thể lưu trữ nhiều giá trị.

5461
05:14:11,771 --> 05:14:15,710
Vậy thì chúng ta có thể làm gì hơn nữa\n

5462
05:14:16,210 --> 05:14:18,490
Vâng, chúng ta hãy tiến thêm một bước nữa.

5463
05:14:18,491 --> 05:14:25,391
Ngược lại với việc chỉ lưu trữ 72, 73, 33 hoặc\n

5464
05:14:25,390 --> 05:14:30,190
bởi vì một lần nữa, một mảng sẽ cho bạn một\n

5465
05:14:30,190 --> 05:14:32,620
hoặc các chỉ số trong đó,\nngoặc 0, ngoặc 1

5466
05:14:32,620 --> 05:14:35,591
dấu ngoặc 2 trở lên, nếu nó\nthậm chí còn lớn hơn thế.

5467
05:14:35,591 --> 05:14:40,361
Bây giờ chúng ta hãy bắt đầu xem xét điều gì đó\n

5468
05:14:40,361 --> 05:14:43,091
Các ký tự có kích thước 1 byte nên chúng thậm chí còn nhỏ hơn

5469
05:14:43,091 --> 05:14:44,350
chúng chiếm ít không gian hơn nhiều.

5470
05:14:44,350 --> 05:14:46,308
Và thực sự, nếu tôi muốn\nnói một tin nhắn như

5471
05:14:46,309 --> 05:14:48,460
xin chào, tôi có thể sử dụng ba biến.

5472
05:14:48,460 --> 05:14:52,780
Nếu tôi muốn một chương trình được in,\nhi, dấu chấm than H-I

5473
05:14:52,780 --> 05:14:57,490
Tất nhiên là tôi có thể lưu trữ chúng trong\n

5474
05:14:57,491 --> 05:15:00,971
Và hãy cùng thảo luận,\n

5475
05:15:00,971 --> 05:15:03,941
Bây giờ, hãy để tôi tạo một\nchương trình mới trong VS Code.

5476
05:15:03,940 --> 05:15:07,181
Lần này tôi sẽ gọi nó là hi.c.

5477
05:15:07,181 --> 05:15:09,911
Và tôi sẽ không bận tâm\nvới thư viện CS50.

5478
05:15:09,911 --> 05:15:11,920
Hiện tại tôi chỉ cần cái\nI/O tiêu chuẩn.

5479
05:15:13,480 --> 05:15:16,661
Và sau đó, vào bên trong phần chính, tôi sẽ đi\n

5480
05:15:16,661 --> 05:15:20,021
Và hy vọng điều này đã\n gây ấn tượng với bạn như một ý tưởng tồi.

5481
05:15:20,021 --> 05:15:22,570
Nhưng tạm thời chúng ta sẽ đi theo con đường này\n

5482
05:15:22,570 --> 05:15:26,561
với c1, c2 và cuối cùng là c3.

5483
05:15:26,561 --> 05:15:29,921
Lưu trữ từng ký tự trong\ncụm từ tôi muốn in

5484
05:15:29,920 --> 05:15:33,710
và tôi sẽ in\n cái này theo cách khác với cách thông thường.

5485
05:15:35,140 --> 05:15:38,740
Và nhìn chung, chúng tôi đã giải quyết\n

5486
05:15:38,741 --> 05:15:45,861
Nhưng %c, %c, %c sẽ để tôi in ra\n

5487
05:15:45,861 --> 05:15:48,681
Vì vậy, một cách ngu ngốc để in ra một chuỗi.

5488
05:15:48,681 --> 05:15:51,201
Vậy là chúng tôi đã có giải pháp\ncho vấn đề này vào tuần trước.

5489
05:15:51,201 --> 05:15:54,800
Nhưng chúng ta hãy tìm hiểu xem\n có gì

5490
05:15:58,736 --> 05:16:00,611
Nhưng một lần nữa, chúng ta lẽ ra đã có thể làm điều này vào tuần trước

5491
05:16:00,611 --> 05:16:03,791
bằng một chuỗi và chỉ một\nbiến hoặc thậm chí là 0 tại thời điểm đó.

5492
05:16:03,791 --> 05:16:07,480
Nhưng hãy bắt đầu chuyển đổi\nnhững ký tự này

5493
05:16:07,480 --> 05:16:12,010
với số tương đương rõ ràng của chúng\n

5494
05:16:12,010 --> 05:16:16,570
Hãy để tôi sửa đổi những %c này,\nchỉ để cho vui, thành %i.

5495
05:16:16,570 --> 05:16:20,440
Và hãy để tôi thêm một số khoảng trắng vào đó\n

5496
05:16:20,440 --> 05:16:24,610
Bây giờ hãy để tôi biên dịch lại\nhi và để tôi chạy lại nó.

5497
05:16:24,611 --> 05:16:27,161
Để đoán xem,\ntôi nên nhìn thấy gì trên màn hình bây giờ?

5498
05:16:30,960 --> 05:16:32,296
ĐỐI TƯỢNG: Giá trị ASCII?

5499
05:16:32,296 --> 05:16:34,020
DAVID Malan: Các giá trị ASCII.

5500
05:16:34,021 --> 05:16:36,480
Và đó là cố ý\nTôi tiếp tục sử dụng cùng một từ

5501
05:16:36,480 --> 05:16:42,510
xin chào, vì hy vọng là như vậy,\n

5502
05:16:42,510 --> 05:16:46,380
Tức là c biết về\n

5503
05:16:46,381 --> 05:16:48,581
và có thể tự động thực hiện việc chuyển đổi này\ncho chúng tôi.

5504
05:16:48,580 --> 05:16:51,930
Và có vẻ như nó đang làm điều đó một cách ngấm ngầm đối với chúng ta, có thể nói như vậy.

5505
05:16:51,931 --> 05:16:55,261
Lưu ý rằng c1, c2 và\nc3 rõ ràng là ký tự

5506
05:16:55,260 --> 05:16:58,680
nhưng printf có thể chấp nhận\nin chúng dưới dạng số nguyên.

5507
05:16:58,681 --> 05:17:03,131
Nếu tôi thực sự muốn nó mang tính mô phạm,\n

5508
05:17:03,131 --> 05:17:05,581
được gọi là typecasting,\nnơi mà tôi thực sự có thể

5509
05:17:05,580 --> 05:17:10,870
chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác,\n

5510
05:17:10,870 --> 05:17:14,161
Và chúng ta đã thấy trong tuần 0,\nchars hoặc ký tự

5511
05:17:14,161 --> 05:17:17,760
chỉ là những con số như 72, 73 và 33.

5512
05:17:17,760 --> 05:17:21,940
Vì vậy tôi có thể sử dụng dấu ngoặc đơn này\n

5513
05:17:21,940 --> 05:17:26,883
[CƯỜI] thay vào đó, ba ký tự thành\nba số nguyên.

5514
05:17:26,883 --> 05:17:28,800
Vậy đó chính là ý của tôi\nđể gõ vào lần đầu tiên.

5515
05:17:30,061 --> 05:17:33,541
Vì vậy, dấu ngoặc đơn, int,\nđóng dấu ngoặc đơn nói

5516
05:17:33,541 --> 05:17:39,101
lấy bất kỳ biến nào xuất hiện sau đó,\n

5517
05:17:39,100 --> 05:17:42,900
Hiệu ứng sẽ không có gì khác biệt,\n

5518
05:17:42,901 --> 05:17:49,171
thì việc chạy ./hi vẫn hoạt động như vậy,\n

5519
05:17:49,920 --> 05:17:53,520
Và chúng ta có thể làm điều này cả ngày,\nchar thành int, float thành int

5520
05:17:54,510 --> 05:17:56,148
Đôi khi, nó tương đương.

5521
05:17:56,149 --> 05:17:58,066
Những lần khác, bạn sẽ\nmất thông tin.

5522
05:17:58,065 --> 05:18:01,530
Đưa float tới\nint, chỉ bằng trực giác

5523
05:18:01,530 --> 05:18:04,050
sẽ vứt bỏ mọi thứ\nsau dấu thập phân

5524
05:18:04,050 --> 05:18:06,940
vì int không có dấu thập phân.

5525
05:18:06,940 --> 05:18:09,360
Nhưng bây giờ, tôi sẽ\ntua lại phiên bản này

5526
05:18:09,361 --> 05:18:13,411
điều đó vừa thực hiện chuyển đổi kiểu ẩn\nhoặc truyền ẩn

5527
05:18:13,411 --> 05:18:17,611
chỉ để chứng minh rằng chúng tôi thực sự có thể,\n

5528
05:18:18,210 --> 05:18:20,630
Hãy để tôi tiếp tục và thực hiện\nviệc này ngay bây giờ, theo cách thứ nhất trong tuần.

5529
05:18:21,631 --> 05:18:24,466
Chúng ta hãy thực hiện printf, quote-unquote--

5530
05:18:24,466 --> 05:18:28,890
Thực ra, chúng ta hãy làm điều này, chuỗi\ns bằng quote-unquote xin chào

5531
05:18:28,890 --> 05:18:33,940
và sau đó hãy thực hiện một bản in đơn giản\n

5532
05:18:33,940 --> 05:18:36,780
Vì vậy, bây giờ tôi quay lại\ntuần trước, nơi chúng ta bắt đầu câu chuyện này

5533
05:18:36,780 --> 05:18:40,920
nhưng bạn sẽ nhận thấy rằng, nếu chúng ta\ntiếp tục chơi đùa với điều này--

5534
05:18:43,120 --> 05:18:47,730
Ồ, và để tôi giới thiệu thư viện C50\n

5535
05:18:47,730 --> 05:18:50,521
Hãy để tôi tiếp tục và\nbiên dịch lại, chạy lại cái này

5536
05:18:50,521 --> 05:18:52,529
ở đây chúng tôi dường như đang viết mã theo vòng tròn.

5537
05:18:52,528 --> 05:18:55,070
Giống như, tôi vừa làm điều tương tự theo nhiều cách khác nhau.

5538
05:18:55,070 --> 05:18:57,661
Nhưng rõ ràng có sự tương đương\nan

5539
05:18:57,661 --> 05:19:01,239
giữa các chuỗi ký tự và chuỗi.

5540
05:19:01,239 --> 05:19:03,031
Và nếu bạn làm điều đó theo\nmột cách có tính mô phạm thực sự, bạn

5541
05:19:03,030 --> 05:19:07,650
có ba biến khác nhau, c1, c2,\n

5542
05:19:07,651 --> 05:19:12,131
hoặc bạn có thể xử lý tất cả chúng cùng nhau\n

5543
05:19:12,131 --> 05:19:16,291
Nhưng hóa ra\nstrings thực sự là

5544
05:19:16,291 --> 05:19:22,320
được máy tính thực hiện\ntheo một cách khá quen thuộc.

5545
05:19:22,320 --> 05:19:28,643
Chuỗi thực sự có thể là gì ở điểm này trong câu chuyện?

5546
05:19:28,643 --> 05:19:29,850
Chúng ta sẽ đi đâu với điều này?

5547
05:19:29,850 --> 05:19:31,183
Hãy để tôi cố gắng nhìn xa hơn về phía sau.

5548
05:19:32,611 --> 05:19:34,861
ĐỐI TƯỢNG: Một chuỗi như\nđây có thể là một mảng ký tự không?

5549
05:19:34,861 --> 05:19:37,671
DAVID Malan: Vâng, một chuỗi\ncó thể, và thực sự là, chỉ

5550
05:19:39,061 --> 05:19:41,451
Vì vậy, tuần trước chúng tôi đã thừa nhận rằng các chuỗi tồn tại.

5551
05:19:41,451 --> 05:19:43,791
Về mặt kỹ thuật, các chuỗi tồn tại,\nnhưng chúng được triển khai

5552
05:19:43,791 --> 05:19:47,331
dưới dạng mảng ký tự\nmà thực sự mở ra

5553
05:19:47,330 --> 05:19:50,030
một số khả năng thú vị cho chúng tôi.

5554
05:19:50,030 --> 05:19:52,560
Bởi vì, để tôi xem,\nxem tôi có làm được việc này không.

5555
05:19:52,561 --> 05:19:55,820
Hãy để tôi thử in ra\nbây giờ, lại ba số nguyên.

5556
05:19:55,820 --> 05:20:01,791
Nhưng nếu chuỗi s chỉ là một mảng, như bạn\n

5557
05:20:01,791 --> 05:20:04,021
khung s 1 và khung s 2.

5558
05:20:04,021 --> 05:20:07,911
Vậy có lẽ tôi có thể bắt đầu chọc\nquanh bên trong các chuỗi

5559
05:20:07,911 --> 05:20:09,890
mặc dù chúng tôi đã không làm điều này vào tuần trước, vì vậy tôi

5560
05:20:09,890 --> 05:20:11,521
có thể đạt được những giá trị riêng lẻ đó.

5561
05:20:11,521 --> 05:20:15,530
Vì vậy, hãy chào, ./hi và,\n thì đấy, chúng ta lại bắt đầu.

5562
05:20:15,530 --> 05:20:20,468
Nó giống 72, 73, 33, nhưng\nbây giờ, tôi hy vọng là vậy

5563
05:20:20,469 --> 05:20:22,761
như, bao bọc tâm trí tôi\nsự thật rằng, được rồi

5564
05:20:22,760 --> 05:20:25,911
một chuỗi chỉ là một mảng gồm\nký tự và mảng, bạn

5565
05:20:25,911 --> 05:20:29,221
có thể lập chỉ mục cho chúng bằng cách sử dụng ký hiệu dấu ngoặc vuông\nmới này.

5566
05:20:29,221 --> 05:20:32,301
Vì vậy, tôi có thể nhận được bất kỳ một trong những ký tự riêng lẻ này

5567
05:20:32,300 --> 05:20:38,315
và, chết tiệt, hãy chuyển đổi nó thành số nguyên\nnhư chúng ta đã làm ở tuần 0.

5568
05:20:38,315 --> 05:20:41,271
Bây giờ hãy để tôi tò mò một chút.

5569
05:20:41,271 --> 05:20:44,280
Còn gì nữa có thể có trong\nbộ nhớ của máy tính?

5570
05:20:44,280 --> 05:20:47,810
Thôi, hãy-- tôi sẽ quay lại phần\n

5571
05:20:47,811 --> 05:20:50,121
Đây có thể là cách chúng tôi\nthực hiện ban đầu xin chào

5572
05:20:50,120 --> 05:20:53,060
với 3 biến c1, c2, c3.

5573
05:20:53,061 --> 05:20:55,761
Tất nhiên, ánh xạ tới những\nchữ số thập phân này hoặc tương đương

5574
05:20:57,140 --> 05:20:59,570
Nhưng trong ký ức\nđiều này trông như thế nào?

5575
05:20:59,570 --> 05:21:02,510
Theo nghĩa đen, khi bạn tạo một\nstring trong bộ nhớ, như thế này

5576
05:21:02,510 --> 05:21:05,501
chuỗi s bằng quote-unquote xin chào,\nhãy xem chuyện gì đang xảy ra

5577
05:21:05,501 --> 05:21:06,876
bên dưới mui xe, có thể nói như vậy.

5578
05:21:06,876 --> 05:21:11,751
Vâng, như một sự trừu tượng, một chuỗi,\n

5579
05:21:11,751 --> 05:21:13,177
có vẻ như là 3 byte phải không?

5580
05:21:13,177 --> 05:21:15,260
Tôi đã loại bỏ\ncác thanh ở đó, bởi vì nếu bạn

5581
05:21:15,260 --> 05:21:19,911
hãy nghĩ về một chuỗi như một kiểu, tôi chỉ\n

5582
05:21:19,911 --> 05:21:24,471
Nhưng về mặt kỹ thuật, một chuỗi mà chúng tôi\nvừa tiết lộ là một mảng

5583
05:21:26,091 --> 05:21:28,010
Vì vậy, về mặt kỹ thuật, nếu chuỗi\n được gọi là s

5584
05:21:28,010 --> 05:21:30,230
dấu ngoặc s 0 sẽ cung cấp\ncho bạn ký tự đầu tiên

5585
05:21:30,230 --> 05:21:34,070
dấu ngoặc s 1, dấu ngoặc thứ hai,\nvà dấu ngoặc s 3, dấu ngoặc thứ ba.

5586
05:21:34,070 --> 05:21:37,550
Nhưng bây giờ hãy để tôi hỏi câu hỏi này,\n

5587
05:21:37,550 --> 05:21:40,820
là thứ duy nhất trong\nbộ nhớ máy tính của bạn

5588
05:21:40,820 --> 05:21:45,050
và khả năng, giống như một bức tranh vẽ\n

5589
05:21:45,050 --> 05:21:46,881
hoặc bất cứ thứ gì trên đó, nhưng\nlà thế này, như thế này

5590
05:21:46,881 --> 05:21:50,031
cuối cùng là những gì máy Mac, PC và\nđiện thoại của bạn giảm xuống.

5591
05:21:50,030 --> 05:21:53,990
Giả sử tôi đang chạy một đoạn\n

5592
05:21:53,991 --> 05:21:57,261
và bây giờ tôi viết\ntạm biệt dấu chấm than.

5593
05:21:57,260 --> 05:21:59,120
Chà, điều đó có thể đi đâu trong ký ức?

5594
05:22:00,105 --> 05:22:03,594
TẠM BIỆT. Và điều tiếp theo tôi gõ\n

5595
05:22:03,594 --> 05:22:05,511
Trí nhớ của tôi có thể bị lấp đầy theo thời gian

5596
05:22:05,510 --> 05:22:08,570
với những thứ mà bạn hoặc\nngười khác đang gõ.

5597
05:22:08,570 --> 05:22:14,841
Nhưng sau đó làm sao máy tính biết được,\n

5598
05:22:14,841 --> 05:22:20,411
ở ngay sau dấu chấm than H-I\n

5599
05:22:23,690 --> 05:22:27,330
Tất cả những gì chúng ta có là byte, hoặc 0 và 1.

5600
05:22:27,330 --> 05:22:29,990
Vậy nếu bạn đang thiết kế\ncái này, bạn sẽ làm thế nào

5601
05:22:29,991 --> 05:22:32,541
triển khai một số loại\ndấu phân cách giữa hai loại này?

5602
05:22:32,541 --> 05:22:34,521
Hoặc tìm hiểu\nđộ dài của một chuỗi là bao nhiêu?

5603
05:22:36,408 --> 05:22:39,367
DAVID Malan: OK, vậy\ncâu trả lời đúng là sử dụng ký tự nul

5604
05:22:39,367 --> 05:22:41,450
và đối với những người chưa biết, điều đó có nghĩa là gì?

5605
05:22:43,753 --> 05:22:45,710
DAVID Malan: Vâng, vậy\nit là một nhân vật đặc biệt.

5606
05:22:45,710 --> 05:22:47,780
Hãy để tôi mô tả nó như một nhân vật trọng điểm.

5607
05:22:47,780 --> 05:22:49,835
Con người đã quyết định từ lâu\n rằng bạn biết đấy

5608
05:22:49,835 --> 05:22:52,820
điều gì sẽ xảy ra nếu chúng ta muốn phân định\nnơi một chuỗi kết thúc

5609
05:22:52,820 --> 05:22:56,271
và nơi phần tiếp theo bắt đầu,\nchúng ta chỉ cần một số biểu tượng đặc biệt.

5610
05:22:56,271 --> 05:22:59,450
Và ký hiệu họ sẽ sử dụng\nthường được viết là dấu gạch chéo ngược 0.

5611
05:22:59,450 --> 05:23:03,816
Đây chỉ là ký hiệu viết tắt\ncho tám bit 0 theo đúng nghĩa đen.

5612
05:23:06,800 --> 05:23:10,400
Và biệt danh của tám\n0 bit, trong bối cảnh này

5613
05:23:13,190 --> 05:23:16,170
Và chúng ta thực sự có thể thấy điều này như sau.

5614
05:23:16,170 --> 05:23:18,173
Nếu bạn nhìn vào\ncác chữ số thập phân tương ứng

5615
05:23:18,173 --> 05:23:20,841
giống như bạn có thể làm bằng cách tính\ntoán hoặc thực hiện phép chuyển đổi

5616
05:23:20,841 --> 05:23:25,820
giống như chúng tôi đã làm trong mã, bạn sẽ\n

5617
05:23:25,820 --> 05:23:30,861
nhưng sau đó có thêm 1 byte, đại loại như vậy\n

5618
05:23:30,861 --> 05:23:33,381
Và bây giờ tôi vừa viết\nit dưới dạng số thập phân 0.

5619
05:23:33,381 --> 05:23:36,381
Ý nghĩa của việc này là\nrằng máy tính dường như

5620
05:23:36,381 --> 05:23:40,956
sử dụng, không phải 3 byte để lưu trữ\na từ như xin chào, mà là 4 byte.

5621
05:23:40,955 --> 05:23:46,310
Bất kể chiều dài của chuỗi là bao nhiêu,\n

5622
05:23:46,311 --> 05:23:48,901
đó phân định sự kết thúc của chuỗi.

5623
05:23:48,901 --> 05:23:50,941
Vì vậy thay vào đó chúng ta có thể vẽ nó như thế này.

5624
05:23:50,940 --> 05:23:55,610
Và ký tự này,\nđược phát âm là nul hoặc được viết là N-U-L.

5625
05:23:56,580 --> 05:23:59,330
Nếu con người, vào cuối ngày,\n

5626
05:23:59,330 --> 05:24:01,163
họ chỉ cần\nquyết định, được rồi, à

5627
05:24:01,163 --> 05:24:04,251
làm cách nào để phân biệt\n chuỗi này với chuỗi khác?

5628
05:24:04,251 --> 05:24:06,920
Việc này dễ dàng hơn nhiều với\nchar, riêng lẻ, nó

5629
05:24:06,920 --> 05:24:09,710
dễ dàng hơn nhiều với int, thậm chí còn dễ dàng hơn với float, tại sao?

5630
05:24:09,710 --> 05:24:13,880
Bởi vì, theo biểu đồ trước đó,\n

5631
05:24:13,881 --> 05:24:16,070
Mỗi int luôn là 4 byte.

5632
05:24:16,070 --> 05:24:19,010
Mỗi chiều dài luôn là 8 byte.

5633
05:24:20,540 --> 05:24:24,021
Vâng, xin chào là 1, 2, 3 với\nan dấu chấm than.

5634
05:24:24,021 --> 05:24:27,290
Tạm biệt là 1, 2, 3, 4 với\nan dấu chấm than.

5635
05:24:27,290 --> 05:24:30,710
David là D-A-V-I-D, năm\nkhông có dấu chấm than.

5636
05:24:30,710 --> 05:24:34,470
Và do đó, một chuỗi có thể dài\n bất kỳ số byte nào

5637
05:24:34,471 --> 05:24:36,961
vì vậy bằng cách nào đó bạn cần\nvẽ một đường trên cát

5638
05:24:36,960 --> 05:24:40,967
để tách chuỗi trong bộ nhớ\none khỏi chuỗi khác.

5639
05:24:40,967 --> 05:24:43,672
Vậy ý nghĩa của việc này là gì?

5640
05:24:43,672 --> 05:24:45,130
Vâng, hãy để tôi quay lại mã ở đây.

5641
05:24:46,471 --> 05:24:51,390
Việc này hơi nguy hiểm nhưng tôi sẽ đi\n

5642
05:24:53,471 --> 05:24:57,511
Vậy hãy để tôi tiếp tục và\nbiên dịch lại, chào bạn.

5643
05:25:02,881 --> 05:25:06,811
Bây giờ hãy để tôi tiếp tục và\nchạy lại chào, ./hi, Enter.

5644
05:25:07,841 --> 05:25:10,921
Vì vậy, bạn thực sự có thể nhìn thấy trong\nmáy tính mà bạn không hề biết

5645
05:25:10,920 --> 05:25:14,090
trước đó, thực sự có\nđiều gì đó khác đang diễn ra ở đó.

5646
05:25:14,091 --> 05:25:17,140
Và nếu tôi tạo một\nbiến thể khác của chương trình này--

5647
05:25:17,140 --> 05:25:19,890
hãy bỏ đi\n từ này và hãy có hai từ.

5648
05:25:19,890 --> 05:25:21,810
Vì vậy, hãy để tôi đưa cho mình\nanmột chuỗi khác gọi là t

5649
05:25:21,811 --> 05:25:26,070
ví dụ, chỉ phổ biến thế này\n

5650
05:25:26,070 --> 05:25:29,161
Để tôi rồi in ra với %s.

5651
05:25:29,161 --> 05:25:35,045
Và để tôi in ra với %s,\n

5652
05:25:35,045 --> 05:25:38,580
Hãy để tôi biên dịch lại chương trình này,\nvà rõ ràng là--

5653
05:25:38,580 --> 05:25:41,730
ugh-- đây là điều xảy ra\nkhi tôi đi quá nhanh.

5654
05:25:41,730 --> 05:25:45,001
Được rồi, lỗi thứ ba\nhôm nay, hãy đóng trích dẫn.

5655
05:25:52,471 --> 05:25:54,871
Bây giờ chúng ta có một chương trình\nin cả chào và tạm biệt

5656
05:25:54,870 --> 05:25:58,980
chỉ để chúng ta có thể xem xét những gì\n

5657
05:25:58,980 --> 05:26:04,471
Nếu s đang lưu trữ hi và\rõ ràng là một byte thưởng thì

5658
05:26:04,471 --> 05:26:07,501
phân định phần cuối của\nchuỗi đó, tạm biệt

5659
05:26:07,501 --> 05:26:10,673
sẽ phù hợp với\nvị trí ngay sau đó.

5660
05:26:10,673 --> 05:26:13,591
Và nó đang quấn quanh, nhưng đó\n

5661
05:26:13,591 --> 05:26:16,260
Nhưng tạm biệt, dấu chấm than B-Y-E đang chiếm chỗ\n

5662
05:26:16,260 --> 05:26:23,208
1, 2, 3, 4, cộng thêm byte thứ năm.

5663
05:26:23,208 --> 05:26:27,841
Được rồi, mọi câu hỏi về vấn đề này\n

5664
05:26:27,841 --> 05:26:29,820
Và chúng tôi sẽ bối cảnh hóa\nđiều này sớm thôi

5665
05:26:29,820 --> 05:26:32,100
để điều này không chỉ\nnhư, được rồi, ai thực sự quan tâm chứ?

5666
05:26:32,100 --> 05:26:34,990
Đây sẽ là nguồn\ncủa việc thực sự triển khai mọi thứ.

5667
05:26:34,991 --> 05:26:37,771
Thực tế đối với tập vấn đề 2, như\nmật mã và mã hóa

5668
05:26:37,771 --> 05:26:39,728
và xáo trộn những thông điệp thực tế của con người.

5669
05:26:40,771 --> 05:26:44,911
ĐỐI TƯỢNG: Thông thường nếu\nbạn không sử dụng chuỗi

5670
05:26:44,911 --> 05:26:47,741
bạn chỉ cần tạo một ký tự\nphạm vi để khai báo

5671
05:26:47,741 --> 05:26:50,841
có bao nhiêu ký tự vậy\n

5672
05:26:51,591 --> 05:26:53,741
DAVID Malan: Một câu hỏi hay\ncũng vậy và hãy để

5673
05:26:53,741 --> 05:26:56,376
tôi tóm tắt lại như sau, nếu thay vào đó chúng ta luôn sử dụng ký tự

5674
05:26:56,376 --> 05:26:59,501
chúng ta thực sự phải biết trước\n

5675
05:26:59,501 --> 05:27:03,010
chuỗi mà bạn đang lưu trữ thì làm thế nào,\n

5676
05:27:03,010 --> 05:27:05,260
bởi vì khi bạn CS50 viết\nhàm get string

5677
05:27:05,260 --> 05:27:07,450
rõ ràng là chúng tôi không biết\ncác từ đó dài bao nhiêu

5678
05:27:07,451 --> 05:27:09,281
sẽ là tất cả các bạn đang gõ vào.

5679
05:27:09,280 --> 05:27:12,820
Hóa ra là hai tuần nữa\nchúng ta sẽ thấy chuỗi get đó

5680
05:27:12,820 --> 05:27:15,580
sử dụng một kỹ thuật được gọi là\nphân bổ bộ nhớ động.

5681
05:27:15,580 --> 05:27:20,030
Và nó sẽ lớn lên hoặc co lại\n

5682
05:27:22,181 --> 05:27:25,710
ĐỐI TƯỢNG: Tại sao chúng tôi sử dụng giá trị nul?

5683
05:27:26,986 --> 05:27:28,111
DAVID Malan: Câu hỏi hay.

5684
05:27:28,111 --> 05:27:31,140
Tại sao chúng ta sử dụng giá trị nul,\không phải là lãng phí một byte sao?

5685
05:27:31,890 --> 05:27:37,471
Nhưng tôi khẳng định thực sự không còn cách nào khác\n

5686
05:27:37,471 --> 05:27:44,009
từ đầu một cái khác, trừ khi chúng ta\n

5687
05:27:44,008 --> 05:27:46,800
Cuối cùng, tất cả những gì chúng ta có,\n

5688
05:27:46,800 --> 05:27:50,161
Do đó, tất cả những gì chúng ta có thể làm là quay\nnhững bit đó theo một cách sáng tạo nào đó

5689
05:27:51,780 --> 05:27:54,970
Vì vậy, chúng tôi sẽ dành ít nhất\n1 byte để giải quyết vấn đề này.

5690
05:27:55,471 --> 05:28:00,158
ĐỐI TƯỢNG: Thiết bị bộ nhớ của chúng tôi hoạt động như thế nào\n

5691
05:28:00,157 --> 05:28:03,530
/n nếu chúng ta không có\nit được lưu trữ dưới dạng char?

5692
05:28:05,170 --> 05:28:08,950
làm sao máy tính biết di chuyển\n

5693
05:28:08,951 --> 05:28:12,251
Vì vậy /n, mặc dù\nnó trông giống như hai ký tự

5694
05:28:12,251 --> 05:28:16,151
nó thực sự được lưu trữ dưới dạng 1\nbyte trong bộ nhớ của máy tính.

5695
05:28:16,151 --> 05:28:18,618
Có một ánh xạ giữa\nit và một số thực.

5696
05:28:18,617 --> 05:28:21,700
Và bạn có thể thấy điều đó, chẳng hạn,\n

5697
05:28:21,701 --> 05:28:25,485
ĐỐI TƯỢNG: Vì vậy, việc\nđược lưu trữ sẽ là [KHÔNG NGHE ĐƯỢC]..

5698
05:28:26,681 --> 05:28:32,471
Nếu tôi đặt /n vào mã của mình ở đây,\n

5699
05:28:32,471 --> 05:28:36,101
và ở đây, điều đó thực sự sẽ thay đổi\n

5700
05:28:36,100 --> 05:28:41,001
cần nhường chỗ cho /n\nhere và một cái khác ở đây.

5701
05:28:41,001 --> 05:28:43,173
Vì vậy, chính xác sẽ cần thêm hai\nbyte nữa.

5702
05:28:43,841 --> 05:28:50,311
KHÁN GIẢ: Vậy nếu xin chào câu cảm thán\n

5703
05:28:50,311 --> 05:28:56,891
cũng như 72, 73, 33, nếu chúng ta muốn\n

5704
05:28:56,890 --> 05:29:03,350
và chuyển chúng sang dạng nhị phân như thế nào\n

5705
05:29:04,651 --> 05:29:06,651
DAVID Malan: Và điều cuối cùng anh nói là gì?

5706
05:29:08,066 --> 05:29:09,960
DAVID Malan: Nó nhạy cảm với bối cảnh.

5707
05:29:09,960 --> 05:29:12,710
Vì vậy, nếu vào cuối ngày, tất cả\n

5708
05:29:12,710 --> 05:29:16,640
như 72, 73, 33, nhớ\ntuỳ theo chương trình

5709
05:29:16,640 --> 05:29:19,730
quyết định, dựa trên ngữ cảnh,\ncách diễn giải chúng.

5710
05:29:19,730 --> 05:29:23,570
Và tôi đã đơn giản hóa câu chuyện này vào tuần 0\n

5711
05:29:23,570 --> 05:29:27,170
dưới dạng màu RGB và iMessage\cũng như chương trình nhắn tin văn bản

5712
05:29:27,170 --> 05:29:31,700
diễn giải chúng dưới dạng các chữ cái và\n

5713
05:29:31,701 --> 05:29:36,800
Nhân tiện, những chương trình đó thực hiện điều đó như thế nào\n

5714
05:29:37,341 --> 05:29:39,133
Và trên thực tế, sau\nhọc kỳ này, chúng ta sẽ thấy

5715
05:29:39,133 --> 05:29:43,761
một kiểu dữ liệu mà bạn có thể biểu diễn qua đó\n

5716
05:29:43,760 --> 05:29:46,501
và giá trị màu đỏ, giá trị\nmàu xanh lá cây và giá trị màu xanh lam.

5717
05:29:46,501 --> 05:29:48,861
Vì vậy, chúng ta cũng sẽ thấy các loại dữ liệu khác.

5718
05:29:49,361 --> 05:29:53,581
ĐỐI TƯỢNG: Có vẻ đủ dễ dàng để\n

5719
05:29:53,580 --> 05:29:56,450
vậy tại sao chúng ta có số nguyên\n và số nguyên dài?

5720
05:29:56,451 --> 05:29:59,453
Tại sao chúng ta không thể biến mọi thứ\ncó thể thay đổi kích thước dữ liệu của nó?

5721
05:29:59,453 --> 05:30:01,161
DAVID Malan: Câu hỏi thực sự thú vị.

5722
05:30:01,161 --> 05:30:04,370
Tại sao chúng ta không thể làm cho tất cả các loại dữ liệu có kích thước thay đổi?

5723
05:30:04,370 --> 05:30:07,820
Và một số ngôn ngữ, một số\nthư viện thực hiện chính xác điều này.

5724
05:30:07,820 --> 05:30:11,361
C là ngôn ngữ cũ hơn và\nvì bộ nhớ đắt tiền

5725
05:30:12,561 --> 05:30:14,901
Thực tế là bạn\ngđược hưởng lợi chỉ từ

5726
05:30:14,901 --> 05:30:17,271
tiêu chuẩn hóa kích thước của những thứ này.

5727
05:30:17,271 --> 05:30:19,671
Bạn cũng nhận được hiệu suất\tăng theo nghĩa nào đó

5728
05:30:19,670 --> 05:30:23,880
rằng nếu bạn biết mỗi int là\n4 byte, bạn có thể nhanh chóng

5729
05:30:23,881 --> 05:30:26,480
và chúng ta sẽ thấy điều này vào tuần tới,\nchuyển từ số nguyên này sang số nguyên khác

5730
05:30:26,480 --> 05:30:30,861
vào bộ nhớ khác chỉ bằng cách thêm\n

5731
05:30:30,861 --> 05:30:32,691
Bạn có thể chọc ngoáy xung quanh rất nhanh chóng.

5732
05:30:32,690 --> 05:30:35,782
Trong khi đó, nếu bạn có số\nđộ dài thay đổi, bạn sẽ phải

5733
05:30:35,782 --> 05:30:38,240
kiểu như, theo dõi, theo dõi, theo dõi,\ntìm kiếm sự kết thúc của nó.

5734
05:30:38,241 --> 05:30:41,041
Theo dõi, theo dõi-- bạn sẽ phải\n

5735
05:30:41,041 --> 05:30:42,583
Vì vậy, đó là chủ đề chúng ta sẽ quay lại.

5736
05:30:42,582 --> 05:30:44,960
Nhưng nhìn chung nó là vì hiệu quả.

5737
05:30:46,431 --> 05:30:52,203
ĐỐI TƯỢNG: Tại sao không lưu trữ ký tự\nnul [KHÔNG NGHE ĐƯỢC]

5738
05:30:52,203 --> 05:30:55,781
DAVID Malan: Câu hỏi hay\ntại sao không lưu trữ--

5739
05:30:55,780 --> 05:30:59,800
tại sao không lưu ký tự nul\nở đầu?

5740
05:30:59,800 --> 05:31:06,150
Bạn có thể-- hãy xem, tại sao\nkhông lưu trữ nó ngay từ đầu?

5741
05:31:09,341 --> 05:31:12,585
Bạn hoàn toàn có thể--\nà, bạn có thể làm điều này không?

5742
05:31:15,841 --> 05:31:20,640
Nếu bạn định làm điều đó\na ngay từ đầu--

5743
05:31:22,681 --> 05:31:24,888
Không, bởi vì cuối cùng tôi đã nghĩ ra vấn đề với việc này.

5744
05:31:24,888 --> 05:31:26,743
Thay vào đó, nếu bạn lưu trữ nó ở\nđầu

5745
05:31:26,743 --> 05:31:29,161
lát nữa chúng ta sẽ xem\nbạn thực sự có thể viết mã như thế nào

5746
05:31:29,161 --> 05:31:31,411
để tìm ra\nkết thúc của một chuỗi ở đâu

5747
05:31:31,411 --> 05:31:33,811
và vấn đề ở đó\nis không nhất thiết

5748
05:31:33,811 --> 05:31:37,261
biết liệu cuối cùng bạn có đạt được\n0 ở cuối chuỗi không

5749
05:31:37,260 --> 05:31:41,070
vì đó là số 0 trong\n

5750
05:31:41,070 --> 05:31:44,440
hoặc nếu đó hoàn toàn là ngữ cảnh của một số loại dữ liệu khác.

5751
05:31:44,440 --> 05:31:46,860
Vì vậy thực tế là chúng ta đã chuẩn hóa--

5752
05:31:46,861 --> 05:31:50,820
thực tế là chúng tôi đã tiêu chuẩn hóa\nchuỗi kết thúc bằng nul

5753
05:31:50,820 --> 05:31:54,916
có nghĩa là chúng ta có thể phân biệt một cách đáng tin cậy\n

5754
05:31:54,916 --> 05:31:56,820
Và đó thực sự là một\ncách phân biệt hoàn hảo, bây giờ

5755
05:31:56,820 --> 05:31:59,954
thực sự sử dụng\nđiều này để xây dựng

5756
05:31:59,954 --> 05:32:02,621
mã riêng của chúng tôi thao tác\nnhững thứ ở cấp độ thấp hơn.

5757
05:32:03,820 --> 05:32:05,911
Hãy để tôi tạo một tập tin mới có tên là length.

5758
05:32:05,911 --> 05:32:10,260
Và hãy sử dụng ý tưởng cơ bản này để\n

5759
05:32:10,260 --> 05:32:14,980
là sau khi nó được lưu trữ trong một biến.

5760
05:32:16,120 --> 05:32:20,790
Hãy để tôi bao gồm cả tiêu đề CS50\nheader và tiêu đề I/O tiêu chuẩn

5761
05:32:20,791 --> 05:32:25,511
tự cho mình int main(void) lần nữa\n

5762
05:32:25,510 --> 05:32:28,320
Hãy để tôi nhắc người dùng về\na string s và tôi sẽ hỏi họ

5763
05:32:28,320 --> 05:32:32,431
cho một chuỗi giống như tên của họ ở đây.

5764
05:32:32,431 --> 05:32:37,681
Và lần này hãy để tôi đặt tên cho nó\nrõ ràng hơn.

5765
05:32:37,681 --> 05:32:39,431
Bây giờ hãy để tôi tiếp tục và làm điều này.

5766
05:32:39,431 --> 05:32:44,521
Hãy để tôi lặp lại mọi\nký tự trong chuỗi này

5767
05:32:44,521 --> 05:32:46,440
để tìm ra\nđộ dài của nó là bao nhiêu.

5768
05:32:46,440 --> 05:32:49,320
Vì vậy, ban đầu, tôi sẽ\ntiếp tục và nói điều này

5769
05:32:49,320 --> 05:32:52,300
độ dài int bằng 0, vì\ntôi chưa biết nó là gì.

5770
05:32:52,300 --> 05:32:53,550
Vì vậy chúng ta sẽ bắt đầu từ 0.

5771
05:32:53,550 --> 05:32:56,670
Và sau đó mặc dù điều sau đây là đúng--

5772
05:32:56,670 --> 05:33:01,630
trong khi-- để tôi-- tôi có muốn làm điều này không?

5773
05:33:01,631 --> 05:33:04,320
Hãy để tôi đổi cái này thành i,\nđể cho rõ ràng, hãy để tôi làm

5774
05:33:04,320 --> 05:33:10,050
cái này, trong khi khung tên tôi thì không\n

5775
05:33:10,050 --> 05:33:13,440
Vì vậy tôi gõ nó trên slide là N-U-L,\n

5776
05:33:13,440 --> 05:33:17,925
thực ra bạn sử dụng số tương đương của nó,\n

5777
05:33:17,925 --> 05:33:23,190
Trong khi khung tên i không bằng\n

5778
05:33:23,190 --> 05:33:26,730
và tăng i lên i cộng cộng.

5779
05:33:26,730 --> 05:33:29,730
Và sau đó xuống đây tôi sẽ\nin ra giá trị của i

5780
05:33:29,730 --> 05:33:33,530
để xem chúng tôi thực sự nhận được gì,\nin ra giá trị của i.

5781
05:33:33,530 --> 05:33:35,280
Được rồi, vậy điều gì\nsẽ xảy ra ở đây?

5782
05:33:39,001 --> 05:33:43,831
./length và để tôi gõ gì đó vào\n

5783
05:33:45,001 --> 05:33:48,210
Để tôi thử tạm biệt,\dấu chấm than, Enter.

5784
05:33:50,131 --> 05:33:52,771
Hãy để tôi thử tên riêng của mình, David, Enter.

5785
05:33:54,230 --> 05:33:56,140
Vậy thực sự chuyện gì đang xảy ra ở đây?

5786
05:33:56,140 --> 05:33:58,751
Chà, có vẻ như\ntheo vòng lặp thứ 4 này

5787
05:33:58,751 --> 05:34:00,883
chúng tôi đang chỉ định một biến\ncục bộ được gọi là

5788
05:34:00,883 --> 05:34:03,841
tôi khởi tạo bằng 0, bởi vì chúng ta\n

5789
05:34:04,841 --> 05:34:08,311
Sau đó tôi sẽ hỏi\ncâu hỏi, vị trí 0 có phải không

5790
05:34:08,311 --> 05:34:13,561
đó là tôi trong chuỗi tên,\nmà bây giờ chúng ta biết là một mảng

5791
05:34:15,960 --> 05:34:19,905
Bởi vì nếu không, điều đó có nghĩa là\n

5792
05:34:21,901 --> 05:34:25,171
Sau đó, hãy quay lại dòng\n

5793
05:34:26,850 --> 05:34:30,681
Vậy khung tên 1 không bằng/0?

5794
05:34:30,681 --> 05:34:36,331
Chà, nếu không, và nó sẽ không\nnếu nó là i, hoặc y, hoặc a

5795
05:34:36,330 --> 05:34:39,750
dựa trên những gì tôi đã nhập, chúng tôi sẽ tăng i một lần nữa.

5796
05:34:39,751 --> 05:34:43,201
Tua nhanh đến phần cuối của câu chuyện,\n

5797
05:34:43,201 --> 05:34:46,681
về mặt kỹ thuật, một khoảng trắng\nquá cuối chuỗi

5798
05:34:46,681 --> 05:34:49,771
khung tên i sẽ bằng /0.

5799
05:34:49,771 --> 05:34:54,221
Thế là tôi không tăng i nữa, tôi\n

5800
05:34:54,221 --> 05:34:58,771
Vì vậy, những gì chúng tôi có ở đây với một số\n

5801
05:34:58,771 --> 05:35:03,331
là một chương trình tính ra độ dài\n

5802
05:35:03,330 --> 05:35:06,120
Hãy thực hành sự trừu tượng\nvà phân tích nó thành

5803
05:35:06,120 --> 05:35:07,530
có lẽ, một chức năng trợ giúp ở đây.

5804
05:35:07,530 --> 05:35:11,370
Hãy để tôi lấy tất cả\ncode này ở đây và giả sử

5805
05:35:11,370 --> 05:35:15,841
để thảo luận một lát,\n

5806
05:35:18,001 --> 05:35:21,091
Và độ dài của tên chuỗi\nis mà tôi muốn lấy

5807
05:35:21,091 --> 05:35:25,260
và sau đó tôi sẽ tiếp tục in\nout, giống như trước đây với %i

5808
05:35:26,658 --> 05:35:28,951
Vì vậy bây giờ tôi đang loại bỏ\nkhái niệm tìm hiểu này

5809
05:35:29,992 --> 05:35:32,730
Đó là cơ hội để\ntôi tạo ra chức năng của riêng mình.

5810
05:35:32,730 --> 05:35:35,775
Nếu tôi muốn tạo một\nhàm có tên là độ dài chuỗi

5811
05:35:35,776 --> 05:35:39,871
Tôi sẽ khẳng định rằng tôi muốn\nlấy một chuỗi làm đầu vào

5812
05:35:39,870 --> 05:35:45,120
và tôi nên trả về kiểu trả về\ncủa hàm này như thế nào?

5813
05:35:45,120 --> 05:35:50,350
Điều gì sẽ nhận được chuỗi\ncó lẽ sẽ trả về?

5814
05:35:53,280 --> 05:35:55,198
Float thực sự sẽ không có ý nghĩa gì vì chúng ta

5815
05:35:55,198 --> 05:35:57,637
đo lường những thứ là số nguyên.

5816
05:35:57,637 --> 05:35:59,220
Trong trường hợp này, độ dài của một cái gì đó.

5817
05:35:59,221 --> 05:36:00,901
Vì vậy, thực sự, hãy để nó trả về một int.

5818
05:36:00,901 --> 05:36:03,641
Tôi có thể sử dụng cùng\ncode như trước đây, vì vậy tôi

5819
05:36:03,640 --> 05:36:06,435
sẽ dán những gì tôi\nđã cắt trước đó vào tệp.

5820
05:36:06,436 --> 05:36:10,921
Điều duy nhất tôi phải thay đổi\là tên của biến.

5821
05:36:10,920 --> 05:36:14,501
Bởi vì bây giờ hàm này\ntôi đã tùy ý quyết định

5822
05:36:14,501 --> 05:36:17,390
mà tôi sẽ gọi nó\ns, chỉ để cho chung chung hơn.

5823
05:36:17,390 --> 05:36:20,175
Vì vậy tôi sẽ xem xét s\nbracket i ở mỗi vị trí.

5824
05:36:20,175 --> 05:36:23,050
Và tôi không muốn in nó ở\n

5825
05:36:23,050 --> 05:36:25,510
Dòng mã nào tôi nên\n đưa vào đây nếu tôi thực sự

5826
05:36:25,510 --> 05:36:28,265
muốn bàn giao lại tổng chiều dài?

5827
05:36:31,372 --> 05:36:33,530
DAVID Malan: Trả lại i, trong trường hợp này.

5828
05:36:33,530 --> 05:36:35,800
Vì vậy, tôi sẽ trả lại tôi, không in nó.

5829
05:36:35,800 --> 05:36:40,751
Bởi vì bây giờ, chức năng chính của tôi có thể\n

5830
05:36:40,751 --> 05:36:42,791
và in nó trên dòng tiếp theo.

5831
05:36:42,791 --> 05:36:46,781
Tôi chỉ cần một nguyên mẫu, thế là\n

5832
05:36:46,780 --> 05:36:48,431
Tôi sẽ chạy lại đoạn dài.

5833
05:36:48,431 --> 05:36:49,901
Hy vọng là tôi đã không làm hỏng việc.

5834
05:36:49,901 --> 05:36:53,591
Tôi đã không làm vậy. ./length,\nTôi sẽ gõ hi-- oops--

5835
05:36:56,140 --> 05:36:59,230
Tôi sẽ gõ tạm biệt lần nữa, vân vân.

5836
05:36:59,230 --> 05:37:02,963
Vì vậy bây giờ chúng ta có một hàm\n

5837
05:37:02,963 --> 05:37:05,381
Chà, hóa ra chúng ta thực sự không cần thứ này từ lâu.

5838
05:37:05,381 --> 05:37:10,302
Hóa ra là chúng ta có thể loại bỏ\n của tôi

5839
05:37:10,302 --> 05:37:12,760
Tôi chắc chắn có thể xóa\ntoàn bộ quá trình triển khai ở đây.

5840
05:37:12,760 --> 05:37:16,420
Bởi vì hóa ra, trong\na tập tin có tên string.h

5841
05:37:16,420 --> 05:37:19,780
đây là một tệp tiêu đề mới ngày hôm nay, chúng tôi\n

5842
05:37:19,780 --> 05:37:23,950
được gọi ngắn gọn hơn là\nstrlen, S-T-R-L-E-N. Cái nào

5843
05:37:25,390 --> 05:37:29,501
Đây là một hàm đi kèm với C,\n

5844
05:37:29,501 --> 05:37:33,710
và nó thực hiện những gì chúng tôi vừa\thực hiện theo cách thủ công.

5845
05:37:33,710 --> 05:37:37,600
Vì vậy, phải thừa nhận rằng đây là một ví dụ về một\n

5846
05:37:38,741 --> 05:37:41,111
Và những loại chức năng nào tồn tại?

5847
05:37:41,111 --> 05:37:45,521
Vâng, hãy để tôi thoát khỏi\ntrình duyệt của tôi ở đây và tới một trang web

5848
05:37:45,521 --> 05:37:48,716
là hiện thân của CS50\ncái được gọi là trang thủ công.

5849
05:37:48,716 --> 05:37:52,331
Hóa ra là trong rất nhiều hệ thống, máy Mac và Unix

5850
05:37:52,330 --> 05:37:55,360
và hệ thống Linux, bao gồm\nVisual Studio Code

5851
05:37:55,361 --> 05:37:57,280
Ví dụ: chúng tôi có\ntrên đám mây, ở đó

5852
05:37:57,280 --> 05:38:00,550
là các trang thủ công\ncó thể truy cập công khai cho các chức năng.

5853
05:38:00,550 --> 05:38:04,030
Chúng có xu hướng được viết rất\nội dung, theo cách

5854
05:38:05,420 --> 05:38:09,911
Vì vậy, chúng tôi có ở đây tại\nmanual.cs50.io là phiên bản của CS50

5855
05:38:09,911 --> 05:38:13,001
trong số các trang thủ công có chế độ\nkém thoải mái này

5856
05:38:13,001 --> 05:38:15,550
cung cấp cho bạn một, một loại, bảng ghi nhớ\n được sử dụng rất thường xuyên

5857
05:38:15,550 --> 05:38:19,271
các hàm hữu ích trong C. Và\nchúng tôi đã dịch chuyên gia

5858
05:38:19,271 --> 05:38:22,335
ký hiệu cho những điều mà người mới bắt đầu có thể hiểu được.

5859
05:38:22,335 --> 05:38:26,451
Vì vậy, ví dụ, hãy để tôi tiếp tục và\n

5860
05:38:26,451 --> 05:38:30,460
Bạn sẽ thấy có tài liệu\n

5861
05:38:30,460 --> 05:38:32,771
nhưng thú vị hơn\nở dưới đây, có

5862
05:38:32,771 --> 05:38:35,111
cả đống hàm liên quan đến\nchuỗi

5863
05:38:35,111 --> 05:38:36,881
mà chúng tôi thậm chí chưa từng thấy hầu hết.

5864
05:38:36,881 --> 05:38:38,921
Nhưng thực sự có một\nở đây tên là strlen

5865
05:38:38,920 --> 05:38:40,880
tính độ dài của một chuỗi.

5866
05:38:40,881 --> 05:38:46,421
Và vì thế nếu tôi tới strlen ở đây, tôi sẽ\n

5867
05:38:47,230 --> 05:38:49,661
Và cách thức hoạt động của trang\nhướng dẫn sử dụng

5868
05:38:49,661 --> 05:38:52,570
dù ở định dạng CS50\hay bất kỳ định dạng nào khác, hệ thống

5869
05:38:52,570 --> 05:38:55,210
thông thường bạn có thấy bản tóm tắt về tiêu đề nào

5870
05:38:55,210 --> 05:38:57,591
các tập tin bạn cần để sử dụng chức năng.

5871
05:38:57,591 --> 05:39:00,221
Vì vậy bạn hãy sao chép và dán\nnhững dòng này vào đây.

5872
05:39:00,221 --> 05:39:03,791
Bạn xem nguyên mẫu\nis của hàm là gì vậy

5873
05:39:03,791 --> 05:39:06,794
rằng bạn biết đầu vào của nó là gì,\n

5874
05:39:06,794 --> 05:39:09,461
Sau đó, ở bên dưới, bạn có thể thấy\nmô tả, trong trường hợp này

5875
05:39:10,580 --> 05:39:12,430
Hàm này tính\nđộ dài của s.

5876
05:39:12,431 --> 05:39:15,370
Sau đó, bạn sẽ thấy giá trị\nreturn là gì, nếu có

5877
05:39:15,370 --> 05:39:18,570
và thậm chí bạn có thể thấy một ví dụ, chẳng hạn như\n

5878
05:39:18,570 --> 05:39:21,273
Vì vậy, những trang hướng dẫn này\ncó thể truy cập lại được

5879
05:39:21,273 --> 05:39:23,980
ở đây và chúng tôi sẽ liên kết với những thứ này trong\n

5880
05:39:23,980 --> 05:39:26,771
gần như là nơi để\nbắt đầu khi bạn muốn tìm hiểu

5881
05:39:26,771 --> 05:39:29,471
bánh xe đã được phát minh chưa?

5882
05:39:29,471 --> 05:39:32,751
Có chức năng nào có thể giúp ích\n

5883
05:39:32,751 --> 05:39:36,161
để tôi không thực sự phải lao vào làm tất cả mọi việc

5884
05:39:36,161 --> 05:39:37,973
của những bước cấp thấp hơn như tôi đã làm.

5885
05:39:37,973 --> 05:39:40,931
Đôi khi câu trả lời sẽ là\n

5886
05:39:40,931 --> 05:39:43,421
Nhưng một lần nữa mục đích của việc chúng ta vừa làm việc này cùng nhau

5887
05:39:43,420 --> 05:39:46,210
là tiết lộ rằng ngay cả những\nchức năng mà bạn bắt đầu thực hiện

5888
05:39:46,210 --> 05:39:50,396
được cho phép, tất cả chúng đều giảm bớt một số khối xây dựng cơ bản này.

5889
05:39:50,396 --> 05:39:53,861
Vào cuối ngày, đây là\n

5890
05:39:55,210 --> 05:39:57,320
Chúng tôi chỉ đang tìm hiểu\ncách khai thác những thứ đó

5891
05:39:57,320 --> 05:40:01,480
và cách tự mình thao túng chúng.

5892
05:40:08,065 --> 05:40:16,039
KHÁN GIẢ: Chúng tôi vừa thấy\n[KHÔNG NGHE ĐƯỢC] Điều đó có quá phổ biến không

5893
05:40:16,040 --> 05:40:18,296
rằng chúng ta sẽ phải\nchỉ định nó, hay không?

5894
05:40:18,295 --> 05:40:19,420
DAVID Malan: Câu hỏi hay.

5895
05:40:19,420 --> 05:40:22,180
Nó có phổ biến đến mức bạn\nphải chỉ định nó hay không?

5896
05:40:22,181 --> 05:40:24,431
Bạn cần phải bao gồm các tệp\nheader của nó vì đó là

5897
05:40:24,431 --> 05:40:25,931
nơi chứa tất cả những nguyên mẫu đó.

5898
05:40:25,931 --> 05:40:29,451
Bạn không cần phải lo lắng về việc\nliên kết nó với -l bất cứ điều gì.

5899
05:40:29,451 --> 05:40:31,601
Và trên thực tế, khi\ntiến về phía trước, bạn sẽ không bao giờ

5900
05:40:31,600 --> 05:40:35,170
cần phải lo lắng về việc liên kết trong\n

5901
05:40:35,170 --> 05:40:39,200
Chúng tôi, các nhân viên, đã cấu hình để\n

5902
05:40:39,201 --> 05:40:41,291
Chúng tôi muốn bạn hiểu\nrằng nó đang làm điều đó

5903
05:40:41,291 --> 05:40:43,601
nhưng chúng tôi sẽ lo\ntất cả phần -l cho bạn.

5904
05:40:43,600 --> 05:40:47,620
Nhưng trách nhiệm về\nnguyên mẫu và tệp tiêu đề là ở bạn.

5905
05:40:47,620 --> 05:40:51,411
Các câu hỏi khác về những cách trình bày hoặc kỹ thuật này?

5906
05:40:51,911 --> 05:41:00,181
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] dấu chấm than.

5907
05:41:00,181 --> 05:41:04,784
Nó thực sự xác định\nkhoảng trắng [KHÔNG NGHE ĐƯỢC] như thế nào??

5908
05:41:04,784 --> 05:41:06,181
DAVID Malan: Một câu hỏi hay.

5909
05:41:06,181 --> 05:41:09,960
Nếu bạn có một chuỗi có thực\n

5910
05:41:09,960 --> 05:41:11,791
máy tính thực sự sẽ làm gì?

5911
05:41:11,791 --> 05:41:14,221
Vâng cho việc này. hãy để tôi\ngtruy cập asciichart.com.

5912
05:41:14,221 --> 05:41:19,140
Đó chỉ là một trang web ngẫu nhiên\n

5913
05:41:20,190 --> 05:41:22,780
Trên thực tế, đây là những gì chúng tôi có\na ảnh chụp màn hình của ngày hôm trước.

5914
05:41:22,780 --> 05:41:26,348
Và nếu bạn nhìn vào đây, nó hơi nhỏ\n

5915
05:41:26,348 --> 05:41:29,640
Nếu một máy tính lưu trữ một khoảng trống, nó\n

5916
05:41:29,640 --> 05:41:34,690
32, hay về mặt kỹ thuật, mẫu số 0\n

5917
05:41:34,690 --> 05:41:37,501
Tất cả các phím tiếng Anh Mỹ\nbạn có thể gõ trên bàn phím

5918
05:41:37,501 --> 05:41:40,651
có thể được biểu diễn bằng một\nsố và việc sử dụng Unicode có thể

5919
05:41:40,651 --> 05:41:43,181
bạn thể hiện cả những thứ như\nemoji và các ngôn ngữ khác.

5920
05:41:43,681 --> 05:41:47,390
ĐỐI TƯỢNG: Chỉ có các chuỗi\ntheo sau là số nul

5921
05:41:47,390 --> 05:41:50,776
hoặc giả sử chúng ta có một chuỗi\nsố, liệu mỗi số trong đó có

5922
05:41:52,105 --> 05:41:53,230
DAVID Malan: Câu hỏi hay.

5923
05:41:53,230 --> 05:41:56,050
Chỉ có các chuỗi đi kèm\nbằng null ở cuối

5924
05:41:56,050 --> 05:41:59,021
bởi vì mọi loại dữ liệu khác\nchúng ta đã nói đến cho đến nay

5925
05:41:59,021 --> 05:42:01,390
có độ dài hữu hạn được xác định rõ ràng.

5926
05:42:01,390 --> 05:42:04,451
1 byte cho char, 4 byte\n cho int, v.v.

5927
05:42:04,451 --> 05:42:08,501
Nếu chúng ta nghĩ lại tuần trước, chúng ta đã làm như vậy\n

5928
05:42:08,501 --> 05:42:12,341
Tràn số nguyên, vì 4 byte, chết tiệt,\n

5929
05:42:12,341 --> 05:42:14,530
Chúng ta cũng đã nói về\nsự thiếu chính xác của dấu phẩy động.

5930
05:42:14,530 --> 05:42:17,740
Rất may trong thế giới khoa học\n

5931
05:42:17,741 --> 05:42:21,191
có những thư viện bạn có thể\nsử dụng để lấy cảm hứng

5932
05:42:21,190 --> 05:42:23,080
từ ý tưởng về một\nchuỗi này, và họ có thể

5933
05:42:23,080 --> 05:42:26,900
sử dụng 9 byte cho một số nguyên\ngiá trị hoặc có thể là 20 byte

5934
05:42:26,901 --> 05:42:28,431
mà bạn có thể đếm rất cao.

5935
05:42:28,431 --> 05:42:30,940
Nhưng sau đó họ sẽ bắt đầu\nquản lý bộ nhớ đó cho bạn

5936
05:42:30,940 --> 05:42:34,220
và những gì họ thực sự có thể đang làm\n

5937
05:42:34,221 --> 05:42:37,331
và bằng cách nào đó ghi nhớ\nchuỗi byte dài bao nhiêu.

5938
05:42:37,330 --> 05:42:40,450
Đó cũng là cách các thư viện\ncấp cao hơn này hoạt động.

5939
05:42:40,451 --> 05:42:41,960
Được rồi, điều này đã xảy ra rất nhiều.

5940
05:42:41,960 --> 05:42:43,341
Chúng ta hãy nghỉ ngơi thêm một lần nữa ở đây.

5941
05:42:43,341 --> 05:42:44,931
Chúng ta sẽ nghỉ giải lao bảy phút ở đây.

5942
05:42:44,931 --> 05:42:47,725
Và khi quay lại, chúng tôi sẽ\ncung cấp thêm một số chi tiết.

5943
05:42:50,651 --> 05:42:55,661
Vì vậy, chúng ta vừa xem strlen như một\nví dụ về hàm

5944
05:42:55,661 --> 05:42:57,158
có trong thư viện chuỗi.

5945
05:42:57,158 --> 05:42:59,951
Hãy bắt đầu lấy thêm những thứ này\n

5946
05:42:59,951 --> 05:43:03,791
Vì vậy, chúng tôi không chỉ dựa vào\n

5947
05:43:03,791 --> 05:43:05,921
Hãy để tôi chuyển sang Mã VS.

5948
05:43:05,920 --> 05:43:10,300
Và tạo một tập tin có tên là string.h.

5949
05:43:10,300 --> 05:43:12,376
để áp dụng bài học\nđã học này như sau.

5950
05:43:12,376 --> 05:43:19,030
Hãy để tôi đưa vào cs50.h,\nstdio.h và tính năng mới này

5951
05:43:19,030 --> 05:43:21,521
string.h cũng vậy, ở trên cùng.

5952
05:43:21,521 --> 05:43:23,958
Tôi sẽ thực hiện thao tác\nint main(void) thông thường ở đây.

5953
05:43:23,958 --> 05:43:26,501
Và sau đó trong chương trình này, giả sử,\nđể thảo luận

5954
05:43:26,501 --> 05:43:29,800
mà tôi chưa biết về\n%s đối với printf hoặc, chết tiệt

5955
05:43:29,800 --> 05:43:33,560
có thể ngay từ đầu\nkhông có mã định dạng %s.

5956
05:43:33,561 --> 05:43:36,681
Vì thế không có cách nào dễ dàng\nđể in các chuỗi.

5957
05:43:36,681 --> 05:43:40,091
Chà, ít nhất là nếu chúng ta biết điều đó\n

5958
05:43:40,091 --> 05:43:44,081
chúng ta có thể sử dụng %c như một\ngiải pháp thay thế, một giải pháp cho vấn đề đó

5959
05:43:45,681 --> 05:43:49,181
Vì vậy, hãy để tôi tự hỏi a\nstring s bằng cách sử dụng get string ở đây

5960
05:43:49,181 --> 05:43:51,761
và tôi sẽ yêu cầu người dùng cung cấp một số thông tin đầu vào.

5961
05:43:51,760 --> 05:43:57,520
Và sau đó, để tôi in ra, xuất ra\n

5962
05:43:58,721 --> 05:44:02,261
Bây giờ, cách đơn giản nhất để thực hiện việc này là\n

5963
05:44:02,260 --> 05:44:05,220
printf %s và cắm\nthe s vào, thế là xong.

5964
05:44:05,221 --> 05:44:07,991
Nhưng một lần nữa, để thảo luận, tôi đã quên mất

5965
05:44:07,991 --> 05:44:12,081
hoặc ai đó đã không triển khai %s,\nvậy chúng ta có thể làm điều này bằng cách nào khác?

5966
05:44:12,080 --> 05:44:16,060
Chà, bằng mã giả hoặc bằng tiếng Anh\n

5967
05:44:16,061 --> 05:44:23,171
vấn đề này, in ra chuỗi\n

5968
05:44:23,170 --> 05:44:26,680
Chúng ta có thể giải quyết vấn đề này như thế nào?

5969
05:44:26,681 --> 05:44:28,407
Chỉ bằng tiếng Anh, trình độ cao?

5970
05:44:28,407 --> 05:44:29,990
Mã giả của bạn sẽ trông như thế nào?

5971
05:44:30,491 --> 05:44:33,829
ĐỐI TƯỢNG: Bạn có thể\nchỉ in từng chữ cái.

5972
05:44:33,829 --> 05:44:35,621
DAVID Malan: Được rồi, vậy\nhãy in từng chữ cái ra.

5973
05:44:35,620 --> 05:44:37,751
Và có lẽ, chính xác hơn,\nmột loại vòng lặp nào đó.

5974
05:44:37,751 --> 05:44:41,291
Giống như, hãy lặp lại\nang ký tự trong s

5975
05:44:43,550 --> 05:44:48,310
Vâng, đối với int i, get 0 là một dạng\n

5976
05:44:49,841 --> 05:44:51,626
Được rồi, tôi muốn lặp lại trong bao lâu?

5977
05:44:51,626 --> 05:44:53,501
Chà, điều đó sẽ\nphụ thuộc vào nội dung tôi nhập vào

5978
05:44:53,501 --> 05:44:55,561
nhưng đó là lý do tại sao bây giờ chúng ta có strlen.

5979
05:44:55,561 --> 05:45:00,341
Vì vậy, hãy lặp lại theo độ dài\ns, rồi tăng i bằng dấu cộng

5980
05:45:01,335 --> 05:45:04,931
Và sau đó hãy in\nout %c mà không có dòng mới

5981
05:45:04,931 --> 05:45:07,271
bởi vì tôi muốn mọi thứ\không giống nhau

5982
05:45:07,271 --> 05:45:12,041
bất kể ký tự\nis ở dấu ngoặc i là gì.

5983
05:45:12,041 --> 05:45:14,050
Và rồi đến phút cuối cùng, tôi sẽ cống hiến hết mình

5984
05:45:14,050 --> 05:45:16,611
dòng mới đó, chỉ để di chuyển\ncon trỏ xuống dòng tiếp theo

5985
05:45:16,611 --> 05:45:18,611
vậy nên ký hiệu đô la\nkhông phải ở một nơi kỳ lạ.

5986
05:45:18,611 --> 05:45:21,491
Được rồi, hãy xem liệu tôi có làm sai bất kỳ đoạn mã nào không

5987
05:45:21,491 --> 05:45:26,951
tạo chuỗi, Enter, cho đến nay rất tốt,\n

5988
05:45:30,280 --> 05:45:33,940
Hãy để tôi làm điều đó một lần nữa với\nbye, Enter và điều đó cũng hiệu quả.

5989
05:45:33,940 --> 05:45:36,670
Để ý thấy tôi rất cố ý\nand nhanh chóng đưa mình

5990
05:45:36,670 --> 05:45:39,520
hai khoảng trống ở đây và một khoảng trống\nở đây chỉ vì tôi, theo nghĩa đen

5991
05:45:39,521 --> 05:45:42,881
muốn những thứ này được sắp xếp hợp lý,\n

5992
05:45:42,881 --> 05:45:46,091
Nhưng đó chỉ là một\nchi tiết định dạng có chủ ý.

5993
05:45:47,780 --> 05:45:53,501
Đó là khẳng định tôi đã từng đưa ra\nnhưng nó không được thiết kế tốt.

5994
05:45:53,501 --> 05:45:57,431
Nó được thiết kế tốt ở chỗ tôi đang sử dụng\n

5995
05:45:57,431 --> 05:45:59,921
kiểu như, tôi chưa phát minh lại\na bánh xe, không có dòng 15

5996
05:45:59,920 --> 05:46:02,530
hoặc thấp hơn, tôi đã không tự mình triển khai độ dài\nchuỗi.

5997
05:46:02,530 --> 05:46:07,900
Vì thế ít nhất tôi cũng đang thực hành\nnhững gì tôi đã giảng.

5998
05:46:07,901 --> 05:46:12,621
Nhưng vẫn có sự không hoàn hảo, sự chưa tối ưu.

5999
05:46:12,620 --> 05:46:15,170
Điều này thực sự tinh tế mặc dù.

6000
05:46:15,170 --> 05:46:18,590
Và bạn phải suy nghĩ\nvề cách các vòng lặp hoạt động.

6001
05:46:18,591 --> 05:46:22,901
Tôi đang làm gì mà\nkhông hiệu quả lắm?

6002
05:46:24,131 --> 05:46:27,439
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC]\không bao giờ lặp đi lặp lại.

6003
05:46:27,438 --> 05:46:29,230
DAVID Malan: Vâng, điều này hơi tế nhị một chút.

6004
05:46:29,230 --> 05:46:31,721
Nhưng nếu bạn nghĩ lại\nđịnh nghĩa cơ bản của vòng lặp 4

6005
05:46:31,721 --> 05:46:34,331
và nhớ lại khi tôi nhấn mạnh\nnhững điều vào tuần trước, điều gì xảy ra?

6006
05:46:34,330 --> 05:46:37,090
Chà, điều đầu tiên\nis tôi được đặt thành 0.

6007
05:46:37,091 --> 05:46:38,570
Sau đó chúng tôi kiểm tra điều kiện.

6008
05:46:38,570 --> 05:46:39,820
Làm thế nào để chúng tôi kiểm tra tình trạng?

6009
05:46:39,820 --> 05:46:42,640
Chúng tôi gọi strlen trên s,\nchúng tôi nhận được câu trả lời

6010
05:46:42,640 --> 05:46:49,070
thích 3 nếu đó là dấu chấm than H-I\n

6011
05:46:49,070 --> 05:46:50,830
và sau đó chúng tôi in ra ký tự.

6012
05:46:50,830 --> 05:46:53,320
Sau đó chúng ta tăng i từ 0 lên 1.

6013
05:46:54,728 --> 05:46:56,021
Làm cách nào để kiểm tra lại tình trạng?

6014
05:46:58,361 --> 05:47:01,151
Nhận lại câu trả lời tương tự, 3.

6015
05:47:04,061 --> 05:47:08,951
Vì vậy, chúng tôi in ra một ký tự khác. tôi\n

6016
05:47:11,170 --> 05:47:12,220
Vâng, chuỗi như thế nào là tốt nhất?

6017
05:47:16,120 --> 05:47:19,690
Thế nên tôi tiếp tục hỏi\ncâu hỏi tương tự một cách ngu ngốc

6018
05:47:19,690 --> 05:47:22,480
bởi vì chuỗi có lẽ\n\nkhông bao giờ thay đổi về độ dài.

6019
05:47:22,480 --> 05:47:24,418
Và quả thực, mỗi lần\ntôi kiểm tra điều kiện đó

6020
05:47:24,419 --> 05:47:25,961
chức năng đó sẽ được gọi.

6021
05:47:25,960 --> 05:47:28,640
Và mỗi lần, câu trả lời\ncho xin chào sẽ là 3.

6022
05:47:30,355 --> 05:47:35,111
Vì vậy, đó là mức tối ưu cận biên,\nnhưng tôi có thể làm tốt hơn, phải không?

6023
05:47:35,111 --> 05:47:39,820
Đừng hỏi nhiều lần\n

6024
05:47:39,820 --> 05:47:45,221
Vậy làm sao tôi có thể nhớ được câu trả lời\n

6025
05:47:45,221 --> 05:47:49,011
Làm sao tôi có thể nhớ\ncâu trả lời cho câu hỏi này?

6026
05:47:50,291 --> 05:47:51,707
ĐỐI TƯỢNG: Lưu trữ nó trong một biến.

6027
05:47:51,706 --> 05:47:53,440
DAVID Malan: Vậy hãy lưu trữ\nit trong một biến số, phải không?

6028
05:47:53,440 --> 05:47:56,358
Đó là câu trả lời của chúng tôi hầu hết mọi lúc\n

6029
05:47:57,381 --> 05:48:02,140
Chà, tôi có thể làm điều gì đó như thế này,\n

6030
05:48:02,140 --> 05:48:05,460
Sau đó tôi có thể thay đổi lệnh gọi hàm này.

6031
05:48:05,460 --> 05:48:07,420
Hãy để tôi sửa lỗi chính tả của tôi ở đây.

6032
05:48:07,420 --> 05:48:11,620
Hãy để tôi sửa lỗi này để so sánh\n

6033
05:48:11,620 --> 05:48:14,501
Bởi vì bây giờ strlen chỉ được gọi một lần ở dòng 9.

6034
05:48:14,501 --> 05:48:17,001
Và tôi đang sử dụng lại giá trị\ncủa biến đó, hay còn gọi là.

6035
05:48:17,001 --> 05:48:18,501
chiều dài, một lần nữa, một lần nữa, và một lần nữa.

6036
05:48:19,543 --> 05:48:24,021
Hoá ra 4 vòng lặp đó cho phép bạn\n

6037
05:48:24,021 --> 05:48:28,280
để chúng ta có thể thực hiện việc này một cách thanh lịch hơn một chút, tất cả chỉ trong một dòng.

6038
05:48:28,280 --> 05:48:31,030
Và đây chỉ là một số cải tiến về mặt cú pháp.

6039
05:48:31,030 --> 05:48:36,190
Thực ra tôi có thể làm điều gì đó\nnhư thế này, n bằng strlen của s

6040
05:48:36,190 --> 05:48:39,010
và sau đó tôi có thể nói n\nhere hoặc tôi có thể gọi nó là độ dài.

6041
05:48:39,010 --> 05:48:41,927
Nhưng chết tiệt, trong khi tôi đang nói ngắn gọn\n

6042
05:48:41,927 --> 05:48:46,361
Vì vậy bây giờ nó chỉ là một sự thay đổi nhỏ\nnhưng giờ tôi đã

6043
05:48:46,361 --> 05:48:50,291
đã khai báo hai biến\nên trong vòng lặp của tôi, i và n.

6044
05:48:50,291 --> 05:48:53,561
i được đặt thành 0. n kéo dài\nđến độ dài chuỗi của s.

6045
05:48:53,561 --> 05:48:57,641
Nhưng bây giờ, sau này, tất cả tình trạng của tôi\n

6046
05:48:57,640 --> 05:49:00,431
i nhỏ hơn n và n không bao giờ thay đổi.

6047
05:49:00,431 --> 05:49:02,269
Được rồi, vậy là có một sự cải thiện nho nhỏ ở đó.

6048
05:49:02,269 --> 05:49:04,061
Bây giờ tôi đã sử dụng\nchức năng mới này, hãy cùng

6049
05:49:04,061 --> 05:49:06,186
sử dụng một số chức năng khác\ncó thể bạn quan tâm.

6050
05:49:06,186 --> 05:49:12,941
Hãy để tôi viết một chương trình nhanh ở đây\n

6051
05:49:12,940 --> 05:49:16,070
thay đổi thành chữ hoa một số\nchuỗi mà người dùng nhập vào.

6052
05:49:16,070 --> 05:49:19,751
Vì vậy, hãy để tôi mã hóa một tập tin\ncó tên là chữ hoa.c.

6053
05:49:19,751 --> 05:49:25,780
Ở trên này tôi sẽ sử dụng những người bạn mới của mình,\n

6054
05:49:25,780 --> 05:49:31,330
Vì vậy, I/O tiêu chuẩn và string.h Vì vậy\ncũng giống như trước int main(void).

6055
05:49:31,330 --> 05:49:33,880
Và bên trong phần chính,\nlần này tôi sẽ làm gì

6056
05:49:33,881 --> 05:49:38,651
là hãy yêu cầu người dùng một chuỗi\n

6057
05:49:39,940 --> 05:49:44,390
Và sau đó hãy để tôi in\n ra thứ gì đó như sau.

6058
05:49:44,390 --> 05:49:48,670
Vậy nên nó-- chỉ để tôi có thể thấy được điều gì\n

6059
05:49:48,670 --> 05:49:52,870
Và sau đó, hãy để tôi\nlàm những việc sau, với int, i

6060
05:49:52,870 --> 05:49:56,290
bằng 0, ồ, chúng ta hãy\nthực hành bài học đó nhé

6061
05:49:56,291 --> 05:50:02,050
nên n bằng độ dài chuỗi của\n

6062
05:50:02,050 --> 05:50:05,861
Vì vậy, về cơ bản thì thực sự chưa có gì\nmới.

6063
05:50:05,861 --> 05:50:11,530
Bây giờ làm cách nào để chuyển đổi các ký tự từ\n

6064
05:50:11,530 --> 05:50:14,260
Nói cách khác, nếu tôi gõ\nin xin chào, H-I bằng chữ thường

6065
05:50:14,260 --> 05:50:19,751
Bây giờ tôi muốn chương trình của tôi viết hoa\n

6066
05:50:19,751 --> 05:50:23,030
Vâng, làm cách nào tôi có thể thực hiện việc này?

6067
05:50:23,030 --> 05:50:25,271
Ồ, bạn có thể nhớ lại\nrằng có cái này--

6068
05:50:25,271 --> 05:50:28,161
bạn có thể nhớ lại rằng\ncó biểu đồ ASCII này.

6069
05:50:28,161 --> 05:50:31,116
Vì vậy, chúng ta hãy tham khảo\nthực sự nhanh chóng điều này trên asciichart.com.

6070
05:50:31,116 --> 05:50:35,771
Chúng tôi đã xem xét điều này vào tuần trước\nnhận thấy rằng a-- viết hoa A là 65

6071
05:50:35,771 --> 05:50:39,701
chữ hoa B là 66, chữ hoa\nC là 67, và chết tiệt, đây là

6072
05:50:39,701 --> 05:50:43,901
chữ thường a, chữ thường b,\nchữ thường c và đó là 97, 98, 99.

6073
05:50:43,901 --> 05:50:47,241
Và nếu tôi thực sự làm một số\ntoán, thì có khoảng cách là 32.

6074
05:50:47,741 --> 05:50:49,901
Vì vậy, nếu tôi muốn chuyển từ chữ hoa sang chữ thường

6075
05:50:49,901 --> 05:50:55,049
Tôi có thể làm 65 cộng 32 sẽ cho tôi\n97 và điều đó thực sự hiệu quả

6076
05:50:55,048 --> 05:50:56,591
trên bảng cho mọi thứ khác.

6077
05:50:56,591 --> 05:51:00,280
66 cộng 32 đưa tôi tới 98 hoặc chữ thường b.

6078
05:51:00,280 --> 05:51:04,900
Hoặc ngược lại, nếu bạn có\nchữ thường a và giá trị của nó là 97

6079
05:51:04,901 --> 05:51:11,111
trừ 32 và bùng nổ, bạn có vốn\n

6080
05:51:11,111 --> 05:51:13,721
Nhưng bây giờ chúng ta biết rằng\nstrings chỉ là mảng

6081
05:51:13,721 --> 05:51:17,591
và chúng ta biết rằng các ký tự\ntrong các mảng đó

6082
05:51:17,591 --> 05:51:20,710
chỉ là biểu diễn nhị phân\ncủa các số

6083
05:51:20,710 --> 05:51:23,558
Tôi nghĩ chúng ta có thể thao tác một số\nthứ này như sau.

6084
05:51:23,558 --> 05:51:25,390
Hãy để tôi quay lại\nchương trình của tôi ở đây và trước tiên

6085
05:51:25,390 --> 05:51:29,620
đặt câu hỏi, nếu hiện tại\n

6086
05:51:29,620 --> 05:51:33,190
là chữ thường, hãy\nchuyển nó thành chữ hoa.

6087
05:51:33,190 --> 05:51:34,510
Vậy tôi sẽ làm điều đó như thế nào?

6088
05:51:34,510 --> 05:51:40,720
Nếu ký tự ở dấu ngoặc i,\n

6089
05:51:40,721 --> 05:51:45,581
lớn hơn hoặc bằng\nchữ thường a và dấu ngoặc s

6090
05:51:45,580 --> 05:51:50,920
i nhỏ hơn hoặc bằng\nchữ thường z, một kiểu Boolean kỳ lạ

6091
05:51:50,920 --> 05:51:55,720
biểu thức nhưng nó hoàn toàn\không hợp pháp, bởi vì trong mảng này

6092
05:51:55,721 --> 05:51:58,491
s là một loạt các ký tự\nmà con người đã gõ vào

6093
05:51:58,491 --> 05:52:01,781
bởi vì đó là một chuỗi,\n

6094
05:52:01,780 --> 05:52:03,940
trở nên hơi vô lý\nvì đã bao giờ bạn

6095
05:52:03,940 --> 05:52:05,591
so sánh số với chữ cái?

6096
05:52:05,591 --> 05:52:11,829
Nhưng chúng tôi biết từ tuần 0 chữ thường a\n

6097
05:52:16,850 --> 05:52:20,650
Và điều đó sẽ cho phép chúng tôi trả lời\n

6098
05:52:21,670 --> 05:52:24,790
Được rồi, hãy để tôi\ntrả lời câu hỏi đó.

6099
05:52:24,791 --> 05:52:27,401
Nếu có thì tôi muốn in ra cái gì?

6100
05:52:27,401 --> 05:52:30,131
Tôi không muốn in ra\n bức thư

6101
05:52:30,131 --> 05:52:33,550
Tôi muốn in ra\nchữ trừ 32 phải không?

6102
05:52:33,550 --> 05:52:37,420
Bởi vì nếu nó là chữ thường a, 97, 97 trừ 32

6103
05:52:37,420 --> 05:52:39,790
cho tôi 65, đó là\nuôi chữ A, và tôi biết điều đó

6104
05:52:39,791 --> 05:52:43,121
chỉ vì đã nhìn chằm chằm vào biểu đồ đó trước đây.

6105
05:52:43,120 --> 05:52:48,433
Khác nếu ký tự không nằm giữa chữ a nhỏ và chữ A lớn

6106
05:52:48,433 --> 05:52:50,140
Tôi sắp\nin ra ký tự

6107
05:52:50,140 --> 05:52:52,810
chính nó bằng cách in dấu ngoặc i.

6108
05:52:52,811 --> 05:52:55,841
Và cuối cùng, tôi\n

6109
05:52:55,841 --> 05:52:57,741
để di chuyển con trỏ tới dòng tiếp theo.

6110
05:52:57,741 --> 05:52:59,191
Vì vậy, một lần nữa, nó có một chút từ ngữ.

6111
05:52:59,190 --> 05:53:03,280
Nhưng vòng lặp này ở đây, mà tôi\nđã mượn từ mã của chúng tôi trước đây

6112
05:53:03,280 --> 05:53:05,771
chỉ lặp lại chuỗi, a.k.a.

6113
05:53:05,771 --> 05:53:08,890
mảng, từng ký tự,\ntheo chiều dài của nó.

6114
05:53:08,890 --> 05:53:11,620
Dòng 11 ở đây\nchỉ là đặt câu hỏi

6115
05:53:11,620 --> 05:53:15,130
nếu ký tự hiện tại đó,\nký tự thứ i của s

6116
05:53:15,131 --> 05:53:18,161
lớn hơn hoặc bằng\nnhỏ a và nhỏ hơn

6117
05:53:18,161 --> 05:53:23,501
hơn hoặc bằng z nhỏ, tức là trong khoảng từ 97 đến 132 thì

6118
05:53:23,501 --> 05:53:29,201
thay vào đó, chúng ta sẽ tiếp tục và\nchuyển nó sang chữ hoa.

6119
05:53:29,201 --> 05:53:33,550
Được rồi, hãy để tôi phóng to\nout đây chỉ trong một giây.

6120
05:53:33,550 --> 05:53:38,530
Và xin lỗi, tôi đã viết nhầm số 122, đó\là điều bạn có thể đã nói.

6121
05:53:41,530 --> 05:53:44,540
Hãy để tôi tiếp tục\nbiên dịch và chạy chương trình này.

6122
05:53:44,541 --> 05:53:50,471
Vì vậy hãy viết hoa, ./uppercase và\n

6123
05:53:50,471 --> 05:53:52,781
Và có\nphiên bản viết hoa của nó.

6124
05:53:52,780 --> 05:53:55,181
Hãy để tôi làm lại, với\ntên riêng của tôi bằng chữ thường

6125
05:53:55,181 --> 05:53:57,361
và bây giờ nó cũng được viết hoa.

6126
05:53:57,361 --> 05:53:59,120
Chà, chúng ta có thể làm gì để cải thiện điều này?

6127
05:54:00,221 --> 05:54:01,901
Hãy ngừng phát minh lại bánh xe.

6128
05:54:01,901 --> 05:54:04,101
Chúng ta hãy đi đến các trang hướng dẫn.

6129
05:54:04,100 --> 05:54:07,751
Vậy hãy để tôi đến đây và tìm kiếm\nthứ gì đó như, tôi không biết

6130
05:54:09,881 --> 05:54:12,730
Tôi đã thực hiện một số thao tác tự động hoàn tất\nở đây, hộp tìm kiếm nhỏ của chúng tôi

6131
05:54:12,730 --> 05:54:14,980
đang nói rằng, được rồi, có\nan hàm thấp hơn

6132
05:54:14,980 --> 05:54:16,811
kiểm tra xem một ký tự có phải là chữ thường hay không.

6133
05:54:17,901 --> 05:54:23,411
Ờ để tôi kiểm tra, thấp hơn, giờ tôi thấy rồi\n

6134
05:54:27,163 --> 05:54:28,870
đó là tệp tiêu đề\nTôi cần đưa vào.

6135
05:54:28,870 --> 05:54:32,830
Đây là nguyên mẫu của is-low,\n

6136
05:54:35,591 --> 05:54:38,661
Tôi cảm thấy is-low sẽ\ntrả về đúng hoặc sai.

6137
05:54:38,661 --> 05:54:42,940
Vì vậy, hãy cuộn xuống phần\nmô tả và trả về giá trị.

6138
05:54:42,940 --> 05:54:45,070
Nó quay lại, ồ điều này thật thú vị.

6139
05:54:45,070 --> 05:54:49,631
Và đây là quy ước trong C. Đây\n

6140
05:54:49,631 --> 05:54:55,081
nếu C là chữ thường và 0\nif C không phải là chữ thường.

6141
05:54:57,491 --> 05:55:02,591
Vậy giống như 1, âm 1, cái gì đó\n

6142
05:55:02,591 --> 05:55:05,661
và 0 nếu nó không phải là chữ thường.

6143
05:55:05,661 --> 05:55:07,420
Vậy làm thế nào chúng ta có thể sử dụng khối xây dựng này?

6144
05:55:07,420 --> 05:55:09,490
Hãy để tôi quay lại mã của tôi ở đây.

6145
05:55:09,491 --> 05:55:13,871
Hãy để tôi thêm tệp này, bao gồm ctype.h.

6146
05:55:13,870 --> 05:55:17,380
Và ở dưới đây, hãy để tôi loại bỏ\nbiểu thức khó hiểu này,

6147
05:55:17,381 --> 05:55:23,320
thật khó để nghĩ ra,\n

6148
05:55:26,230 --> 05:55:29,650
Điều đó thực sự có tác dụng nhưng tại sao?

6149
05:55:29,651 --> 05:55:34,781
Vâng là-thấp hơn, một lần nữa, trả về giá trị khác 0\n

6150
05:55:36,411 --> 05:55:37,675
Điều đó có nghĩa là nó có thể trả về 1.

6151
05:55:37,675 --> 05:55:38,800
Nó có thể trả về âm 1.

6152
05:55:38,800 --> 05:55:40,631
Nó có thể trả về 50 hoặc âm 50.

6153
05:55:40,631 --> 05:55:42,911
Nó thực sự không được xác định chính xác, tại sao?

6154
05:55:43,960 --> 05:55:48,010
Đây là quy ước chung\nsử dụng 0 để biểu thị sai và sử dụng

6155
05:55:48,010 --> 05:55:50,380
bất kỳ giá trị nào khác để đại diện cho true.

6156
05:55:50,381 --> 05:55:54,401
Và hóa ra,\nbên trong các biểu thức Boolean

6157
05:55:54,401 --> 05:55:59,016
nếu bạn đặt một giá trị như một hàm\n

6158
05:55:59,015 --> 05:56:00,640
điều đó sẽ tương đương với sai.

6159
05:56:00,640 --> 05:56:03,236
Kiểu như câu trả lời là không, không thấp hơn.

6160
05:56:03,236 --> 05:56:06,251
Nhưng bạn cũng có thể,\ntrong ngoặc đơn, đặt tên

6161
05:56:06,251 --> 05:56:10,181
của hàm và các đối số của nó,\n

6162
05:56:10,181 --> 05:56:15,491
Bởi vì chúng ta có thể làm điều gì đó như\n

6163
05:56:16,508 --> 05:56:19,091
Bởi vì đó là định nghĩa,\nnếu nó trả về giá trị khác 0

6164
05:56:20,021 --> 05:56:23,471
Nhưng có một cách ngắn gọn hơn để làm điều đó\n

6165
05:56:23,471 --> 05:56:28,371
Nếu nó thấp hơn thì in\nout ký tự trừ 32.

6166
05:56:28,370 --> 05:56:30,850
Vì vậy đây sẽ là cách\nphổ biến để sử dụng một trong những cách này

6167
05:56:30,850 --> 05:56:34,286
is- có chức năng kiểm tra xem\ncâu trả lời là đúng hay sai.

6168
05:56:37,070 --> 05:56:38,931
DAVID Malan: Được rồi, chúng ta có thể xong việc.

6169
05:56:43,780 --> 05:56:47,440
Sẽ không đúng nếu kiểm tra\n

6170
05:56:47,440 --> 05:56:49,810
Bạn muốn kiểm tra số đối nghịch của 0.

6171
05:56:51,131 --> 05:56:56,081
Hoặc ngắn gọn hơn, như tôi đã làm\n

6172
05:56:56,080 --> 05:56:58,820
Hãy để tôi xem điều gì xảy ra ở đây.

6173
05:56:58,820 --> 05:57:02,951
Điều này thật tuyệt, nhưng một số bạn\n

6174
05:57:03,940 --> 05:57:06,490
Cách đây một lúc khi chúng ta đang tìm kiếm\ntrang hướng dẫn sử dụng

6175
05:57:06,491 --> 05:57:09,641
đối với những thứ liên quan đến chữ thường,\nmột tòa nhà khác có thể là gì

6176
05:57:13,420 --> 05:57:14,960
Dựa vào những gì trên màn hình ở đây?

6177
05:57:18,401 --> 05:57:21,359
Có một chức năng theo đúng nghĩa đen\n

6178
05:57:21,359 --> 05:57:24,293
nên tôi không cần phải đào sâu vào\nâm 32, cộng 32.

6179
05:57:24,293 --> 05:57:25,751
Tôi không cần phải tham khảo biểu đồ đó.

6180
05:57:25,751 --> 05:57:29,381
Trước đây ai đó đã giải quyết\nvấn đề này cho tôi.

6181
05:57:29,381 --> 05:57:33,941
Và hãy xem liệu tôi có thể thực sự quay lại được hay không.

6182
05:57:34,780 --> 05:57:36,800
Bây giờ hãy để tôi tiếp tục và sử dụng cái này.

6183
05:57:36,800 --> 05:57:39,490
Vì vậy, thay vì làm\ns ngoặc tôi trừ 32

6184
05:57:39,491 --> 05:57:44,141
hãy sử dụng chức năng của người khác\n

6185
05:57:44,681 --> 05:57:47,511
Và bây giờ nó sẽ\ngiải pháp cho tôi.

6186
05:57:47,510 --> 05:57:54,790
Vì vậy, nếu tôi chạy lại tạo chữ hoa và sau đó\n

6187
05:57:54,791 --> 05:57:56,381
bây giờ nó hoạt động như mong đợi.

6188
05:57:56,381 --> 05:58:00,131
Và thành thật mà nói, nếu tôi đọc\ntài liệu về phần trên

6189
05:58:00,131 --> 05:58:03,431
bằng cách quay lại trang man,\hoặc trang thủ công của nó, bạn sẽ thấy những gì

6190
05:58:03,431 --> 05:58:08,681
là nó nói nếu nó là chữ thường,\n

6191
05:58:09,311 --> 05:58:13,174
Nếu không phải chữ thường thì đã là\chữ hoa, đó là dấu câu

6192
05:58:13,173 --> 05:58:14,966
nó sẽ chỉ trả về\nký tự gốc.

6193
05:58:14,966 --> 05:58:18,161
Điều đó có nghĩa là nhờ vào\nchức năng này, tôi thực sự có thể

6194
05:58:18,161 --> 05:58:21,911
thắt chặt điều này một cách đáng kể,\nloại bỏ tất cả các điều kiện của tôi

6195
05:58:21,911 --> 05:58:26,291
ở đó và chỉ in ra\ngiá trị trả về phía trên

6196
05:58:26,291 --> 05:58:29,320
và để lại cho người viết\nhàm đó tìm ra

6197
05:58:29,320 --> 05:58:33,730
nếu một cái gì đó là chữ hoa hoặc chữ thường.

6198
05:58:33,730 --> 05:58:38,080
Được rồi, bạn có câu hỏi về\nnhững thủ thuật này không?

6199
05:58:38,080 --> 05:58:41,350
Một lần nữa, tất cả đều giảm xuống\ncác thông tin cơ bản về tuần 0, nhưng chúng tôi chỉ

6200
05:58:41,350 --> 05:58:43,010
xây dựng những sự trừu tượng này lên trên.

6201
05:58:43,510 --> 05:58:45,468
KHÁN GIẢ: Tôi đang tự hỏi\n liệu có cách nào

6202
05:58:45,469 --> 05:58:49,370
thay vào đó hãy nhập tất cả các gói trong\na tên miền phụ nhất định

6203
05:58:49,370 --> 05:58:51,380
về việc phải thực hiện nhiều câu lệnh\n[KHÔNG NGHE ĐƯỢC]

6204
05:58:51,381 --> 05:58:52,673
giống như một ngôi sao [KHÔNG NGHE ĐƯỢC]

6205
05:58:54,440 --> 05:58:57,380
Không có cách nào dễ dàng trong C\nđể nói, hãy cho tôi mọi thứ.

6206
05:58:57,381 --> 05:58:59,931
Đó là vì lý do về mặt lịch sử\nhiệu suất.

6207
05:58:59,931 --> 05:59:03,201
Họ muốn bạn nói rõ\nas về những gì bạn muốn đưa vào.

6208
05:59:03,201 --> 05:59:05,991
Trong các ngôn ngữ khác như\nPython, Java, một trong số đó

6209
05:59:05,991 --> 05:59:08,774
Chúng ta sẽ gặp lại học kỳ này sau, bạn\ncó thể nói, hãy đưa cho tôi mọi thứ.

6210
05:59:08,774 --> 05:59:11,691
Nhưng trên thực tế, điều đó có xu hướng tốt nhất\n

6211
05:59:11,690 --> 05:59:14,260
thực thi hoặc biên dịch mã của bạn.

6212
05:59:14,760 --> 05:59:17,105
ĐỐI TƯỢNG: to-upper\na có phù hợp với các ký tự đặc biệt không?

6213
05:59:17,600 --> 05:59:20,240
Phần trên có chứa các ký tự\nđặc biệt như dấu chấm câu không?

6214
05:59:20,741 --> 05:59:22,701
Nếu tôi đọc tài liệu\nmột cách khoa trương hơn

6215
05:59:23,971 --> 05:59:27,201
Nó sẽ trả lại cho tôi một dấu chấm than đúng cách

6216
05:59:28,861 --> 05:59:33,230
Vì vậy, nếu tôi viết hoa ở đây,\nvà hãy để tôi viết ./upper, xin lỗi--

6217
05:59:33,230 --> 05:59:37,881
./chữ hoa, xin chào bằng dấu chấm than\n

6218
05:59:37,881 --> 05:59:40,070
chuyển nó qua không thay đổi Vâng?

6219
05:59:40,070 --> 05:59:43,460
ĐỐI TƯỢNG: Chúng ta có truy cập vào một\nchức năng có thể thực hiện tất cả những điều đó không

6220
05:59:43,460 --> 05:59:45,850
nhưng chỉ vào màn hình\nchứ không phải [KHÔNG NGHE ĐƯỢC]

6221
05:59:45,850 --> 05:59:47,810
DAVID Malan: Câu hỏi thực sự hay.

6222
05:59:47,811 --> 05:59:52,371
Không, chúng tôi không có quyền truy cập vào một chức năng\n

6223
05:59:52,370 --> 05:59:56,001
với thư viện của CS50 sẽ chỉ\n

6224
05:59:56,001 --> 05:59:58,431
Trong C, điều đó thực sự nói dễ hơn làm.

6225
05:59:59,811 --> 06:00:04,070
Vì vậy hãy chú ý theo dõi ngôn ngữ khác\n

6226
06:00:04,070 --> 06:00:06,771
Được rồi, vậy\nđiều này để lại cho chúng ta điều gì?

6227
06:00:06,771 --> 06:00:08,780
Chỉ có một-- hãy\nđi hết vòng tròn ngay bây giờ

6228
06:00:08,780 --> 06:00:11,751
đến nơi chúng ta bắt đầu ngày hôm nay, nơi chúng ta\n

6229
06:00:12,350 --> 06:00:16,070
Hãy nhớ lại rằng chúng ta đã nói về rm\nviệc lấy đối số dòng lệnh.

6230
06:00:16,070 --> 06:00:18,730
Tệp bạn muốn xóa\nchúng ta đã nói về clang

6231
06:00:18,730 --> 06:00:20,480
lấy dòng lệnh \ đối số, một lần nữa

6232
06:00:20,480 --> 06:00:22,400
sửa đổi hành vi của chương trình.

6233
06:00:22,401 --> 06:00:25,941
Làm thế nào mà bạn và tôi\ncó thể bắt đầu viết những chương trình

6234
06:00:25,940 --> 06:00:28,100
thực sự lấy đối số dòng lệnh?

6235
06:00:28,100 --> 06:00:31,880
Ồ, đây là nơi cuối cùng tôi\ncó thể giải thích tại sao

6236
06:00:31,881 --> 06:00:35,001
chúng tôi đã gõ int\nmain(void) trong tuần qua

6237
06:00:35,001 --> 06:00:38,751
và chỉ yêu cầu bạn có niềm tin\n

6238
06:00:38,751 --> 06:00:45,081
Vâng, theo mặc định trong C, ít nhất\n

6239
06:00:45,080 --> 06:00:48,270
chỉ có hai cách chính thức\nđể viết các hàm chính.

6240
06:00:48,271 --> 06:00:50,721
Bạn có thể thấy các định dạng khác\không trực tuyến, nhưng nhìn chung chúng

6241
06:00:50,721 --> 06:00:53,131
không phù hợp với đặc điểm\nhiện tại.

6242
06:00:53,131 --> 06:00:56,421
Một lần nữa, đây là một\nbản soạn sẵn cho cách đơn giản nhất

6243
06:00:56,420 --> 06:00:59,030
hàm mà chúng tôi có thể viết vào tuần trước\nvà nhớ lại rằng chúng tôi đã

6244
06:00:59,030 --> 06:01:00,470
đã làm điều này suốt thời gian qua

6245
06:01:00,471 --> 06:01:05,251
(Void) Điều đó (void) nghĩa là gì, đối với tất cả\n

6246
06:01:05,251 --> 06:01:08,151
và bạn đã viết cho đến nay,\nis rằng không có chương trình nào của chúng tôi

6247
06:01:08,151 --> 06:01:11,301
mà chúng tôi đã viết các đối số dòng lệnh take\n.

6248
06:01:11,300 --> 06:01:13,370
Đó chính là ý nghĩa của khoảng trống.

6249
06:01:13,370 --> 06:01:18,210
Hóa ra chính là cách bạn\n

6250
06:01:18,210 --> 06:01:20,001
trên thực tế, hãy lấy các đối số dòng lệnh\n, điều đó

6251
06:01:20,001 --> 06:01:24,021
là các từ sau lệnh\trong cửa sổ terminal của bạn.

6252
06:01:24,021 --> 06:01:26,480
Nếu bạn thực sự không muốn\nsử dụng get int hoặc get string

6253
06:01:26,480 --> 06:01:30,230
bạn muốn con người có thể\n

6254
06:01:31,100 --> 06:01:34,200
Và chỉ cần chạy-- print\nhello, David trên màn hình.

6255
06:01:34,201 --> 06:01:38,721
Bạn có thể sử dụng các đối số dòng lệnh,\ncác từ sau tên chương trình

6256
06:01:41,010 --> 06:01:44,720
Vì vậy chúng ta sẽ thay đổi điều này trong một\n

6257
06:01:44,721 --> 06:01:48,191
nhưng có điều gì đó bây giờ đã quen thuộc hơn một chút về mặt cú pháp.

6258
06:01:48,190 --> 06:01:52,700
Nếu bạn thay đổi (void) trong main\n

6259
06:01:52,701 --> 06:01:57,741
int, argc, dấu phẩy, chuỗi, argv,\ndấu ngoặc mở, dấu ngoặc đóng

6260
06:01:57,741 --> 06:02:00,891
bây giờ bạn đang tự cấp cho mình\nquyền truy cập vào việc viết chương trình

6261
06:02:00,890 --> 06:02:03,170
lấy đối số dòng lệnh.

6262
06:02:03,170 --> 06:02:06,380
Argc, viết tắt của\số lượng đối số đang diễn ra

6263
06:02:06,381 --> 06:02:10,671
là một số nguyên lưu trữ bao nhiêu\n

6264
06:02:10,670 --> 06:02:13,310
C tự động cung cấp điều đó cho bạn.

6265
06:02:13,311 --> 06:02:16,971
Chuỗi argv là viết tắt của\vector đối số, nghĩa là

6266
06:02:16,971 --> 06:02:21,361
sẽ là một mảng gồm tất cả các từ\n

6267
06:02:21,361 --> 06:02:23,390
Vì vậy, với cách xây dựng\nkhối mảng hôm nay

6268
06:02:23,390 --> 06:02:26,240
giờ đây chúng ta có khả năng cho phép\ncon người gõ càng nhiều từ càng tốt

6269
06:02:26,241 --> 06:02:28,161
hoặc ít từ tùy theo ý muốn của họ tại dấu nhắc.

6270
06:02:28,161 --> 06:02:31,161
C sẽ tự động đặt\nthem vào một mảng có tên argv

6271
06:02:31,161 --> 06:02:36,620
và nó sẽ cho chúng ta biết có bao nhiêu\n

6272
06:02:36,620 --> 06:02:40,320
Kiểu int, là kiểu trả về ở đây,\n

6273
06:02:40,320 --> 06:02:43,611
Hãy sử dụng định nghĩa này\nđể thực hiện, có thể

6274
06:02:43,611 --> 06:02:45,230
chỉ một vài chương trình đơn giản.

6275
06:02:45,230 --> 06:02:47,330
Nhưng trong tập bài tập 2\nchúng ta sẽ thực sự sử dụng

6276
06:02:47,330 --> 06:02:50,730
điều này để kiểm soát\nhành vi của mã của riêng bạn.

6277
06:02:50,730 --> 06:02:57,381
Hãy để tôi mã hóa một tệp có tên\nargv.0 chỉ để đặt tên cho phù hợp.

6278
06:02:59,960 --> 06:03:01,501
Hãy để tôi tiếp tục và bao gồm--

6279
06:03:02,001 --> 06:03:05,210
Đó không phải là tên đúng của\nchương trình, hãy bắt đầu lại từ đầu.

6280
06:03:05,210 --> 06:03:09,710
Hãy tiếp tục và viết mã argv.c.

6281
06:03:11,061 --> 06:03:17,151
bao gồm cs50.h, bao gồm\nstdio.h, int, main, không void

6282
06:03:17,151 --> 06:03:24,286
hãy thực sự nói int, argc, string,\n

6283
06:03:24,286 --> 06:03:26,661
Không có con số nào ở giữa vì\nbạn không biết trước

6284
06:03:26,661 --> 06:03:29,570
con người sẽ gõ bao nhiêu từ theo dấu nhắc của họ.

6285
06:03:29,570 --> 06:03:31,021
Bây giờ chúng ta hãy tiếp tục và làm điều này.

6286
06:03:31,021 --> 06:03:35,061
Hãy viết một chương trình rất đơn giản\n

6287
06:03:35,061 --> 06:03:36,921
bất cứ ai tên đó sẽ được gõ.

6288
06:03:36,920 --> 06:03:40,520
Nhưng không sử dụng chuỗi get, thay vào đó hãy để con người chỉ

6289
06:03:40,521 --> 06:03:44,151
gõ tên của họ tại dấu nhắc, giống như\n

6290
06:03:44,151 --> 06:03:46,431
vì vậy nó chỉ là một và\nxong khi bạn nhấn Enter.

6291
06:03:47,870 --> 06:03:52,640
Hãy để tôi tiếp tục và làm điều này,\nprintf, trích dẫn-bỏ trích dẫn, xin chào

6292
06:03:52,640 --> 06:03:55,760
dấu phẩy và thay vì world\nhôm nay, tôi muốn in ra

6293
06:03:55,760 --> 06:03:57,630
bất cứ điều gì con người gõ vào.

6294
06:03:57,631 --> 06:04:03,111
Vì vậy, hãy tiếp tục và thực hiện\nđiều này, argv, dấu ngoặc 0 ngay bây giờ.

6295
06:04:03,111 --> 06:04:07,341
Nhưng tôi không nghĩ đây hoàn toàn\nlà điều tôi muốn bởi vì, tất nhiên

6296
06:04:07,341 --> 06:04:12,631
nó sẽ in ra\nout argv, ngoặc, 0, ngoặc.

6297
06:04:12,631 --> 06:04:16,771
Tôi cần một phần giữ chỗ, vậy hãy để tôi\n

6298
06:04:16,771 --> 06:04:20,780
Vì vậy, nếu argv là một mảng, nhưng\nit là một chuỗi các chuỗi

6299
06:04:20,780 --> 06:04:24,740
thì khung argv 0 chính là một chuỗi đơn.

6300
06:04:24,741 --> 06:04:27,711
Và do đó nó có thể được cắm\nvào phần giữ chỗ %s đó.

6301
06:04:27,710 --> 06:04:30,001
Hãy để tôi tiếp tục và lưu chương trình của tôi.

6302
06:04:30,001 --> 06:04:33,600
Và biên dịch argv, cho đến nay, rất tốt.

6303
06:04:33,600 --> 06:04:37,431
Bây giờ hãy để tôi nhập tên của tôi\nsau tên của chương trình.

6304
06:04:38,241 --> 06:04:42,541
Thực ra tôi đang gõ thêm một từ,\n

6305
06:04:42,541 --> 06:04:45,550
Được rồi, có vẻ như có một chút\nlỗi ở một vài khía cạnh.

6306
06:04:45,550 --> 06:04:48,760
Tôi đã quên /n nhưng\nđó không phải là vấn đề lớn.

6307
06:04:48,760 --> 06:04:53,220
Nhưng rõ ràng, bên trong\nargv thực sự là tất cả mọi thứ

6308
06:04:53,221 --> 06:04:55,531
mà con người đã nhập vào bao gồm cả\ntên của chương trình.

6309
06:04:55,530 --> 06:05:00,510
Vậy một cách hợp lý, làm cách nào để in ra xin chào,\n

6310
06:05:00,510 --> 06:05:01,980
tên thật của chương trình?

6311
06:05:03,721 --> 06:05:05,311
ĐỐI TƯỢNG: Thay đổi chỉ số thành 1.

6312
06:05:06,061 --> 06:05:10,201
Vì vậy có lẽ chỉ số là 1, nếu đó\n

6313
06:05:11,201 --> 06:05:15,671
Vì vậy, hãy tạo argv\nagain, ./argv, Enter.

6314
06:05:17,890 --> 06:05:19,951
Vậy đây là một dạng khác của null.

6315
06:05:19,951 --> 06:05:23,581
Nhưng đây là lỗi của người dùng, về phía tôi.

6316
06:05:23,580 --> 06:05:25,330
Tôi đã không làm chính xác những gì tôi đã nói.

6317
06:05:25,830 --> 06:05:26,790
ĐỐI TƯỢNG: Bạn quên tham số.

6318
06:05:26,791 --> 06:05:28,691
DAVID Malan: Vâng, tôi\nquên tham số.

6319
06:05:29,960 --> 06:05:31,710
Có lẽ tôi nên giải quyết\nviệc đó bằng cách nào đó

6320
06:05:31,710 --> 06:05:33,552
để mọi người không phá vỡ chương trình của tôi

6321
06:05:33,552 --> 06:05:35,260
và in ra những thứ\nngẫu nhiên, như nul.

6322
06:05:35,260 --> 06:05:39,030
Nhưng nếu tôi nói argv, David,\nbạn thấy đấy, xin chào David.

6323
06:05:39,030 --> 06:05:42,330
Tôi có thể tò mò một chút,\nnhư ở vị trí 2 có gì?

6324
06:05:42,330 --> 06:05:47,670
Chà, chúng ta có thể thấy, tạo argv,\nbracket, ./argv, David, Enter.

6325
06:05:47,670 --> 06:05:49,170
Được rồi, chỉ là không có gì ở đó cả.

6326
06:05:49,170 --> 06:05:52,462
Nhưng hóa ra, trong vài tuần nữa,\n

6327
06:05:52,462 --> 06:05:54,570
và xem liệu chúng ta có thể cố ý làm hỏng\ncác chương trình không

6328
06:05:54,570 --> 06:05:57,061
bởi vì không có gì\nngăn cản tôi nói

6329
06:05:57,061 --> 06:06:00,730
ồ, chẳng hạn như ở vị trí 2\nmillion có gì?

6330
06:06:00,730 --> 06:06:02,611
Chúng ta thực sự có thể bắt đầu tò mò.

6331
06:06:02,611 --> 06:06:04,681
Nhưng hiện tại, chúng tôi sẽ làm điều đúng đắn.

6332
06:06:04,681 --> 06:06:08,620
Nhưng bây giờ hãy đảm bảo rằng con người có\n

6333
06:06:08,620 --> 06:06:15,181
Vì vậy, hãy nói điều này, nếu argc bằng\n

6334
06:06:15,181 --> 06:06:19,021
và một từ nữa sau đó, hãy tiếp tục và tin tưởng vào điều đó trong argv 1

6335
06:06:19,021 --> 06:06:21,241
như bạn đề xuất, là tên của người đó.

6336
06:06:21,241 --> 06:06:26,071
Nếu không, hãy tiếp tục và mặc định\n

6337
06:06:26,070 --> 06:06:30,120
kiểu như, nếu chúng ta không có tên\n

6338
06:06:31,561 --> 06:06:34,306
Vì vậy bây giờ chúng tôi đang lập trình phòng thủ.

6339
06:06:34,306 --> 06:06:37,350
Lần này là con người, ngay cả khi họ\n

6340
06:06:37,350 --> 06:06:40,225
hoặc họ đặt cho chúng ta quá nhiều tên,\n

6341
06:06:40,225 --> 06:06:42,150
bởi vì bây giờ tôi phải xử lý một số\nlỗi ở đây.

6342
06:06:42,151 --> 06:06:46,291
Bởi vì, một lần nữa, argc là đối số\n

6343
06:06:51,001 --> 06:06:52,800
Hãy để tôi phạm sai lầm tương tự như trước đây.

6344
06:06:53,311 --> 06:06:55,171
Tôi không nhận được hành vi vô lý kỳ lạ này.

6345
06:06:55,170 --> 06:06:56,610
Tôi nhận được một cái gì đó được xác định rõ ràng.

6346
06:06:57,870 --> 06:07:01,111
Tôi có thể làm David Malan, nhưng\nđiều đó hiện không được hỗ trợ.

6347
06:07:01,111 --> 06:07:05,550
Tôi cần phải thay đổi logic của mình thành\n

6348
06:07:06,605 --> 06:07:08,030
Vậy ý nghĩa của việc này là gì?

6349
06:07:08,030 --> 06:07:09,780
Hiện tại, đó\nchỉ là một bài tập đơn giản

6350
06:07:09,780 --> 06:07:14,962
để thực sự cho mình một cách tiếp nhận\n

6351
06:07:14,962 --> 06:07:16,920
Bởi vì, hãy cân nhắc, nó\nchỉ thuận tiện hơn trong

6352
06:07:16,920 --> 06:07:18,930
thế giới giao diện dòng lệnh mới này.

6353
06:07:18,931 --> 06:07:23,118
Nếu bạn phải sử dụng get string\nmỗi lần biên dịch mã của mình

6354
06:07:23,117 --> 06:07:24,450
sẽ hơi khó chịu phải không?

6355
06:07:24,451 --> 06:07:28,201
Bạn gõ make, sau đó bạn có thể nhận được\n

6356
06:07:28,201 --> 06:07:31,951
Sau đó bạn nhập hello, hoặc cash, hoặc\n

6357
06:07:31,951 --> 06:07:33,591
nó chỉ thực sự làm chậm quá trình.

6358
06:07:33,591 --> 06:07:35,701
Nhưng trong thế giới\ngiao diện dòng lệnh này

6359
06:07:35,701 --> 06:07:39,031
nếu bạn hỗ trợ các đối số dòng lệnh,\n

6360
06:07:39,030 --> 06:07:42,431
Giống như cuộn lên và xuống trong\n

6361
06:07:42,431 --> 06:07:46,690
Bạn chỉ có thể gõ lệnh nhanh hơn\n

6362
06:07:46,690 --> 06:07:49,260
Và bạn không cần phải liên tục\nnhắc nhở người dùng nữa

6363
06:07:49,260 --> 06:07:52,020
một cách mô phạm, để biết thêm thông tin.

6364
06:07:52,021 --> 06:07:54,541
Vậy có câu hỏi nào về\nđối số dòng lệnh không?

6365
06:07:54,541 --> 06:07:58,261
Điều này cuối cùng tiết lộ lý do tại sao\nban đầu chúng tôi có (void)

6366
06:07:58,260 --> 06:08:00,870
nhưng bây giờ chúng ta có thể đưa thêm gì vào main.

6367
06:08:00,870 --> 06:08:03,330
Đó là cách bạn lấy\ncác đối số dòng lệnh.

6368
06:08:04,760 --> 06:08:06,870
KHÁN GIẢ: Nếu bạn đặt--

6369
06:08:06,870 --> 06:08:11,580
nếu bạn sử dụng argv, và bạn\n

6370
06:08:11,580 --> 06:08:14,183
nó vẫn sẽ cung cấp cho bạn một sợi dây chứ?

6371
06:08:14,184 --> 06:08:15,766
Điều đó vẫn sẽ được coi là chuỗi?

6372
06:08:15,766 --> 06:08:17,184
Hay bạn sẽ cân nhắc [KHÔNG NGHE ĐƯỢC]?

6373
06:08:18,021 --> 06:08:20,811
Nếu bạn gõ vào\ndòng lệnh một cái gì đó

6374
06:08:20,811 --> 06:08:24,921
giống như, không phải một từ, mà\nthứ gì đó giống như số 42

6375
06:08:24,920 --> 06:08:27,710
nó thực sự sẽ được\ncoi như một chuỗi.

6376
06:08:28,550 --> 06:08:30,480
Bởi vì một lần nữa, bối cảnh rất quan trọng.

6377
06:08:30,480 --> 06:08:33,201
Vì vậy, nếu chương trình của bạn\nhiện đang thao tác bộ nhớ

6378
06:08:33,201 --> 06:08:36,771
như thể các ký tự hoặc chuỗi của nó,\n

6379
06:08:36,771 --> 06:08:41,061
là chúng sẽ được diễn giải dưới dạng văn bản ASCII hoặc văn bản Unicode.

6380
06:08:41,061 --> 06:08:44,901
Do đó, nếu chúng ta đi đến biểu đồ ở đây,\n

6381
06:08:44,901 --> 06:08:48,771
vậy thì làm sao bạn phân biệt được các con số\n

6382
06:08:50,151 --> 06:08:58,641
À, lưu ý rằng 65 là a, 97 là a,\nnhưng 49 là 1 và 50 là 2.

6383
06:08:58,640 --> 06:09:01,760
Vì vậy các nhà thiết kế ASCII,\nvà sau đó là Unicode

6384
06:09:01,760 --> 06:09:04,940
hiểu rồi, hãy đợi một chút,\nnếu chúng tôi muốn hỗ trợ các chương trình

6385
06:09:04,940 --> 06:09:07,700
cho phép bạn gõ những thứ\ngiống như những con số

6386
06:09:07,701 --> 06:09:10,611
mặc dù về mặt kỹ thuật chúng không phải là số nguyên hoặc số float

6387
06:09:10,611 --> 06:09:14,881
chúng ta cần một cách trong ASCII và\nUnicode để biểu diễn các số chẵn.

6388
06:09:16,131 --> 06:09:19,471
Và thật ngớ ngẩn khi chúng ta có\n

6389
06:09:19,471 --> 06:09:22,123
Nhưng một lần nữa, nếu bạn đang ở trong\nthế giới của các chữ cái và ký tự

6390
06:09:22,123 --> 06:09:24,291
bạn phải nghĩ ra\na bản đồ cho mọi thứ.

6391
06:09:24,291 --> 06:09:26,050
Và để ý ở đây, đây là dấu chấm.

6392
06:09:26,050 --> 06:09:30,650
Ngay cả khi bạn đại diện cho 1,23\n

6393
06:09:30,651 --> 06:09:35,101
ngay cả dấu chấm bây giờ cũng sẽ là\n

6394
06:09:35,100 --> 06:09:37,190
Vì vậy, một lần nữa, bối cảnh ở đây rất quan trọng.

6395
06:09:37,190 --> 06:09:41,630
Được rồi, một ví dụ cuối cùng\nđể hiểu rõ int này là gì

6396
06:09:41,631 --> 06:09:44,101
và những gì nó đã\nlàm ở đây bấy lâu nay.

6397
06:09:44,100 --> 06:09:49,040
Vì vậy tôi sẽ thêm một\nbit logic vào một tệp mới

6398
06:09:49,041 --> 06:09:52,011
mà tôi sẽ gọi exit.c.

6399
06:09:53,390 --> 06:09:57,140
Chúng tôi sắp giới thiệu một thứ\n

6400
06:09:57,140 --> 06:09:59,240
Hóa ra đây chưa phải là tính năng\na mà chúng tôi đã sử dụng

6401
06:09:59,241 --> 06:10:01,501
nhưng nó chỉ hữu ích để biết về.

6402
06:10:01,501 --> 06:10:04,611
Đặc biệt là khi tự động hóa\ncác cuộc kiểm tra mã của riêng bạn.

6403
06:10:04,611 --> 06:10:08,376
Khi tìm hiểu xem chương trình đã thành công hay thất bại.

6404
06:10:08,376 --> 06:10:13,131
Hóa ra main có một\n

6405
06:10:13,131 --> 06:10:18,591
Khả năng báo hiệu cho người dùng\n

6406
06:10:18,591 --> 06:10:22,021
Và đó là giá trị trả về của\nmain.

6407
06:10:22,021 --> 06:10:26,320
Vì vậy tôi sẽ sửa đổi\nchương trình này như sau, như thế này.

6408
06:10:26,320 --> 06:10:29,181
Giả sử tôi muốn viết\na một chương trình tương tự

6409
06:10:29,181 --> 06:10:32,161
yêu cầu người dùng\nnhập một từ tại dấu nhắc.

6410
06:10:32,161 --> 06:10:36,710
Vì vậy, argc đó phải là 2\ncho bất kỳ mục đích thiết kế nào.

6411
06:10:36,710 --> 06:10:43,251
Nếu argc không bằng 2, tôi muốn\n

6412
06:10:43,251 --> 06:10:46,850
Tôi muốn nhấn mạnh rằng người dùng\nvận hành chương trình một cách chính xác.

6413
06:10:46,850 --> 06:10:53,060
Vì vậy tôi có thể gửi cho họ một thông báo lỗi\n

6414
06:10:53,061 --> 06:10:55,441
Nhưng bây giờ tôi muốn thoát\n ra khỏi chương trình.

6415
06:10:56,570 --> 06:11:01,521
Cách đúng đắn, trích dẫn-bỏ trích dẫn, để làm\n

6416
06:11:01,521 --> 06:11:04,851
Bây giờ thì hơi lạ\nvì chưa có ai gọi là main

6417
06:11:04,850 --> 06:11:07,251
đúng rồi, main sẽ được gọi tự động\n

6418
06:11:07,251 --> 06:11:09,561
nhưng quy ước là\bất cứ lúc nào có chuyện gì xảy ra

6419
06:11:09,561 --> 06:11:14,361
sai trong một chương trình, bạn nên\ntrả về giá trị khác 0 từ main.

6420
06:11:16,041 --> 06:11:19,730
Chúng ta không cần phải đi sâu vào\n

6421
06:11:20,480 --> 06:11:26,030
Nhưng nếu bạn trả về 1, đó là manh mối\n

6422
06:11:26,030 --> 06:11:27,690
thiết bị có gì đó không ổn.

6423
06:11:29,931 --> 06:11:35,721
Nếu mọi thứ đều ổn thì hãy bắt đầu\n

6424
06:11:35,721 --> 06:11:40,881
trước đó, trích dẫn dấu ngoặc argv 1.

6425
06:11:40,881 --> 06:11:43,341
Vì vậy đây chỉ là một phiên bản của\nchương trình mà không có phiên bản nào khác.

6426
06:11:43,341 --> 06:11:45,651
Vì vậy, về cơ bản, điều này cũng giống như vậy

6427
06:11:45,651 --> 06:11:47,841
một cái khác ở đây giống như tôi đã làm trước đó.

6428
06:11:47,841 --> 06:11:51,001
Tôi muốn ra hiệu cho\nmáy tính rằng mọi việc đều ổn.

6429
06:11:52,550 --> 06:11:55,911
Nhưng nói đúng ra, nếu\ntôi đã quay lại đây rồi

6430
06:11:55,911 --> 06:11:58,820
Về mặt kỹ thuật thì tôi không cần, nếu\ntôi thực sự muốn kén chọn

6431
06:11:58,820 --> 06:12:01,131
Về mặt kỹ thuật, tôi không cần điều đó vì cách duy nhất

6432
06:12:01,131 --> 06:12:05,747
Tôi sẽ chuyển sang dòng 11\nis nếu tôi chưa quay lại.

6433
06:12:07,440 --> 06:12:10,790
Điều mới duy nhất ở đây về mặt logic,\n

6434
06:12:10,791 --> 06:12:13,070
Tôi đang trả về một giá trị từ main.

6435
06:12:13,070 --> 06:12:14,990
Đó là điều tôi\nluôn có thể làm

6436
06:12:14,991 --> 06:12:19,551
bởi vì main luôn được xác định bởi\n

6437
06:12:19,550 --> 06:12:24,140
Theo mặc định, chính tự động,\n

6438
06:12:24,140 --> 06:12:27,111
Nếu bạn chưa bao giờ sử dụng từ khóa\nreturn thì có lẽ bạn

6439
06:12:27,111 --> 06:12:29,631
không có trong main, nó chỉ\ntự động trả về 0

6440
06:12:29,631 --> 06:12:31,556
và hệ thống giả định\nrằng mọi việc đều diễn ra tốt đẹp.

6441
06:12:31,556 --> 06:12:33,651
Nhưng bây giờ chúng ta đang bắt đầu\ncó được nhiều hơn một chút

6442
06:12:33,651 --> 06:12:35,781
phức tạp với\ncode của chúng tôi và bạn biết đấy

6443
06:12:35,780 --> 06:12:39,740
lập trình viên, đã xảy ra chuyện gì đó\n

6444
06:12:39,741 --> 06:12:44,871
Bạn có thể thoát khỏi chúng bằng cách quay lại\n

6445
06:12:44,870 --> 06:12:47,300
Và thật trùng hợp\nnó là int, phải không?

6446
06:12:49,370 --> 06:12:53,510
Thật không may, trong lập trình, có\n

6447
06:12:54,501 --> 06:12:57,471
Và int cung cấp cho bạn 4\n tỷ mã có thể

6448
06:12:57,471 --> 06:13:00,716
mà bạn có thể sử dụng, hay còn gọi là thoát\ntrạng thái, để biểu thị lỗi.

6449
06:13:00,716 --> 06:13:04,190
Vì vậy, nếu bạn đã từng sử dụng máy Mac\cũng như PC của mình thì sẽ thấy một số cửa sổ bật lên kỳ lạ

6450
06:13:04,190 --> 06:13:07,580
đôi khi đã xảy ra lỗi,\n

6451
06:13:07,580 --> 06:13:09,680
Có thể nó tích cực,\ncó thể nó tiêu cực.

6452
06:13:09,681 --> 06:13:14,431
Nó có thể báo mã lỗi 123 hoặc\n

6453
06:13:14,431 --> 06:13:18,570
Những gì bạn thường thấy là\n

6454
06:13:18,570 --> 06:13:21,870
các giá trị từ main trong một chương trình\nmà ai đó ở Microsoft

6455
06:13:21,870 --> 06:13:25,380
hoặc Apple hoặc nơi nào khác\nđã viết, đã xảy ra lỗi

6456
06:13:25,381 --> 06:13:30,241
họ đang hiển thị cho bạn một cách không cần thiết,\n

6457
06:13:30,241 --> 06:13:33,361
Giá như, để khi bạn gọi\n

6458
06:13:33,361 --> 06:13:36,451
bạn có thể cho họ biết trạng thái thoát\nmà bạn gặp phải

6459
06:13:36,451 --> 06:13:39,331
bạn gặp phải mã lỗi gì.

6460
06:13:39,330 --> 06:13:43,650
Được rồi, mọi câu hỏi\không thoát trạng thái

6461
06:13:43,651 --> 06:13:48,841
Hiện tại, khối xây dựng\nmới cuối cùng của chúng ta là khối nào?

6462
06:13:50,300 --> 06:13:57,800
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] Bạn biết cách\n

6463
06:13:57,800 --> 06:13:59,679
nếu bạn muốn tạo [KHÔNG NGHE ĐƯỢC]

6464
06:14:00,346 --> 06:14:03,526
Câu hỏi đặt ra là bạn có thể làm đi làm lại mọi việc không

6465
06:14:03,526 --> 06:14:06,151
tại dòng lệnh giống như bạn\ncó thể lấy chuỗi và lấy int.

6466
06:14:06,151 --> 06:14:08,131
Theo mặc định,\nrecall sẽ tự động

6467
06:14:08,131 --> 06:14:10,681
được thiết kế để liên tục nhắc nhở\nngười dùng trong vòng lặp của riêng họ

6468
06:14:10,681 --> 06:14:14,221
cho đến khi họ cung cấp cho bạn một int hoặc một\n

6469
06:14:15,001 --> 06:14:16,471
Bạn sẽ nhận được\nthông báo lỗi nhưng sau đó

6470
06:14:16,471 --> 06:14:18,263
bạn sẽ được\ntrả lại lời nhắc của mình.

6471
06:14:18,262 --> 06:14:21,647
Và việc gõ\nit chính xác vào lần tiếp theo là tùy thuộc vào bạn.

6472
06:14:22,730 --> 06:14:27,695
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC]\ntự động dành cho bạn.

6473
06:14:27,695 --> 06:14:29,570
DAVID Malan: Nếu bạn\nkhông trả về một giá trị

6474
06:14:29,570 --> 06:14:32,990
rõ ràng main will\ntự động trả về 0 cho bạn

6475
06:14:32,991 --> 06:14:36,901
đó là cách C hoạt động đơn giản\nnên nó không thực sự cần thiết.

6476
06:14:36,901 --> 06:14:39,771
Nhưng bây giờ chúng ta đang bắt đầu\ntrả về các giá trị một cách rõ ràng

6477
06:14:39,771 --> 06:14:42,351
nếu có sự cố xảy ra,\nit sẽ là cách tốt

6478
06:14:42,350 --> 06:14:45,740
cũng bắt đầu trả về một giá trị\n

6479
06:14:48,036 --> 06:14:52,070
Vì vậy, bây giờ chúng ta hãy thoát khỏi\ncỏ dại và bối cảnh hóa

6480
06:14:52,070 --> 06:14:55,460
cái này dành cho một số vấn đề thực tế\n

6481
06:14:55,460 --> 06:14:57,390
bằng các bài toán tập 2 trở lên.

6482
06:15:00,001 --> 06:15:04,251
Ví dụ ở đây là một\nvấn đề mà bạn có thể nghĩ lại

6483
06:15:04,251 --> 06:15:08,241
đến khi bạn còn là một đứa trẻ\n

6484
06:15:08,241 --> 06:15:10,491
cấp lớp mà\nmột số cuốn sách được viết.

6485
06:15:10,491 --> 06:15:14,001
Nếu bạn là học sinh nhỏ tuổi, bạn\ncó thể đọc ở cấp lớp một

6486
06:15:14,001 --> 06:15:15,501
hoặc cấp ba ở Mỹ.

6487
06:15:15,501 --> 06:15:17,293
Hoặc, nếu bạn đang học đại học\ncó lẽ bạn đang

6488
06:15:17,293 --> 06:15:19,206
đọc văn bản ở cấp độ đại học.

6489
06:15:19,205 --> 06:15:22,333
Nhưng nó có ý nghĩa gì\nđối với văn bản, như trong một cuốn sách

6490
06:15:22,333 --> 06:15:24,501
hoặc trong một bài luận, hoặc thứ gì đó\ntương tự như vậy để tương ứng

6491
06:15:24,501 --> 06:15:25,850
đến một cấp lớp nào đó?

6492
06:15:25,850 --> 06:15:29,210
Chà, đây là một câu trích dẫn--\ntiêu đề của một cuốn sách thời thơ ấu.

6493
06:15:29,210 --> 06:15:31,850
Một con cá, hai con cá, cá đỏ, cá xanh.

6494
06:15:31,850 --> 06:15:35,100
Cấp lớp có thể dùng để làm gì\n

6495
06:15:35,100 --> 06:15:37,850
Có lẽ, khi bạn còn nhỏ hoặc nếu\n

6496
06:15:37,850 --> 06:15:40,520
những thứ này,\ncấp độ của thứ này có thể là bao nhiêu?

6497
06:15:47,643 --> 06:15:49,911
DAVID Malan: Trước lớp\n1, trên thực tế là đúng.

6498
06:15:49,911 --> 06:15:51,550
Vậy cái đó thực sự dành cho trẻ nhỏ à?

6499
06:15:53,440 --> 06:15:56,470
Đây là những cụm từ khá đơn giản phải không?

6500
06:15:57,760 --> 06:16:00,220
Ý tôi là thậm chí không có\nđộng từ trong những câu này

6501
06:16:00,221 --> 06:16:04,301
chúng chỉ là những danh từ và tính từ,\nvà những câu rất ngắn.

6502
06:16:04,300 --> 06:16:06,460
Và đó có thể là một\kinh nghiệm mà chúng ta có thể sử dụng.

6503
06:16:06,460 --> 06:16:09,070
Khi phân tích văn bản, nếu\ncác từ hơi ngắn

6504
06:16:09,070 --> 06:16:11,501
các câu khá\nngắn gọn, mọi thứ đều rất đơn giản

6505
06:16:11,501 --> 06:16:14,510
đó có lẽ là một cấp lớp rất\nyoung hoặc sớm.

6506
06:16:14,510 --> 06:16:17,925
Và do đó, bằng một công thức, nó có thể\n

6507
06:16:19,931 --> 06:16:22,282
Ông bà Dursley, ở số 4, Privet Drive

6508
06:16:22,282 --> 06:16:25,240
tự hào nói rằng họ đã\n

6509
06:16:25,241 --> 06:16:27,221
Họ là\nnhững người cuối cùng bạn mong đợi

6510
06:16:27,221 --> 06:16:29,381
có liên quan đến bất cứ điều gì\nlạ lùng hoặc bí ẩn

6511
06:16:29,381 --> 06:16:32,111
bởi vì họ không chấp nhận được những điều vô nghĩa đó.

6512
06:16:33,043 --> 06:16:34,751
Được rồi, cuốn sách này cấp lớp mấy?

6513
06:16:36,039 --> 06:16:37,331
DAVID Malan: Được rồi, tôi nghe thứ ba.

6514
06:16:38,846 --> 06:16:40,241
DAVID Malan: Thứ bảy, thứ năm.

6515
06:16:41,411 --> 06:16:44,800
Nhưng lớp 7 thì không theo thước đo cụ thể nào.

6516
06:16:44,800 --> 06:16:49,062
Và liệu chúng ta có thể tranh luận chính xác hay không\n

6517
06:16:49,062 --> 06:16:51,520
và có thể bạn đang cảm thấy đi trước\nthời đại của mình hoặc đang bị tụt lại phía sau.

6518
06:16:51,521 --> 06:16:55,730
Nhưng ở đây, chúng tôi có một đoạn văn bản.

6519
06:16:55,730 --> 06:17:00,820
Điều gì khiến văn bản này trở nên cũ hơn\n

6520
06:17:00,820 --> 06:17:03,951
một cấp lớp cao hơn, bạn có nghĩ vậy không?

6521
06:17:06,675 --> 06:17:09,370
DAVID Malan: Vâng, nó dài hơn,\ncác loại từ khác nhau

6522
06:17:09,370 --> 06:17:11,773
bây giờ có dấu phẩy trong\ncụm từ, v.v.

6523
06:17:11,774 --> 06:17:13,941
Vì vậy, điều này chỉ có một chút\nsự phức tạp nào đó.

6524
06:17:13,940 --> 06:17:16,540
Hóa ra tập hợp vấn đề sắp tới\nắp tới

6525
06:17:16,541 --> 06:17:19,631
trong số những việc bạn sẽ làm là\nlấy những văn bản như thế này làm đầu vào

6526
06:17:20,771 --> 06:17:23,333
Xét xem có bao nhiêu\ntừ trong văn bản?

6527
06:17:23,332 --> 06:17:24,790
Có bao nhiêu câu trong văn bản?

6528
06:17:24,791 --> 06:17:26,636
Có bao nhiêu chữ cái trong văn bản?

6529
06:17:26,635 --> 06:17:30,430
Và sử dụng chúng theo một\n

6530
06:17:30,431 --> 06:17:33,940
chính xác là cấp lớp của một số người\n

6531
06:17:34,843 --> 06:17:37,050
Chà, chúng ta sẽ\nlàm gì nữa trong những ngày tới?

6532
06:17:37,050 --> 06:17:39,670
Chà, trước đây tôi đã từng ám chỉ đến khái niệm\nvề mật mã này.

6533
06:17:39,670 --> 06:17:42,610
Khái niệm xáo trộn\nthông tin theo cách như vậy

6534
06:17:42,611 --> 06:17:45,683
rằng bạn có thể ẩn\nnội dung của tin nhắn

6535
06:17:45,683 --> 06:17:47,890
từ một người nào đó có thể\nsẽ chặn nó, phải không?

6536
06:17:47,890 --> 06:17:50,390
Hình thức sớm nhất của điều này\ncũng có thể là khi bạn còn trẻ

6537
06:17:50,390 --> 06:17:53,650
và bạn đang ở trong lớp, và bạn đã đậu\n

6538
06:17:53,651 --> 06:17:54,911
từ chính bạn đến người khác.

6539
06:17:54,911 --> 06:17:57,221
Bạn không nhất thiết muốn\nviết ghi chú bằng tiếng Anh

6540
06:17:57,221 --> 06:17:59,381
hoặc một số ngôn ngữ viết,\nkhác mà bạn có thể muốn

6541
06:17:59,381 --> 06:18:01,691
để xáo trộn nó bằng cách nào đó hoặc mã hóa nó.

6542
06:18:01,690 --> 06:18:04,720
Có thể bạn thay đổi As\n thành B và B thành C.

6543
06:18:04,721 --> 06:18:07,031
Vì vậy, nếu giáo viên chộp lấy và chặn nó

6544
06:18:07,030 --> 06:18:09,460
họ thực sự không thể\nhiểu được bạn đang làm gì

6545
06:18:09,460 --> 06:18:11,420
được viết vì nó được mã hóa.

6546
06:18:11,420 --> 06:18:13,870
Miễn là bạn của bạn,\nngười nhận được ghi chú này

6547
06:18:13,870 --> 06:18:16,150
biết bạn đã thao túng nó như thế nào.

6548
06:18:16,151 --> 06:18:19,901
Cách bạn cộng hoặc trừ\ncác chữ cái với nhau

6549
06:18:19,901 --> 06:18:23,111
họ có thể giải mã nó, điều này sẽ đảo ngược quá trình đó.

6550
06:18:23,111 --> 06:18:26,331
Vì vậy, về mặt hình thức, trong thế giới\nmật mã và khoa học máy tính

6551
06:18:26,330 --> 06:18:28,390
đây là một vấn đề khác cần giải quyết.

6552
06:18:28,390 --> 06:18:31,434
Tuy nhiên, thông tin đầu vào của bạn khi bạn có\n

6553
06:18:31,434 --> 06:18:33,101
là những gì thường được gọi là văn bản thuần túy.

6554
06:18:33,100 --> 06:18:37,240
Có một thuật toán nào đó\nsẽ mã hóa hoặc mã hóa

6555
06:18:37,241 --> 06:18:40,361
thông tin đó vào cái\nđược gọi là văn bản mật mã, cái mà

6556
06:18:40,361 --> 06:18:42,911
là phiên bản được mã hóa\nvề mặt lý thuyết có thể lấy được một cách an toàn

6557
06:18:42,911 --> 06:18:45,370
đã chặn và tin nhắn của bạn\nha không bị hỏng

6558
06:18:45,370 --> 06:18:48,880
trừ khi việc chặn đó\thực sự biết thuật toán nào

6559
06:18:48,881 --> 06:18:51,411
bạn đã sử dụng bên trong quá trình này.

6560
06:18:51,411 --> 06:18:53,980
Vì vậy, nó thường được\ngọi là mật mã.

6561
06:18:53,980 --> 06:18:57,341
Tuy nhiên, mật mã thường lấy không phải một mà là hai đầu vào.

6562
06:18:57,341 --> 06:19:01,945
Ví dụ: nếu mật mã của bạn\nis đơn giản như A trở thành B

6563
06:19:01,945 --> 06:19:05,681
B trở thành C, C trở thành D,\ndot dot dot, Z trở thành A

6564
06:19:05,681 --> 06:19:09,401
về cơ bản bạn đang thêm một chữ cái vào\nmỗi chữ cái và mã hóa nó.

6565
06:19:09,401 --> 06:19:12,011
Bây giờ đó sẽ là,\ncái mà chúng tôi gọi là chìa khóa.

6566
06:19:12,010 --> 06:19:15,730
Cả bạn và người nhận đều phải\n

6567
06:19:15,730 --> 06:19:19,541
trước, ngày hôm đó bạn sẽ dùng số nào để xoay

6568
06:19:19,541 --> 06:19:21,221
hoặc thay đổi tất cả các chữ cái này bằng cách.

6569
06:19:21,221 --> 06:19:24,671
Bởi vì khi bạn thêm 1, họ sẽ nhận được bản mã của bạn

6570
06:19:24,670 --> 06:19:27,350
phải trừ 1\n mới có đáp án.

6571
06:19:27,350 --> 06:19:31,990
Ví dụ: nếu dữ liệu đầu vào\nplaintext là hi, như trước

6572
06:19:31,991 --> 06:19:37,271
và khóa là 1, bản mã sử dụng\n

6573
06:19:37,271 --> 06:19:41,980
còn được gọi là mật mã Caesar,\n

6574
06:19:41,980 --> 06:19:45,668
Vì vậy, nó tương tự nhau, nhưng ít nhất thoạt nhìn nó đã bị xáo trộn.

6575
06:19:45,669 --> 06:19:47,711
Và trừ khi giáo viên\nthực sự quan tâm tìm hiểu

6576
06:19:47,710 --> 06:19:50,681
hôm nay họ đang sử dụng thuật toán nào,\n

6577
06:19:50,681 --> 06:19:53,960
nó có thể đủ\nan toàn cho mục đích của bạn.

6578
06:19:53,960 --> 06:19:55,420
Làm thế nào để bạn đảo ngược quá trình?

6579
06:19:55,420 --> 06:19:58,450
Chà, bạn của bạn hiểu được điều này\nvà đảo ngược nó bằng âm 1.

6580
06:19:58,451 --> 06:20:02,890
Vậy tôi trở thành H, J trở thành I,\nvà những thứ như dấu câu

6581
06:20:02,890 --> 06:20:05,320
ít nhất vẫn được giữ nguyên\ntrong sơ đồ này.

6582
06:20:05,320 --> 06:20:07,841
Vì vậy hãy xem xét một\nví dụ cuối cùng ở đây.

6583
06:20:07,841 --> 06:20:15,341
Nếu đầu vào của thuật toán\nis Uijtxbtdt50 và khóa

6584
06:20:17,350 --> 06:20:23,770
Như vậy bây giờ B sẽ trở thành A, và C\n

6585
06:20:23,771 --> 06:20:25,390
Vì vậy chúng ta đang đi theo hướng khác.

6586
06:20:27,291 --> 06:20:30,261
Chà, nếu chúng ta trải rộng tất cả các chữ cái\n

6587
06:20:30,260 --> 06:20:36,040
và chúng ta bắt đầu trừ một chữ cái,\n

6588
06:20:36,041 --> 06:20:41,480
T trở thành S, X trở thành W, A, was, D, T--

6589
06:22:01,705 --> 06:22:06,530
DAVID J. Malan: Đây là CS50, và\nđây đã là tuần thứ ba rồi.

6590
06:22:06,530 --> 06:22:10,056
Và ngay cả khi chúng tôi đã nhận được nhiều hơn thế\n

6591
06:22:10,056 --> 06:22:11,931
và một số nội dung C\nmà chúng tôi đang làm

6592
06:22:11,931 --> 06:22:15,201
trông càng khó hiểu hơn,\n

6593
06:22:15,201 --> 06:22:19,008
kiểu như mọi thứ chúng ta đang làm\n

6594
06:22:19,008 --> 06:22:20,841
Vì vậy, hãy ghi nhớ điều đó,\nđặc biệt là những thứ

6595
06:22:20,841 --> 06:22:23,591
có vẻ như họ đang nhận được nhiều hơn\n

6596
06:22:23,591 --> 06:22:26,210
Cuối cùng, đó chỉ là một quá trình học\na ngôn ngữ mới

6597
06:22:26,210 --> 06:22:28,791
hãy để chúng tôi thể hiện quá trình này.

6598
06:22:28,791 --> 06:22:31,851
Và tất nhiên, tuần trước chúng tôi thực sự\n

6599
06:22:31,850 --> 06:22:33,600
đầu vào và đầu ra được thể hiện.

6600
06:22:33,600 --> 06:22:37,940
Và thứ này ở đây, một bức ảnh\ncủa nó, được gọi là gì?

6601
06:22:39,989 --> 06:22:41,031
DAVID J. Malan: RAM, tôi nghe nói--

6602
06:22:41,030 --> 06:22:44,030
Bộ nhớ truy cập ngẫu nhiên hay\nthường được gọi là bộ nhớ.

6603
06:22:44,030 --> 06:22:46,640
Và nhớ lại rằng chúng tôi đã xem xét\không có con chip đen nhỏ nào

6604
06:22:46,640 --> 06:22:48,861
chứa tất cả các byte--

6605
06:22:48,861 --> 06:22:50,151
cuối cùng là tất cả các bit.

6606
06:22:50,151 --> 06:22:52,761
Nó chỉ là một loại lưới,\nloại lưới nghệ sĩ,

6607
06:22:52,760 --> 06:22:55,880
cho phép chúng ta nghĩ về mọi\không có vị trí bộ nhớ nào trong số này

6608
06:22:55,881 --> 06:22:58,401
có thể nói như chỉ cần có một số hoặc địa chỉ.

6609
06:22:58,401 --> 06:23:01,131
Giống như, đây có thể là byte\nsố 0 rồi 1 rồi 2

6610
06:23:01,131 --> 06:23:04,041
và sau đó, có lẽ ở phía dưới\nmột lần nữa, khoảng 2 tỷ

6611
06:23:04,041 --> 06:23:06,441
nếu bạn có 2 gigabyte bộ nhớ.

6612
06:23:06,440 --> 06:23:10,431
Và khi chúng tôi làm điều đó, chúng tôi bắt đầu\n

6613
06:23:10,431 --> 06:23:14,120
để tạo ra loại thông tin của riêng chúng ta,\n

6614
06:23:14,120 --> 06:23:16,740
chỉ những điều cơ bản như ints\nand float, v.v.

6615
06:23:16,741 --> 06:23:18,831
Nhưng chúng tôi cũng đã nói về dây.

6616
06:23:18,830 --> 06:23:21,440
Và chuỗi như bạn đã biết hiện nay là gì?

6617
06:23:21,440 --> 06:23:24,560
Bạn sẽ mô tả chuỗi theo thuật ngữ của\nlayperson như thế nào?

6618
06:23:26,841 --> 06:23:28,258
DAVID J. Malan: Một mảng ký tự.

6619
06:23:28,258 --> 06:23:30,051
Và trong khi đó, một mảng--\nhãy đến đó.

6620
06:23:30,050 --> 06:23:34,940
Làm sao người khác có thể định nghĩa một\n

6621
06:23:38,030 --> 06:23:41,431
ĐỐI TƯỢNG: Kiểu như\nan tập hợp các thứ được lập chỉ mục.

6622
06:23:41,431 --> 06:23:43,421
DAVID J. Malan: Một tập hợp các thứ được lập chỉ mục-- không tệ.

6623
06:23:43,420 --> 06:23:46,570
Và tôi nghĩ một đặc điểm quan trọng của\n

6624
06:23:46,570 --> 06:23:48,251
thực sự liên quan đến bộ nhớ.

6625
06:23:50,170 --> 06:23:53,560
Từng byte nối tiếp byte\nis tạo thành một mảng.

6626
06:23:53,561 --> 06:23:56,171
Và trong vài\ntuần nữa chúng ta sẽ thấy rằng thực sự có

6627
06:23:56,170 --> 06:24:00,130
những cách thú vị hơn để sử dụng tính năng này\n

6628
06:24:00,131 --> 06:24:03,601
những thứ có hai hướng\n

6629
06:24:04,100 --> 06:24:07,330
Nhưng hiện tại, tất cả những gì chúng ta đã nói đến\n

6630
06:24:07,330 --> 06:24:11,600
từ trái sang phải, từ trên xuống dưới,\n

6631
06:24:11,600 --> 06:24:14,260
Vì vậy hôm nay chúng ta sẽ xem xét vẫn là một mảng.

6632
06:24:14,260 --> 06:24:17,380
Nhưng chúng tôi sẽ không tập trung nhiều vào việc đại diện

6633
06:24:17,381 --> 06:24:18,820
của chuỗi hoặc các kiểu dữ liệu khác.

6634
06:24:18,820 --> 06:24:21,278
Thực ra bây giờ chúng ta sẽ tập trung vào\nphần còn lại của quá trình đó

6635
06:24:21,278 --> 06:24:24,310
đầu vào trở thành đầu ra,\ncụ thể là thứ ở giữa--

6636
06:24:25,300 --> 06:24:29,560
Nhưng chúng ta phải ghi nhớ, mặc dù\n

6637
06:24:29,561 --> 06:24:32,971
cho đến nay, chắc chắn có mặt trên bảng\n

6638
06:24:32,971 --> 06:24:34,721
có sự sang trọng của\nloại nhãn cầu

6639
06:24:34,721 --> 06:24:38,181
toàn bộ sự việc với cái nhìn bao quát\n

6640
06:24:38,681 --> 06:24:40,513
Nếu tôi hỏi bạn một\nmột số cụ thể ở đâu

6641
06:24:40,513 --> 06:24:43,510
giống như số không, rất có thể mắt bạn\nsẽ nhìn thẳng vào vị trí của nó

6642
06:24:43,510 --> 06:24:46,510
và bùm, vấn đề đã được giải quyết\nchỉ trong một bước.

6643
06:24:46,510 --> 06:24:51,620
Nhưng điều hấp dẫn là, với một chiếc máy tính\n

6644
06:24:51,620 --> 06:24:55,091
con người có thể [KHÔNG NGHE ĐƯỢC] nhìn thấy\n

6645
06:24:55,091 --> 06:24:58,451
Tốt hơn hết là hãy nghĩ đến\n của bạn

6646
06:24:58,451 --> 06:25:01,361
hay cụ thể hơn là một\mảng bộ nhớ như thế này

6647
06:25:01,361 --> 06:25:05,861
thực sự là một tập hợp khép kín\n

6648
06:25:05,861 --> 06:25:08,620
Và chỉ bằng cách mở\nmỗi cánh cửa đó mới có thể

6649
06:25:08,620 --> 06:25:10,451
máy tính thực sự\nthấy những gì trong đó

6650
06:25:10,451 --> 06:25:12,971
điều đó có nghĩa là\nmáy tính, không giống bạn, không

6651
06:25:12,971 --> 06:25:16,841
có cái nhìn bao quát về tất cả\n

6652
06:25:16,841 --> 06:25:19,760
Nó còn phải nhiều hơn nữa\nxem ở đây một cách có hệ thống

6653
06:25:19,760 --> 06:25:23,950
có thể nhìn vào đây, có thể nhìn vào đây, và\n

6654
06:25:23,951 --> 06:25:28,031
Bây giờ may mắn thay, chúng tôi đã có một số\n

6655
06:25:28,030 --> 06:25:29,570
Các biểu thức Boolean và những thứ tương tự--

6656
06:25:29,570 --> 06:25:31,480
nơi bạn có thể tưởng tượng\nviết mã nào đó

6657
06:25:31,480 --> 06:25:36,041
nó đi rất có phương pháp từ bên trái\n

6658
06:25:36,041 --> 06:25:39,851
thực ra còn phức tạp hơn\n

6659
06:25:39,850 --> 06:25:43,210
Và hãy nhớ rằng\ncác quy ước chúng ta đã có kể từ tuần trước

6660
06:25:43,210 --> 06:25:47,681
có thể nói bây giờ những mảng này\nkhông được lập chỉ mục.

6661
06:25:47,681 --> 06:25:52,511
Để được lập chỉ mục bằng 0 chỉ có nghĩa là\n

6662
06:25:52,510 --> 06:25:56,290
Vậy đây là vị trí 0, 1, 2, 3, 4, 5, 6.

6663
06:25:56,291 --> 06:25:59,681
Và hãy chú ý rằng\có tổng cộng bảy cánh cửa ở đây

6664
06:25:59,681 --> 06:26:02,291
số ngoài cùng bên phải\no tất nhiên được gọi là 6

6665
06:26:02,291 --> 06:26:04,300
chỉ vì chúng ta\nbắt đầu đếm từ 0.

6666
06:26:04,300 --> 06:26:09,041
Vì vậy, trong trường hợp tổng quát, nếu bạn có n cửa hoặc n byte bộ nhớ

6667
06:26:09,041 --> 06:26:13,841
0 sẽ luôn ở bên trái và n\n

6668
06:26:13,841 --> 06:26:18,221
Đó là một sự khái quát hóa\n

6669
06:26:18,221 --> 06:26:22,151
Được rồi, hãy xem lại vấn đề\n

6670
06:26:22,151 --> 06:26:24,884
với tuần thứ 0, đó là\nkhái niệm tìm kiếm.

6671
06:26:24,883 --> 06:26:26,800
Và việc tìm kiếm thứ gì đó có nghĩa là gì?

6672
06:26:26,800 --> 06:26:29,578
Vâng, để tìm thông tin-- và\nđiều này, tất nhiên, có mặt khắp nơi.

6673
06:26:29,579 --> 06:26:32,621
Bất cứ khi nào bạn lấy điện thoại ra, bạn\n

6674
06:26:32,620 --> 06:26:35,501
Bất cứ khi nào bạn mở trình duyệt lên,\n

6675
06:26:35,501 --> 06:26:39,670
Vì vậy, tìm kiếm là một trong những\n

6676
06:26:41,238 --> 06:26:44,320
Vì vậy, hãy xem xét cách Google,\n

6677
06:26:44,320 --> 06:26:48,021
đang thực hiện điều gì đó\ncó vẻ quen thuộc như thế này.

6678
06:26:48,021 --> 06:26:50,381
Vì vậy, đây có thể là tuyên bố vấn đề.

6679
06:26:50,381 --> 06:26:52,811
Chúng tôi muốn một số đầu vào\ntrở thành một số đầu ra.

6680
06:26:52,811 --> 06:26:54,161
Đầu vào đó sẽ là gì?

6681
06:26:54,161 --> 06:26:57,881
Có lẽ đó là một loạt những cánh cửa đóng kín\n

6682
06:26:57,881 --> 06:27:00,611
để nhận lại câu trả lời, đúng hay sai.

6683
06:27:00,611 --> 06:27:03,146
Có thứ gì chúng ta\nđang tìm kiếm ở đó hay không?

6684
06:27:03,146 --> 06:27:05,771
Bạn có thể tưởng tượng việc tiến thêm một\nbước này và cố gắng tìm

6685
06:27:05,771 --> 06:27:07,881
thứ bạn đang tìm kiếm ở đâu

6686
06:27:07,881 --> 06:27:10,300
Nhưng hiện tại, chúng ta hãy giải quyết\nmột vấn đề.

6687
06:27:10,300 --> 06:27:14,920
Chúng ta có thể tự nói với mình, đúng hay\nsai, là một con số nào đó đằng sau một

6688
06:27:14,920 --> 06:27:17,751
về những cánh cửa hay tủ khóa này trong ký ức?

6689
06:27:17,751 --> 06:27:22,120
Nhưng trước khi chúng ta tới đó và bắt đầu\n

6690
06:27:22,940 --> 06:27:27,040
Hãy xem xét cách chúng ta có thể\nđặt nền móng cho, như

6691
06:27:27,041 --> 06:27:30,469
so sánh liệu một thuật toán\nis có tốt hơn thuật toán khác hay không.

6692
06:27:30,469 --> 06:27:32,261
Chúng ta đã nói về\nsự đúng đắn và nó gần như là

6693
06:27:32,260 --> 06:27:35,800
không cần phải nói rằng bất kỳ mã nào bạn\n

6694
06:27:36,820 --> 06:27:39,701
Nếu không thì có ích gì nếu nó\n

6695
06:27:39,701 --> 06:27:41,620
Nhưng chúng tôi cũng đã nói về thiết kế.

6696
06:27:41,620 --> 06:27:45,640
Và theo cách nói của bạn, chúng ta\n phải làm gì

6697
06:27:45,640 --> 06:27:48,830
được thiết kế ở giai đoạn này hơn giai đoạn khác?

6698
06:27:48,830 --> 06:27:52,240
Bây giờ bạn nghĩ thế nào về\nkhái niệm thiết kế này?

6699
06:27:53,411 --> 06:27:55,661
ĐỐI TƯỢNG: Dễ hiểu hơn\cũng không dễ học hơn.

6700
06:27:55,661 --> 06:27:57,350
DAVID J. Malan: Được rồi, như vậy dễ hiểu hơn.

6701
06:28:00,341 --> 06:28:03,173
DAVID J. Malan: Hiệu quả và việc gì\n

6702
06:28:07,190 --> 06:28:09,751
Nó không sử dụng quá nhiều\nbộ nhớ và cũng không dư thừa.

6703
06:28:09,751 --> 06:28:11,480
Vì vậy, bạn có thể nghĩ về\nthiết kế theo một số

6704
06:28:11,480 --> 06:28:13,438
của các trục này-- đại loại\nchất lượng của mã

6705
06:28:13,438 --> 06:28:15,630
mà còn cả chất lượng biểu diễn.

6706
06:28:15,631 --> 06:28:20,179
Và khi các chương trình của chúng tôi ngày càng lớn hơn và\n

6707
06:28:20,179 --> 06:28:22,221
những thứ đó\nthực sự sẽ quan trọng.

6708
06:28:22,221 --> 06:28:24,221
Và trong thế giới thực,\nnếu bạn bắt đầu viết mã

6709
06:28:24,221 --> 06:28:26,991
không chỉ một mình mà còn với\nngười khác, nhận thiết kế

6710
06:28:26,991 --> 06:28:30,501
đúng là sẽ khiến mọi việc dễ dàng hơn\n

6711
06:28:30,501 --> 06:28:33,030
viết mã với\nxác suất cao hơn.

6712
06:28:33,030 --> 06:28:36,650
Vì vậy hãy xem xét cách chúng ta có thể tập trung\n

6713
06:28:36,651 --> 06:28:38,751
hiệu quả của một thuật toán.

6714
06:28:38,751 --> 06:28:42,591
Và cách chúng ta có thể nói về\n

6715
06:28:42,591 --> 06:28:45,710
hoặc tốc độ của chúng phụ thuộc vào thời gian chạy của chúng.

6716
06:28:45,710 --> 06:28:49,260
Điều đó có nghĩa là, khi họ\n

6717
06:28:49,260 --> 06:28:52,370
Và chúng tôi có thể đo giá trị này bằng\ngiây hoặc mili giây hoặc phút

6718
06:28:52,370 --> 06:28:54,710
hoặc chỉ một số\nbước trong trường hợp chung

6719
06:28:54,710 --> 06:28:58,920
bởi vì có lẽ sẽ có ít bước hơn để\n

6720
06:28:58,920 --> 06:29:00,770
Vậy chúng ta có thể nghĩ\nvề thời gian chạy như thế nào?

6721
06:29:00,771 --> 06:29:03,831
Chà, hôm nay có một\nnotation chung mà chúng ta nên định nghĩa.

6722
06:29:03,830 --> 06:29:07,970
Vì vậy các nhà khoa học máy tính có xu hướng mô tả\n

6723
06:29:07,971 --> 06:29:12,201
hoặc một đoạn mã, trong trường hợp đó, trong\n

6724
06:29:12,201 --> 06:29:14,991
Đây thực sự là một chữ O\nviết hoa, một chữ O lớn.

6725
06:29:14,991 --> 06:29:18,471
Và điều này thường có nghĩa là\nthời gian chạy của một số thuật toán

6726
06:29:18,471 --> 06:29:21,920
theo thứ tự như vậy,\n

6727
06:29:21,919 --> 06:29:24,529
sẽ chỉ là một công thức toán học rất\nđơn giản.

6728
06:29:24,529 --> 06:29:26,810
Đó là một cách vẫy tay\nmột cách toán học

6729
06:29:26,811 --> 06:29:31,131
để truyền đạt ý tưởng về tốc độ\n

6730
06:29:31,131 --> 06:29:32,961
mà không vướng vào\nnhững thứ tương tự, nó

6731
06:29:32,960 --> 06:29:36,690
mất nhiều mili giây hoặc\n

6732
06:29:36,690 --> 06:29:40,640
Vì vậy, bạn có thể nhớ lại từ tuần\n

6733
06:29:41,721 --> 06:29:45,021
Vào thời điểm đó, chúng tôi chỉ sử dụng điều này để\n

6734
06:29:45,021 --> 06:29:47,960
Hãy nhớ rằng đường thẳng\nmàu đỏ này là thuật toán đầu tiên

6735
06:29:49,280 --> 06:29:54,230
Đường màu vàng vẫn còn\n

6736
06:29:54,230 --> 06:29:58,730
Dòng đó thể hiện thuật toán\nngoài nào?

6737
06:29:59,730 --> 06:30:00,980
Thuật toán thứ hai đó là gì?

6738
06:30:01,791 --> 06:30:03,291
ĐỐI TƯỢNG: Giống như, hai trang cùng một lúc.

6739
06:30:03,291 --> 06:30:06,441
DAVID J. Malan: Hai trang cùng một lúc,\n

6740
06:30:06,440 --> 06:30:09,700
có khả năng quay lại một trang gấp đôi nếu có thể\n

6741
06:30:10,201 --> 06:30:12,733
Vì vậy, nó có thể có một lỗi\nnhưng có thể giải quyết được.

6742
06:30:12,733 --> 06:30:15,440
Tuy nhiên, thuật toán cuối cùng này là\n

6743
06:30:15,440 --> 06:30:18,950
chiến lược mà tôi không cần thiết\n

6744
06:30:18,951 --> 06:30:20,960
rồi làm đôi và\nrồi làm đôi,

6745
06:30:20,960 --> 06:30:25,251
kịch tính đến mức không cần thiết,\n

6746
06:30:25,251 --> 06:30:27,780
giải quyết được\nvấn đề-- khoảng 500 trang

6747
06:30:27,780 --> 06:30:33,720
lần đầu tiên, 250 khác, lần khác\n

6748
06:30:33,721 --> 06:30:36,944
Vì vậy chúng tôi đã mô tả\nthời gian chạy của nó như bức ảnh này

6749
06:30:36,943 --> 06:30:39,861
ở đó, mặc dù tôi không dùng nó\n

6750
06:30:39,861 --> 06:30:42,591
Nhưng quả thật, thời gian để giải quyết\ncó thể chỉ được đo lường

6751
06:30:42,591 --> 06:30:44,510
một cách trừu tượng trong một số đơn vị đo lường--

6752
06:30:44,510 --> 06:30:47,780
giây, mili giây, phút, trang--

6753
06:30:49,471 --> 06:30:52,191
Vì vậy bây giờ chúng ta hãy đưa ra một số con số về điều này.

6754
06:30:52,190 --> 06:30:55,610
Nếu chúng ta có n trang trong\ndanh bạ điện thoại đó thì n chỉ thể hiện

6755
06:30:55,611 --> 06:30:57,980
một số chung,\nthuật toán đầu tiên ở đây

6756
06:30:57,980 --> 06:30:59,811
chúng ta có thể mô tả là thực hiện n bước.

6757
06:30:59,811 --> 06:31:03,230
Thuật toán thứ hai chúng ta có thể mô tả\n

6758
06:31:03,230 --> 06:31:05,870
có thể cho hoặc nhận một nếu chúng ta phải quay lại nhưng nhìn chung

6759
06:31:06,843 --> 06:31:09,050
Và điều này, nếu bạn\nnhớ logarit của mình

6760
06:31:09,050 --> 06:31:11,008
về cơ bản là một công thức\nkhác biệt--

6761
06:31:11,008 --> 06:31:14,460
log cơ số 2 của n hoặc viết tắt là\nlog của n.

6762
06:31:14,460 --> 06:31:17,150
Vậy đây là một công thức\nkhác nhau về cơ bản.

6763
06:31:17,151 --> 06:31:20,791
Nhưng điều đáng chú ý là\nhai thuật toán đầu tiên này

6764
06:31:20,791 --> 06:31:24,411
mặc dù, vâng, thuật toán\thứ hai được thực hiện nhanh hơn--

6765
06:31:24,411 --> 06:31:26,271
Ý tôi là, nhanh gấp đôi--

6766
06:31:26,271 --> 06:31:30,921
khi bạn bắt đầu thu nhỏ và nếu\n

6767
06:31:30,920 --> 06:31:36,920
hai cái đầu tiên này bắt đầu trông giống nhau một cách khủng khiếp.

6768
06:31:36,920 --> 06:31:39,170
Và nếu chúng ta tiếp tục thu nhỏ\nvà thu nhỏ và thu nhỏ

6769
06:31:39,170 --> 06:31:41,450
out khi n trở nên thực sự lớn--

6770
06:31:41,451 --> 06:31:43,581
nghĩa là, trục x trở nên rất dài--

6771
06:31:43,580 --> 06:31:47,610
hai thuật toán đầu tiên này về cơ bản bắt đầu giống nhau.

6772
06:31:47,611 --> 06:31:50,751
Và đây là lúc các nhà khoa học\máy tính sử dụng ký hiệu O lớn.

6773
06:31:50,751 --> 06:31:54,780
Thay vì nói cụ thể,\nthuật toán này thực hiện bất kỳ bước nào.

6774
06:31:54,780 --> 06:31:57,980
Và cái này n chia cho 2,\nnhà khoa học máy tính sẽ nói

6775
06:31:57,980 --> 06:32:01,370
ờ, mỗi thuật toán đó\nthực hiện theo thứ tự n bước

6776
06:32:01,370 --> 06:32:03,380
hoặc theo thứ tự n trên 2.

6777
06:32:04,131 --> 06:32:07,851
Theo thứ tự n trên 2\nis khá giống nhau

6778
06:32:07,850 --> 06:32:13,980
khi n trở nên thực sự lớn\n

6779
06:32:13,980 --> 06:32:18,841
Vì vậy, trong thực tế, rõ ràng\n

6780
06:32:18,841 --> 06:32:22,311
Nhưng trong bức tranh lớn, khi n\ntrở thành một triệu, một tỷ

6781
06:32:22,311 --> 06:32:24,980
những con số đã\nquá lớn vào thời điểm đó

6782
06:32:24,980 --> 06:32:28,041
rằng đây là những\nhình dạng của những đường cong này ngụ ý

6783
06:32:28,041 --> 06:32:30,291
khá nhiều chức năng tương đương.

6784
06:32:30,291 --> 06:32:33,441
Nhưng cái này\ncó vẻ ngày càng đẹp hơn

6785
06:32:33,440 --> 06:32:36,830
khi n trở nên lớn vì nó\ntăng chậm hơn nhiều.

6786
06:32:36,830 --> 06:32:39,020
Và ở đây, một nhà khoa học\máy tính sẽ nói

6787
06:32:39,021 --> 06:32:43,679
rằng thuật toán thứ ba đó nằm trên\n

6788
06:32:43,679 --> 06:32:45,471
Và họ không cần phải bận tâm đến phần đế

6789
06:32:45,471 --> 06:32:49,341
bởi vì nó là một phép toán nhỏ hơn\n

6790
06:32:49,341 --> 06:32:52,251
một hệ số nhân, không đổi.

6791
06:32:52,251 --> 06:32:54,201
Vậy tóm lại,\nnhững điểm cần rút ra ở đây là gì?

6792
06:32:54,201 --> 06:32:56,631
Đây chỉ là một\ntừ vựng mới mà chúng ta sẽ bắt đầu

6793
06:32:56,631 --> 06:33:00,381
để sử dụng khi chúng ta chỉ muốn mô tả\n

6794
06:33:00,381 --> 06:33:02,961
Để làm cho điều này trở nên thực tế hơn, nếu\nbất kỳ ai trong số các bạn đã triển khai

6795
06:33:02,960 --> 06:33:08,650
một vòng lặp for tại thời điểm này trong bất kỳ\n nào của bạn

6796
06:33:08,651 --> 06:33:11,951
nơi có thể là chiều cao\n của kim tự tháp của bạn hoặc có thể n

6797
06:33:11,951 --> 06:33:15,911
có điều gì khác mà bạn muốn\n làm n lần, bạn đã viết mã

6798
06:33:15,911 --> 06:33:20,800
hoặc bạn đã triển khai một thuật toán\n

6799
06:33:21,561 --> 06:33:23,711
Vì vậy bây giờ đây chỉ là một cách\nđể bắt đầu lại

6800
06:33:23,710 --> 06:33:27,850
mô tả bằng một chút ký hiệu toán học những gì chúng tôi đã

6801
06:33:27,850 --> 06:33:30,140
đã được thực hiện trong một thời gian bây giờ.

6802
06:33:30,140 --> 06:33:35,861
Đây là danh sách thường thấy\n

6803
06:33:35,861 --> 06:33:39,370
Đây không phải là danh sách đầy đủ\nvì bạn có thể đưa ra

6804
06:33:39,370 --> 06:33:42,070
chắc chắn là với vô số\ncông thức toán học.

6805
06:33:42,070 --> 06:33:45,760
Nhưng những vấn đề phổ biến chúng ta sẽ thảo luận\n

6806
06:33:45,760 --> 06:33:48,430
có lẽ giảm xuống danh sách này ở đây.

6807
06:33:48,431 --> 06:33:50,681
Và nếu bạn học\nthêm lý thuyết khoa học máy tính

6808
06:33:50,681 --> 06:33:52,263
danh sách này sẽ ngày càng dài hơn.

6809
06:33:52,263 --> 06:33:56,290
Nhưng hiện tại, đây là những thứ\n

6810
06:33:56,291 --> 06:33:59,061
Được rồi, hai từ\ntừ vựng khác, nếu bạn muốn

6811
06:33:59,061 --> 06:34:00,521
trước khi chúng ta bắt đầu sử dụng thứ này--

6812
06:34:00,521 --> 06:34:03,791
vậy đây, một omega lớn,\nbiểu tượng omega viết hoa

6813
06:34:03,791 --> 06:34:09,531
bây giờ được sử dụng để mô tả giới hạn dưới\n

6814
06:34:09,530 --> 06:34:12,970
Vì vậy, để rõ ràng, chữ O lớn\không phải là thứ tự của-- đó

6815
06:34:12,971 --> 06:34:16,271
là, giới hạn trên-- về số\nbước mà thuật toán có thể thực hiện

6816
06:34:16,271 --> 06:34:19,061
thực hiện, theo thứ tự của rất nhiều bước.

6817
06:34:19,061 --> 06:34:21,941
Tuy nhiên, nếu bạn muốn nói chuyện,\ntừ góc độ khác, thì

6818
06:34:21,940 --> 06:34:24,070
thuật toán của tôi thực hiện bao nhiêu bước?

6819
06:34:24,070 --> 06:34:26,681
Có lẽ trong cái gọi là\ntrường hợp tốt nhất, điều đó sẽ tốt đẹp

6820
06:34:26,681 --> 06:34:29,471
nếu chúng ta có một ký hiệu để\nchỉ mô tả mức thấp hơn

6821
06:34:29,471 --> 06:34:32,201
bị ràng buộc là vì một số\thuật toán có thể cực nhanh

6822
06:34:32,201 --> 06:34:34,251
trong những trường hợp được gọi là tốt nhất này.

6823
06:34:34,251 --> 06:34:38,021
Vì vậy, hệ thống ký hiệu gần như\ngiống nhau, nhưng chúng tôi thay thế chữ O lớn

6824
06:34:39,140 --> 06:34:42,940
Vì vậy, để rõ ràng, big O mô tả\nan giới hạn trên và omega

6825
06:34:44,471 --> 06:34:46,901
Và chúng ta sẽ sớm thấy các ví dụ\nvề điều này.

6826
06:34:46,901 --> 06:34:52,781
Và cuối cùng, cái cuối cùng ở đây, lớn\n

6827
06:34:52,780 --> 06:34:57,220
khi bạn gặp trường hợp cả hai\n

6828
06:34:57,221 --> 06:35:00,251
thời gian chạy\ngiống với giới hạn dưới.

6829
06:35:00,251 --> 06:35:03,940
Sau đó, bạn có thể mô tả nó trong một hơi thở\n

6830
06:35:03,940 --> 06:35:08,021
thay vì nói nó nằm ở O\nand lớn ở omega của cái gì khác.

6831
06:35:08,021 --> 06:35:12,280
Được rồi, ngoài ngữ cảnh, hãy sắp xếp\n

6832
06:35:12,280 --> 06:35:15,824
nhưng tất cả những gì họ đề cập đến là giới hạn trên, giới hạn dưới hoặc khi

6833
06:35:15,824 --> 06:35:17,241
chúng tình cờ là một.

6834
06:35:17,241 --> 06:35:20,801
Và bây giờ chúng tôi sẽ giới thiệu theo thời gian\n

6835
06:35:20,800 --> 06:35:23,350
áp dụng chúng vào những vấn đề cụ thể.

6836
06:35:23,350 --> 06:35:27,580
Nhưng trước tiên, hãy để tôi tạm dừng\nxem có câu hỏi nào không.

6837
06:35:43,920 --> 06:35:45,880
DAVID J. Malan: Các chức năng nhỏ hơn sẽ di chuyển nhanh hơn.

6838
06:35:45,881 --> 06:35:50,621
Vì vậy, có, nếu bạn có thứ gì đó\nnhư n, việc đó chỉ cần thực hiện các bước.

6839
06:35:50,620 --> 06:35:53,626
Nếu bạn có một công thức như n\n

6840
06:35:53,626 --> 06:35:56,260
thực hiện nhiều bước hơn\nvà do đó sẽ chậm hơn.

6841
06:35:56,260 --> 06:35:58,170
Vì vậy,\nbiểu thức toán học càng lớn

6842
06:35:58,170 --> 06:36:02,640
thuật toán của bạn càng chậm là do\n

6843
06:36:05,161 --> 06:36:07,530
ĐỐI TƯỢNG: Vì vậy, bạn muốn chức năng\nn của mình nhỏ?

6844
06:36:07,530 --> 06:36:10,771
DAVID J. Malan: Bạn muốn chức năng n của mình,\n

6845
06:36:10,771 --> 06:36:12,581
Và trên thực tế, có thể nói là Chén Thánh\n

6846
06:36:12,580 --> 06:36:16,050
đây cũng sẽ là cái cuối cùng ở đây\n

6847
06:36:16,050 --> 06:36:19,260
khi một thuật toán theo\nthứ tự một bước.

6848
06:36:19,260 --> 06:36:23,730
Điều đó có nghĩa là nó thực sự cần một hằng số\n

6849
06:36:23,730 --> 06:36:26,850
100 bước nhưng số bước cố định\nkhông đổi.

6850
06:36:26,850 --> 06:36:30,480
Đó là điều tốt nhất vì ngay cả\na danh bạ điện thoại cũng ngày càng lớn hơn

6851
06:36:30,480 --> 06:36:34,710
ngay cả khi tập dữ liệu bạn\nđang tìm kiếm ngày càng lớn hơn

6852
06:36:34,710 --> 06:36:37,861
nếu việc gì đó chỉ thực hiện một số\nsố bước hữu hạn liên tục

6853
06:36:37,861 --> 06:36:42,001
thì việc tập dữ liệu thực sự lớn đến mức nào không quan trọng.

6854
06:36:42,001 --> 06:36:46,201
Các câu hỏi về các ký hiệu này--\n

6855
06:36:46,201 --> 06:36:47,671
Điều này thực sự rất hữu ích.

6856
06:36:47,670 --> 06:36:49,530
Tôi đang nhìn thấy chỉ theo hướng này?

6857
06:36:52,587 --> 06:36:54,920
DAVID J. Malan: Đầu vào\ncủa mỗi chức năng này là gì?

6858
06:36:54,920 --> 06:36:58,070
Nó là biểu hiện của\ncác bước mà thuật toán thực hiện.

6859
06:36:58,070 --> 06:37:00,440
Vì vậy, trên thực tế, hãy để tôi tiếp tục và thực hiện điều này

6860
06:37:00,440 --> 06:37:03,580
cụ thể hơn bằng một\nví dụ thực tế ở đây nếu có thể.

6861
06:37:03,580 --> 06:37:06,710
Vì vậy, trên sân khấu ở đây, chúng tôi có\nsbảy tủ đựng đồ tượng trưng cho

6862
06:37:06,710 --> 06:37:08,661
nếu bạn muốn, một mảng bộ nhớ.

6863
06:37:08,661 --> 06:37:10,760
Và mảng\nbộ nhớ này có thể đang lưu trữ

6864
06:37:10,760 --> 06:37:14,510
bảy số nguyên, bảy số nguyên\n

6865
06:37:14,510 --> 06:37:17,450
Và nếu chúng ta muốn tìm kiếm\nnhững giá trị này, làm cách nào

6866
06:37:18,408 --> 06:37:20,617
Chà, vì điều này, tại sao\nchúng ta không làm cho mọi thứ trở nên thú vị hơn?

6867
06:37:20,617 --> 06:37:22,170
Tình nguyện viên có muốn lên không?

6868
06:37:22,170 --> 06:37:25,280
Phải đeo mặt nạ và truy cập\ninternet nếu bạn cảm thấy thoải mái.

6869
06:37:25,280 --> 06:37:28,550
Cả hai-- ồ, có ai đó đang đặt\n

6870
06:37:34,741 --> 06:37:37,441
Và chỉ trong chốc lát,\ntình nguyện viên dũng cảm của chúng tôi

6871
06:37:37,440 --> 06:37:41,431
sẽ giúp tôi tìm\nmột số cụ thể trong tập dữ liệu

6872
06:37:41,431 --> 06:37:42,881
mà chúng ta có ở đây trên màn hình.

6873
06:37:42,881 --> 06:37:46,591
Vậy hãy xuống đây và tôi sẽ lấy đồ\n

6874
06:37:55,890 --> 06:37:57,473
DAVID J. Malan: [? Nomira. ?] Rất vui được gặp.

6875
06:37:58,061 --> 06:38:02,011
Vì vậy, ở đây chúng ta có cho Nomira bảy\nlockers hoặc một mảng bộ nhớ.

6876
06:38:02,010 --> 06:38:03,900
Và đằng sau mỗi cánh cửa\nnày là một con số.

6877
06:38:03,901 --> 06:38:06,930
Và mục tiêu, khá đơn giản,\nis, với mảng bộ nhớ này

6878
06:38:06,930 --> 06:38:12,041
làm đầu vào, để trả về, đúng hay sai, là\n

6879
06:38:12,041 --> 06:38:14,611
Vì vậy, giả sử tôi quan tâm đến số 0.

6880
06:38:14,611 --> 06:38:18,091
Đâu là thuật toán đơn giản nhất,\nchính xác nhất mà bạn có thể

6881
06:38:18,091 --> 06:38:22,561
áp dụng để tìm cho chúng tôi số 0?

6882
06:38:22,561 --> 06:38:25,969
Được rồi, hãy thử mở cái đầu tiên.

6883
06:38:25,969 --> 06:38:28,511
Được rồi, và có lẽ chỉ cần bước\nsang một bên để khán giả có thể nhìn thấy.

6884
06:38:28,510 --> 06:38:30,520
Tôi nghĩ bạn vẫn chưa tìm thấy số 0.

6885
06:38:31,841 --> 06:38:34,480
Hãy chuyển sang lựa chọn tiếp theo của bạn.

6886
06:38:36,359 --> 06:38:37,901
DAVID J. Malan: Ồ, tiếp tục đi, cánh cửa thứ hai.

6887
06:38:38,776 --> 06:38:41,918
Hãy di chuyển từ trái sang\nphải, để tìm kiếm đường đi của chúng ta.

6888
06:38:48,561 --> 06:38:51,591
Được rồi, cũng chưa hoạt động\ntốt lắm, nhưng không sao.

6889
06:38:51,591 --> 06:38:55,971
Nếu bạn muốn chuyển sang phần\ntiếp theo, chúng tôi vẫn đang tìm số 0.

6890
06:38:57,291 --> 06:38:58,863
Được rồi, nó vẫn chưa tốt lắm.

6891
06:39:04,460 --> 06:39:10,230
Không, đó là-- được rồi, làm rất tốt.

6892
06:39:13,390 --> 06:39:16,690
Được rồi, vì vậy tôi đã thiết lập cho bạn\nmột thuật toán khá chậm

6893
06:39:16,690 --> 06:39:18,911
nhưng hãy để tôi yêu cầu bạn\nmô tả nó là gì

6894
06:39:18,911 --> 06:39:21,895
bạn đã làm theo\ncác bước tôi đưa cho bạn.

6895
06:39:21,895 --> 06:39:24,021
ĐỐI TƯỢNG: Tôi chỉ đi từng chữ một cho mỗi nhân vật.

6896
06:39:24,021 --> 06:39:26,021
DAVID J. Malan: Anh đã đọc từng chữ một cho mỗi ký tự

6897
06:39:26,021 --> 06:39:27,741
nếu bạn muốn nói chuyện ở đây.

6898
06:39:27,741 --> 06:39:29,501
Vậy là bạn đã đi từng chữ\n từng ký tự.

6899
06:39:29,501 --> 06:39:32,980
Và bạn cho rằng thuật toán\ntrái hay phải là đúng?

6900
06:39:35,320 --> 06:39:37,361
KHÁN GIẢ: Hoặc, vâng, trong kịch bản.

6901
06:39:37,361 --> 06:39:38,861
DAVID J. Malan: Được rồi, đúng vậy trong tình huống này.

6902
06:39:39,881 --> 06:39:40,421
Điều gì đang diễn ra trong tâm trí bạn?

6903
06:39:40,420 --> 06:39:42,460
KHÁN GIẢ: Bởi vì đó\nkhông phải là cách hiệu quả nhất để làm điều đó.

6904
06:39:43,341 --> 06:39:45,971
Vì vậy, chúng tôi thấy ở đây có sự tương phản\ngiữa tính đúng đắn và thiết kế.

6905
06:39:45,971 --> 06:39:48,721
Ý tôi là, tôi nghĩ nó đúng\n

6906
06:39:50,320 --> 06:39:52,850
Nhưng phải mất một số bước.

6907
06:39:52,850 --> 06:39:54,640
Vì vậy, trên thực tế, đây sẽ là một thuật toán.

6908
06:39:54,640 --> 06:39:56,710
Nó có tên là tìm kiếm tuyến tính.

6909
06:39:56,710 --> 06:39:59,201
Và, [? Nomira, ?] như bạn\ndid, bạn gần như đã đi theo

6910
06:39:59,201 --> 06:40:01,096
một đường đi từ trái sang phải.

6911
06:40:01,721 --> 06:40:04,241
Nếu bạn đi từ phải\nsang trái, liệu thuật toán có

6912
06:40:04,241 --> 06:40:07,391
về cơ bản đã tốt hơn?

6913
06:40:08,140 --> 06:40:09,245
DAVID J. Malan: Được rồi, và tại sao?

6914
06:40:09,245 --> 06:40:11,620
ĐỐI TƯỢNG: Bởi vì số 0 nằm\ntrong kịch bản đầu tiên.

6915
06:40:11,620 --> 06:40:15,220
Nhưng nếu nó như thế thì số 0 nằm ở\n

6916
06:40:15,221 --> 06:40:19,381
DAVID J. Malan: Vâng, và đây là\n

6917
06:40:19,381 --> 06:40:20,631
trở nên ít rõ ràng hơn một chút.

6918
06:40:20,631 --> 06:40:23,068
Chắc chắn bạn sẽ có được kết quả tốt hơn

6919
06:40:23,067 --> 06:40:25,150
nếu bạn tình cờ\nbắt đầu từ bên phải

6920
06:40:25,151 --> 06:40:27,141
hoặc nếu tôi đã chỉ cho bạn\nbắt đầu từ đó.

6921
06:40:27,140 --> 06:40:30,268
Nhưng vấn đề là nếu tôi yêu cầu cô ấy\n

6922
06:40:30,268 --> 06:40:31,600
chà, điều đó sẽ phản tác dụng.

6923
06:40:31,600 --> 06:40:33,308
Và lần này\nsẽ mất nhiều thời gian hơn

6924
06:40:33,309 --> 06:40:35,811
để tìm số đó vì\nit ở đây.

6925
06:40:35,811 --> 06:40:40,331
Và như vậy trong trường hợp chung, đi\n

6926
06:40:40,330 --> 06:40:43,900
có lẽ là chính xác nhất có thể\n

6927
06:40:43,901 --> 06:40:47,878
về thứ tự của những con số này-- và\n

6928
06:40:47,878 --> 06:40:49,960
Một số trong số chúng nhỏ hơn,\nmột số trong số chúng lớn hơn.

6929
06:40:49,960 --> 06:40:51,668
Dường như không có vần điệu hay lý do nào cả.

6930
06:40:51,669 --> 06:40:55,691
Tìm kiếm tuyến tính cũng tốt như bạn\n

6931
06:40:55,690 --> 06:40:57,414
tiên nghiệm về các con số.

6932
06:40:57,414 --> 06:41:00,081
Vậy là tôi có một món quà cảm ơn nhỏ\nở đây, một quả bóng giảm căng thẳng CS.

6933
06:41:00,080 --> 06:41:03,040
Một tràng pháo tay dành cho tình nguyện viên đầu tiên.

6934
06:41:08,030 --> 06:41:12,050
Hãy thử hình thức hóa những gì tôi\nvừa mô tả là tìm kiếm tuyến tính

6935
06:41:12,050 --> 06:41:15,298
bởi vì quả thật vậy, dù thế nào\nend [? Nomira ?] đã bắt đầu

6936
06:41:15,298 --> 06:41:17,091
Lẽ ra tôi đã có thể thay đổi được vấn đề

6937
06:41:17,091 --> 06:41:19,431
để đảm bảo rằng nó\ncó vẻ chạy chậm.

6938
06:41:20,451 --> 06:41:23,631
Nếu số 0 nằm trong số những cánh cửa đó,\n

6939
06:41:24,620 --> 06:41:30,230
Vậy bây giờ chúng ta hãy thử dịch những gì\n

6940
06:41:30,230 --> 06:41:32,570
mã giả kể từ tuần thứ 0.

6941
06:41:32,570 --> 06:41:35,091
Vì vậy, với mã giả, chúng ta\nchỉ cần một tiếng Anh ngắn gọn

6942
06:41:35,091 --> 06:41:38,131
như hoặc bất kỳ ngôn ngữ nào, cú pháp\nđể mô tả những gì chúng tôi đã làm.

6943
06:41:38,131 --> 06:41:40,640
Vậy đây có thể là một công thức\ncủa [? Nomira ?] đã làm.

6944
06:41:40,640 --> 06:41:45,050
Đối với mỗi cửa, từ trái sang phải,\n

6945
06:41:46,640 --> 06:41:51,990
Ngược lại, ở cuối chương trình,\n

6946
06:41:53,161 --> 06:41:55,161
Và đến cánh cửa thứ bảy,\n[? Nomira ?] quả thực đã có

6947
06:41:55,161 --> 06:41:58,791
trả về giá trị đúng bằng cách nói,\nà, có số không.

6948
06:41:58,791 --> 06:42:01,431
Nhưng hãy xem xét liệu mã\ngiả này bây giờ có đúng không

6949
06:42:02,510 --> 06:42:06,720
Trước hết, thông thường, khi chúng ta\n

6950
06:42:06,721 --> 06:42:10,461
Và ở đây, return\nfalse được căn chỉnh với for.

6951
06:42:10,460 --> 06:42:14,060
Tại sao tôi không thụt lề câu trả về\nfalse hoặc nói cách khác

6952
06:42:14,061 --> 06:42:21,141
tại sao tôi không làm nếu số ở phía sau\n

6953
06:42:21,140 --> 06:42:24,216
Tại sao phiên bản\ncode này lại có vấn đề?

6954
06:42:34,681 --> 06:42:37,050
DAVID J. Malan: Được rồi, tôi không chắc đó là vì sự dư thừa.

6955
06:42:37,050 --> 06:42:39,361
Hãy để tôi tiếp tục và\nlàm rõ điều này.

6956
06:42:39,361 --> 06:42:42,870
Thay vào đó, nếu tôi đã làm\nse trả về sai, tôi

6957
06:42:42,870 --> 06:42:47,302
đừng nghĩ rằng có quá nhiều sự dư thừa\nđến mức tôi phải lo lắng.

6958
06:42:47,302 --> 06:42:48,510
Hãy để tôi nhảy đi nơi khác.

6959
06:42:49,170 --> 06:42:52,710
ĐỐI TƯỢNG: Ừm, có thể\n[KHÔNG NGHE ĐƯỢC] cho toàn bộ danh sách

6960
06:42:52,710 --> 06:42:54,091
chỉ sau khi kiểm tra một số.

6961
06:42:54,091 --> 06:42:56,280
DAVID J. Malan: Vâng, nó sẽ quay trở lại vì--

6962
06:42:56,280 --> 06:42:58,155
mặc dù tôi chỉ\nnhìn vào-- [? Nomira?]

6963
06:42:58,155 --> 06:42:59,460
chỉ nhìn vào một yếu tố.

6964
06:42:59,460 --> 06:43:02,503
Và nó sẽ như thể\n

6965
06:43:02,503 --> 06:43:05,971
cô ấy mở cái này ra và nói, không,\n

6966
06:43:05,971 --> 06:43:09,069
Điều đó sẽ cho tôi một kết quả\nkhông chính xác vì rõ ràng

6967
06:43:09,068 --> 06:43:11,611
ở giai đoạn đó của thuật toán,\ncô ấy thậm chí sẽ không nhìn

6968
06:43:11,611 --> 06:43:13,081
qua bất kỳ cánh cửa nào khác.

6969
06:43:13,080 --> 06:43:16,870
Vì vậy, chỉ là vết lõm ban đầu\ncủa cái này, nếu bạn muốn

6970
06:43:16,870 --> 06:43:19,560
không có [? nếu không thì ?]\nis đúng vì chỉ

6971
06:43:19,561 --> 06:43:23,311
nếu tôi tìm hiểu đến tận cùng\thuật toán này hoặc mã giả sẽ làm được

6972
06:43:23,311 --> 06:43:26,101
thật hợp lý khi kết luận\ntại thời điểm đó, khi cô ấy

6973
06:43:26,100 --> 06:43:29,580
đã đi qua tất cả các cánh cửa,\nkhông, thực tế là--

6974
06:43:29,580 --> 06:43:32,911
con số tôi đang tìm\nthực tế là không có ở đó.

6975
06:43:32,911 --> 06:43:37,151
Vậy bây giờ chúng ta có thể xem xét\nthời gian chạy của thuật toán này như thế nào?

6976
06:43:37,151 --> 06:43:40,291
Hiện tại chúng tôi có một số\nloại từ vựng khác nhau.

6977
06:43:40,291 --> 06:43:43,441
Và nếu bây giờ chúng ta xem xét cách\nchúng ta có thể nghĩ về điều này như thế nào

6978
06:43:43,440 --> 06:43:46,980
hãy bắt đầu dịch nó từ\n

6979
06:43:46,980 --> 06:43:48,780
đến một cái gì đó ở mức độ thấp hơn một chút.

6980
06:43:48,780 --> 06:43:52,181
Chúng tôi đã viết mã bằng cách sử dụng\nn, vòng lặp và những thứ tương tự.

6981
06:43:52,181 --> 06:43:56,701
Vì vậy, hãy lấy mã\nseudo cấp cao hơn này và bây giờ chỉ là loại

6982
06:43:56,701 --> 06:43:59,251
có được điểm trung gian\ngiữa tiếng Anh và C.

6983
06:43:59,251 --> 06:44:03,271
Hãy để tôi đề nghị chúng ta suy nghĩ về\n

6984
06:44:03,271 --> 06:44:05,041
như có tính mô phạm hơn một chút.

6985
06:44:05,041 --> 06:44:13,181
Với i từ 0 đến n trừ 1, nếu số\n

6986
06:44:13,181 --> 06:44:15,881
Ngược lại, ở cuối\nchương trình, trả về sai.

6987
06:44:15,881 --> 06:44:17,881
Bây giờ tôi đang pha trộn\ntiếng Anh và tiếng C ở đây

6988
06:44:17,881 --> 06:44:20,311
nhưng điều đó hợp lý nếu\nngười đọc quen thuộc với C

6989
06:44:21,901 --> 06:44:23,891
Và chú ý mô hình này ở đây.

6990
06:44:23,890 --> 06:44:29,010
Đây là một cách nói giả\n

6991
06:44:29,010 --> 06:44:33,720
Bắt đầu từ 0 rồi\nđếm đến n trừ 1.

6992
06:44:33,721 --> 06:44:37,771
Và nhớ lại n trừ 1 không phải là một\nshy ở cuối mảng.

6993
06:44:37,771 --> 06:44:40,530
N trừ 1 là kết thúc\nmảng vì một lần nữa, chúng ta

6994
06:44:41,940 --> 06:44:45,240
Vì vậy đây là cách\nrất phổ biến để thể hiện loại vòng lặp này

6995
06:44:45,241 --> 06:44:48,271
từ bên trái đến hết\nbên phải của một mảng.

6996
06:44:48,271 --> 06:44:51,570
Doors tôi ngầm hiểu là tên của mảng này

6997
06:44:51,570 --> 06:44:54,361
giống như đó là một biến từ\ntuần trước mà tôi đã xác định là

6998
06:44:54,361 --> 06:44:56,140
một mảng các số nguyên trong trường hợp này.

6999
06:44:56,140 --> 06:45:01,050
Vậy khung cửa i có nghĩa là\nkhi tôi bằng 0, đó là vị trí này.

7000
06:45:02,580 --> 06:45:06,150
Khi tôi 7 tuổi hoặc, nói chung là n trừ--

7001
06:45:06,151 --> 06:45:10,631
xin lỗi, 6 hoặc, tổng quát hơn, n\n

7002
06:45:10,631 --> 06:45:13,061
Ý tưởng tương tự nhưng là bản dịch của nó.

7003
06:45:13,061 --> 06:45:17,281
Vì vậy bây giờ chúng ta hãy xem xét\n

7004
06:45:17,280 --> 06:45:20,370
Nếu chúng ta có menu\ncâu trả lời có thể có cho câu hỏi này

7005
06:45:20,370 --> 06:45:23,290
thuật toán này hiệu quả hay kém hiệu quả như thế nào

7006
06:45:23,291 --> 06:45:26,011
chúng ta hãy xem\nbối cảnh của mã giả này.

7007
06:45:26,010 --> 06:45:28,860
Chúng ta thậm chí không cần phải bận tâm\nđến tận C.

7008
06:45:28,861 --> 06:45:32,081
Làm cách nào để chúng tôi phân tích\nmỗi bước trong số này?

7009
06:45:33,960 --> 06:45:39,900
Vòng lặp ngoài cùng này dành cho tôi từ\n

7010
06:45:39,901 --> 06:45:42,151
sẽ thực hiện bao nhiêu lần?

7011
06:45:42,151 --> 06:45:45,781
Vòng lặp đó sẽ thực hiện bao nhiêu lần?

7012
06:45:45,780 --> 06:45:48,900
Hãy để tôi cho mọi người giây phút này để suy nghĩ về điều đó.

7013
06:45:48,901 --> 06:45:51,691
Nó\nsẽ lặp lại ở đây bao nhiêu lần?

7014
06:45:54,721 --> 06:45:55,890
DAVID J. Malan: n lần, phải không?

7015
06:45:55,890 --> 06:45:58,080
Vì nó từ 0 đến n trừ 1.

7016
06:45:58,080 --> 06:46:00,690
Và nếu việc nghĩ từ 0 đến n trừ 1 có vẻ hơi kì lạ

7017
06:46:00,690 --> 06:46:04,192
về cơ bản nó giống\nvề mặt toán học từ 1 đến n.

7018
06:46:04,192 --> 06:46:06,150
Và điều đó có lẽ\nrõ ràng hơn một chút

7019
06:46:08,050 --> 06:46:12,541
Vì vậy, tôi có thể ghi chú cho chính mình\n

7020
06:46:12,541 --> 06:46:14,131
Còn những bước bên trong này thì sao?

7021
06:46:14,131 --> 06:46:17,521
Vâng, cần bao nhiêu bước hoặc bao nhiêu giây\nđể đặt một câu hỏi?

7022
06:46:19,651 --> 06:46:23,101
nếu số bạn đang tìm\n nằm ở sau dấu ngoặc cửa i

7023
06:46:23,100 --> 06:46:25,931
à, như [? Nomira ?] đã làm,\nđó giống như một bước.

7024
06:46:25,931 --> 06:46:27,181
Vì vậy, bạn mở cửa và bùng nổ.

7025
06:46:27,181 --> 06:46:30,460
Được rồi, có thể là hai bước,\n

7026
06:46:30,460 --> 06:46:32,681
Vì vậy đây là một số\nsố bước không đổi.

7027
06:46:32,681 --> 06:46:34,440
Hãy gọi nó là một cho đơn giản.

7028
06:46:34,440 --> 06:46:37,860
Mất bao nhiêu bước hoặc giây\nđể trả về giá trị đúng?

7029
06:46:37,861 --> 06:46:40,224
Tôi không biết chính xác trong\nbộ nhớ của máy tính

7030
06:46:40,223 --> 06:46:41,640
nhưng điều đó giống như một bước duy nhất.

7031
06:46:43,300 --> 06:46:46,320
Vì vậy, nếu thao tác này thực hiện một\nbước, thao tác này thực hiện một bước

7032
06:46:46,320 --> 06:46:49,320
nhưng chỉ khi điều kiện\nis đúng thì có vẻ như

7033
06:46:49,320 --> 06:46:53,730
giống như bạn đang làm một\nsố việc liên tục n lần.

7034
06:46:53,730 --> 06:46:56,890
Hoặc có thể bạn đang\không thực hiện thêm bước nào.

7035
06:46:56,890 --> 06:46:59,370
Tóm lại, điều duy nhất\nthực sự quan trọng ở đây

7036
06:46:59,370 --> 06:47:02,580
về mặt hiệu quả hoặc\nhiệu quả của thuật toán

7037
06:47:02,580 --> 06:47:05,855
bạn đang làm đi làm lại điều gì\n

7038
06:47:05,855 --> 06:47:07,230
thứ sẽ cộng lại.

7039
06:47:07,230 --> 06:47:10,440
Làm một hoặc hai việc\na với số lần không đổi?

7040
06:47:11,370 --> 06:47:16,411
Nhưng vòng lặp, số tiền đó sẽ cộng lại\n

7041
06:47:16,411 --> 06:47:19,780
n sẽ càng lớn và\n

7042
06:47:19,780 --> 06:47:22,681
đó là tất cả những gì cần nói nếu bạn\n mô tả một cách đại khái

7043
06:47:22,681 --> 06:47:27,480
thuật toán này thực hiện bao nhiêu bước trong ký hiệu O lớn

7044
06:47:27,480 --> 06:47:30,420
bản năng của bạn có thể nói gì?

7045
06:47:30,420 --> 06:47:35,710
Thuật toán này có bao nhiêu bước trên\n

7046
06:47:40,471 --> 06:47:42,581
Và quả thực, điều đó sẽ xảy ra ở đây.

7047
06:47:42,811 --> 06:47:44,894
Bởi vì về cơ bản,\na là vào cuối ngày

7048
06:47:44,894 --> 06:47:48,352
thực hiện n việc như giới hạn trên\n trong thời gian chạy.

7049
06:47:48,352 --> 06:47:50,310
Và trên thực tế, đó\chính xác là những gì đã xảy ra

7050
06:47:50,311 --> 06:47:52,861
với [? Nomira. ?] Cô ấy đã phải nhìn vào tất cả n tủ đựng đồ

7051
06:47:52,861 --> 06:47:55,811
trước khi nhận được\ncâu trả lời đúng.

7052
06:47:55,811 --> 06:47:58,831
Nhưng điều gì sẽ xảy ra nếu cô ấy\nmay mắn và con số chúng tôi

7053
06:47:58,830 --> 06:48:01,740
đang tìm kiếm không\na ở cuối mảng

7054
06:48:01,741 --> 06:48:04,441
nhưng ở đầu mảng?

7055
06:48:04,440 --> 06:48:06,010
Làm thế nào chúng ta có thể nghĩ về điều đó?

7056
06:48:06,010 --> 06:48:09,480
Chà, hãy có một danh pháp cho việc này\n

7057
06:48:09,480 --> 06:48:12,091
Hãy nhớ rằng, ký hiệu omega\là giới hạn dưới.

7058
06:48:12,091 --> 06:48:18,600
Vì vậy, với menu có thể chạy này\n

7059
06:48:18,600 --> 06:48:23,257
ký hiệu omega có thể là gì\n

7060
06:48:24,631 --> 06:48:26,611
DAVID J. Malan: Omega của 1, và tại sao vậy?

7061
06:48:28,333 --> 06:48:30,751
DAVID J. Malan: Đúng vậy, bởi vì nếu\nchỉ tình cờ mà cô ấy gặp may mắn

7062
06:48:30,751 --> 06:48:33,661
và con số cô ấy đang tìm\nở ngay chỗ đó

7063
06:48:33,661 --> 06:48:35,850
cô ấy bắt đầu thuật toán, thế thôi.

7064
06:48:36,901 --> 06:48:39,570
Có thể mất hai bước nếu bạn\nmở khóa và mở cửa

7065
06:48:39,570 --> 06:48:41,100
nhưng đó là một số bước không đổi.

7066
06:48:41,100 --> 06:48:43,170
Và cách chúng tôi mô tả\nsố bước không đổi

7067
06:48:43,170 --> 06:48:45,390
chỉ bằng một số duy nhất như 1.

7068
06:48:45,390 --> 06:48:49,350
Vậy ký hiệu omega cho tìm kiếm tuyến tính\ncó thể là omega của 1

7069
06:48:49,350 --> 06:48:53,010
bởi vì trong trường hợp tốt nhất, cô ấy có thể chỉ\n

7070
06:48:53,010 --> 06:48:56,220
Nhưng trong trường hợp xấu nhất, chúng ta cần\n

7071
06:48:58,350 --> 06:49:01,050
Vì vậy, một lần nữa có cách\nnói một cách tượng trưng như thế này

7072
06:49:01,050 --> 06:49:06,510
về trường hợp tốt nhất và trường hợp xấu nhất\n

7073
06:49:06,510 --> 06:49:09,240
Ký hiệu Theta, bây giờ chỉ là\na một câu đố nhỏ

7074
06:49:09,241 --> 06:49:12,326
nó có thể áp dụng được dựa trên\nđịnh nghĩa mà tôi đã đưa ra trước đó không?

7075
06:49:13,201 --> 06:49:15,991
DAVID J. Malan: Được rồi, không, bởi vì bạn\n

7076
06:49:15,991 --> 06:49:18,481
khi hai giới hạn\nupper và Lower đó xảy ra

7077
06:49:18,480 --> 06:49:21,100
tương tự đối với ký hiệu\nviết tắt, nếu bạn muốn.

7078
06:49:21,100 --> 06:49:25,890
Vì vậy ở đây chỉ cần nói về\nký hiệu O và omega lớn là đủ.

7079
06:49:25,890 --> 06:49:28,240
Chà, điều gì sẽ xảy ra nếu chúng ta\nthông minh hơn một chút về vấn đề này?

7080
06:49:28,241 --> 06:49:31,711
Hãy để tôi tiếp tục và sắp xếp\nviệc bán bí mật ở đây

7081
06:49:32,741 --> 06:49:34,966
Nhưng trước tiên, còn\không có ai tình nguyện khác thì sao?

7082
06:49:34,966 --> 06:49:37,591
Một tình nguyện viên khác-- bạn phải\nthoải mái với chiếc mặt nạ của mình

7083
06:49:37,591 --> 06:49:39,870
và sự hiện diện của bạn trên internet.

7084
06:49:42,541 --> 06:49:44,241
Vâng, bạn muốn đi xuống?

7085
06:49:45,241 --> 06:49:48,001
Và đừng nhìn vào những gì tôi đang làm bởi vì tôi sắp--

7086
06:49:52,701 --> 06:49:55,191
hãy dành thời gian và\nđừng nhìn lên hướng này

7087
06:49:55,190 --> 06:49:58,911
vì tôi cần một chút thời gian để\nsắp xếp lại tất cả các con số.

7088
06:49:58,911 --> 06:50:01,791
Và thực ra, nếu bạn có thể ở lại\nngay tại đó trước khi lên

7089
06:50:01,791 --> 06:50:05,271
chỉ một vài giây lúng túng\ntrong khi tôi giấu xong các con số

7090
06:50:08,251 --> 06:50:10,850
DAVID J. Malan: Tôi sẽ đúng với bạn.

7091
06:50:10,850 --> 06:50:15,470
Thực ra, nếu-- bạn có muốn\nlàm ấm đám đông trong giây lát không

7092
06:50:16,644 --> 06:50:18,061
Vậy bạn muốn giới thiệu bản thân?

7093
06:50:27,861 --> 06:50:30,561
DAVID J. Malan: Được rồi,\nTôi nghĩ tôi đã sẵn sàng.

7094
06:50:30,561 --> 06:50:32,061
Cảm ơn bạn đã trì hoãn ở đó.

7095
06:50:33,330 --> 06:50:34,070
DAVID J. Malan: Và tôi đã không nắm được tên của bạn.

7096
06:50:35,811 --> 06:50:36,801
KHÁN GIẢ: Rave, giống như một bữa tiệc.

7097
06:50:39,291 --> 06:50:41,121
Vì vậy, Rave đã vui lòng tình nguyện ngay bây giờ.

7098
06:50:41,120 --> 06:50:43,085
Và lần này tôi sẽ mang đến cho bạn một\nlợi ích bổ sung.

7099
06:50:43,760 --> 06:50:47,540
DAVID J. Malan: Bạn không biết, tôi\n

7100
06:50:48,890 --> 06:50:50,480
Vì vậy, chúng không theo thứ tự\nngẫu nhiên giống như chúng

7101
06:50:50,480 --> 06:50:52,523
là dành cho [? Nomira. ?]\nBây giờ bạn có lợi thế

7102
06:50:52,523 --> 06:50:55,039
để biết rằng các số\nđược sắp xếp từ nhỏ đến lớn.

7103
06:50:55,580 --> 06:50:59,540
DAVID J. Malan: Với điều đó, và có lẽ đã cho\n

7104
06:50:59,541 --> 06:51:03,501
với danh bạ điện thoại, bạn có thể ở đâu\n

7105
06:51:06,169 --> 06:51:07,961
DAVID J. Malan: Lần này chúng ta hãy tìm\nsố sáu.

7106
06:51:07,960 --> 06:51:09,300
Hãy làm cho mọi thứ trở nên thú vị.

7107
06:51:11,661 --> 06:51:12,411
DAVID J. Malan: Được rồi, vậy là phần giữa.

7108
06:51:14,030 --> 06:51:14,780
DAVID J. Malan: --điều đó sẽ ở ngay đây.

7109
06:51:16,820 --> 06:51:18,681
Và thật đáng buồn, bạn tìm thấy con số năm.

7110
06:51:22,742 --> 06:51:24,825
DAVID J. Malan: Được rồi, và\nchỉ để giữ cho nó thống nhất thôi

7111
06:51:24,826 --> 06:51:27,441
Giống như tôi đã làm, tôi mở\nnửa bên phải của danh bạ điện thoại.

7112
06:51:27,710 --> 06:51:29,240
DAVID J. Malan: Chúng ta hãy giữ nó tương tự.

7113
06:51:30,583 --> 06:51:32,542
DAVID J. Malan: Được rồi,\nand, ừ, hơi quá xa

7114
06:51:32,543 --> 06:51:34,431
mặc dù tôi biết bạn muốn đi qua một lần.

7115
06:51:34,431 --> 06:51:35,440
KHÁN GIẢ: Tất cả đều tốt, tất cả đều tốt.

7116
06:51:35,440 --> 06:51:37,161
DAVID J. Malan: Và bây giờ chúng ta sẽ đi theo hướng nào?

7117
06:51:37,161 --> 06:51:38,578
KHÁN GIẢ: Ở đây ở giữa.

7118
06:51:38,578 --> 06:51:40,681
DAVID J. Malan: Đúng, và\nthì đấy, số sáu.

7119
06:51:40,681 --> 06:51:42,201
Được rồi, làm rất tốt.

7120
06:51:44,980 --> 06:51:46,681
Cũng có chút căng thẳng cho bạn.

7121
06:51:47,570 --> 06:51:50,151
Vì vậy, ở đây chúng ta nhìn thấy\ncánh cửa tủ theo bản chất

7122
06:51:50,151 --> 06:51:54,711
vẫn đang được mở như một\sự thật về hiệu quả cao hơn

7123
06:51:54,710 --> 06:51:57,920
có vẻ như thuộc về\thuật toán này bởi vì bây giờ Rave

7124
06:51:57,920 --> 06:52:00,830
đã được đưa ra giả định rằng\n

7125
06:52:00,830 --> 06:52:04,670
ở bên trái đến lớn ở bên phải,\n

7126
06:52:04,670 --> 06:52:07,970
và chinh phục thuật toán từ tuần thứ 0\n

7127
06:52:09,561 --> 06:52:13,011
Và đơn giản bằng cách bắt đầu từ\nở giữa và nhận ra

7128
06:52:13,010 --> 06:52:17,030
Được rồi, quá nhỏ thì hãy truy cập\n

7129
06:52:17,030 --> 06:52:20,181
đã đi hơi xa rồi\nsang nửa bên trái,

7130
06:52:20,181 --> 06:52:24,021
Rave có thể tìm thấy chỉ trong\nba bước thay vì bảy bước

7131
06:52:24,021 --> 06:52:28,081
số sáu trong trường hợp này\nmà chúng tôi thực sự đang tìm kiếm.

7132
06:52:28,080 --> 06:52:32,250
Vì vậy, bạn có thể thấy rằng điều này\ncó vẻ hiệu quả hơn.

7133
06:52:32,251 --> 06:52:35,061
Chúng ta hãy xem xét trong giây lát xem nó có đúng không.

7134
06:52:35,061 --> 06:52:40,611
Nếu tôi đã sử dụng những con số khác nhưng\n

7135
06:52:40,611 --> 06:52:43,739
liệu nó có còn\nlàm việc với thuật toán này không?

7136
06:52:45,530 --> 06:52:48,280
Giống như, tại sao nó vẫn\ncó tác dụng, bạn nghĩ sao?

7137
06:52:51,061 --> 06:52:52,811
DAVID J. Malan: Vâng, vậy\nmiễn là những con số

7138
06:52:52,811 --> 06:52:55,121
luôn giống nhau\thứ tự từ trái sang phải

7139
06:52:55,120 --> 06:52:58,330
hoặc, chết tiệt, chúng thậm chí có thể đảo ngược\n

7140
06:52:58,330 --> 06:53:02,770
những quyết định mà Rave đã đưa ra--\n

7141
06:53:02,771 --> 06:53:05,181
sẽ hướng dẫn chúng ta đến\ngiải pháp dù thế nào đi nữa.

7142
06:53:05,181 --> 06:53:07,820
Và có vẻ như sẽ thực hiện ít bước hơn.

7143
06:53:07,820 --> 06:53:10,580
Vì vậy nếu bây giờ chúng ta xem xét\nmã giả cho thuật toán này

7144
06:53:10,580 --> 06:53:12,890
hãy xem chúng ta có thể mô tả tìm kiếm nhị phân như thế nào.

7145
06:53:12,890 --> 06:53:15,760
Vì vậy, tìm kiếm nhị phân chúng ta có thể\nmô tả bằng thứ gì đó như thế này.

7146
06:53:15,760 --> 06:53:19,001
Nếu số ở sau giữa\n

7147
06:53:19,001 --> 06:53:21,070
sau đó chúng ta có thể trở lại đúng.

7148
06:53:21,070 --> 06:53:24,651
Ngược lại nếu số\nnhỏ hơn cửa giữa

7149
06:53:24,651 --> 06:53:27,161
vậy nếu sáu nhỏ hơn bất cứ thứ gì\nis đằng sau cánh cửa giữa

7150
06:53:27,161 --> 06:53:29,501
thì Rave sẽ\ntìm kiếm ở nửa bên trái.

7151
06:53:29,501 --> 06:53:32,050
Ngược lại nếu số lượng\nlớn hơn cửa giữa

7152
06:53:32,050 --> 06:53:34,060
Rave lẽ ra đã tìm kiếm ở nửa bên phải.

7153
06:53:34,061 --> 06:53:38,201
Ngược lại, nếu không có cửa-- và\n

7154
06:53:38,201 --> 06:53:40,070
cái này lên trên chỉ để giữ mọi thứ sạch sẽ.

7155
06:53:40,070 --> 06:53:43,751
Nếu không có cửa thì Rave nên làm gì\n

7156
06:53:43,751 --> 06:53:47,230
nếu tôi không đưa cho cô ấy tủ đồ để làm việc?

7157
06:53:48,280 --> 06:53:50,380
Nhưng đây là một trường hợp quan trọng cần xem xét

7158
06:53:50,381 --> 06:53:54,341
bởi vì nếu trong quá trình\ntìm kiếm từng tủ một

7159
06:53:54,341 --> 06:53:58,991
chúng ta có thể đã giảm bớt\n

7160
06:53:58,991 --> 06:54:01,731
đến một cánh cửa dẫn đến số không\ntrong nhà-- và tại thời điểm đó

7161
06:54:01,730 --> 06:54:03,591
chúng ta có thể đã không còn\ncửa nào để tìm kiếm.

7162
06:54:03,591 --> 06:54:06,401
Vì vậy, tất nhiên chúng ta phải có một\nskịch bản để xem xét

7163
06:54:07,480 --> 06:54:11,271
Vì thế không có nghĩa là có lẽ tôi không\n

7164
06:54:11,271 --> 06:54:13,271
Nhưng khi cô ấy phân chia và\phân chia và phân chia

7165
06:54:13,271 --> 06:54:17,081
nếu cô ấy hết tủ để hỏi những thứ đó\n

7166
06:54:17,080 --> 06:54:20,020
nếu tôi hết danh bạ\ntrang sẽ xé làm đôi

7167
06:54:20,021 --> 06:54:23,570
Tôi cũng có thể phải trả về\nfalse như trong trường hợp này.

7168
06:54:23,570 --> 06:54:26,861
Vậy làm thế nào bây giờ chúng ta có thể mô tả\ncái này giống C hơn một chút

7169
06:54:26,861 --> 06:54:30,070
chỉ để cho chúng ta một biến\n

7170
06:54:30,070 --> 06:54:33,291
Chà, tôi có thể nói về\ndoors như một mảng.

7171
06:54:33,291 --> 06:54:36,851
Và vì vậy nếu tôi muốn thể hiện phần giữa\n

7172
06:54:38,830 --> 06:54:40,630
Tôi cho rằng\nai đó đã tính toán

7173
06:54:40,631 --> 06:54:43,811
để tìm ra cánh cửa ở giữa\n

7174
06:54:43,811 --> 06:54:46,301
Và sau đó là cửa ra vào, nếu\ncon số chúng ta đang tìm kiếm

7175
06:54:46,300 --> 06:54:49,830
nhỏ hơn khung cửa\nở giữa, sau đó tìm kiếm cửa

7176
06:54:49,830 --> 06:54:53,590
số không qua cửa giữa trừ đi 1.

7177
06:54:53,591 --> 06:54:57,971
Một lần nữa, đây là một cách mô phạm hơn\n

7178
06:54:57,971 --> 06:55:00,520
tìm kiếm nửa bên trái,\ntìm kiếm nửa bên phải--

7179
06:55:00,520 --> 06:55:07,151
nhưng bây giờ hãy bắt đầu mô tả nó trong\n

7180
06:55:07,151 --> 06:55:08,954
giống như chúng tôi đã làm với ký hiệu mảng của mình.

7181
06:55:08,954 --> 06:55:10,871
Tất nhiên, kịch bản cuối cùng là nếu số

7182
06:55:10,870 --> 06:55:13,120
lớn hơn dấu ngoặc ở giữa\ndoor

7183
06:55:13,120 --> 06:55:16,420
thì Rave sẽ muốn\ntìm kiếm ở cửa giữa cộng thêm 1--

7184
06:55:16,420 --> 06:55:21,610
vậy 1 trên-- qua cửa n trừ 1--

7185
06:55:22,690 --> 06:55:25,750
Một lần nữa, chỉ là một cách\n

7186
06:55:27,349 --> 06:55:31,180
Vậy làm thế nào chúng ta có thể dịch\nđiều này bây giờ thành ký hiệu O lớn?

7187
06:55:31,181 --> 06:55:38,230
Chà, trong trường hợp xấu nhất thì có bao nhiêu\n

7188
06:55:39,431 --> 06:55:43,390
Cho bảy cửa hoặc cho\ntổng quát hơn n cửa

7189
06:55:43,390 --> 06:55:47,980
cô ấy có thể rẽ trái hoặc rẽ bao nhiêu lần\n

7190
06:55:50,471 --> 06:55:53,148
Cách để suy nghĩ về điều đó là gì?

7191
06:55:57,640 --> 06:56:00,515
Và ngay cả khi bạn không cảm thấy hoàn toàn\n

7192
06:56:00,515 --> 06:56:03,611
vẫn còn khá nhiều về lập trình và\n

7193
06:56:03,611 --> 06:56:06,791
bất cứ khi nào chúng ta nói về thuật toán nào đó\n

7194
06:56:06,791 --> 06:56:10,541
một nửa, một nửa, một nửa,\hoặc bất kỳ bội số nào khác

7195
06:56:10,541 --> 06:56:12,941
nó có lẽ liên quan đến\nlogarit theo một nghĩa nào đó.

7196
06:56:12,940 --> 06:56:15,760
Và log cơ sở n về cơ bản\nđề cập đến số

7197
06:56:15,760 --> 06:56:21,520
số lần bạn có thể chia n cho 2 cho đến\n

7198
06:56:21,521 --> 06:56:23,771
hoặc tương đương là không còn cửa nào.

7199
06:56:24,730 --> 06:56:28,631
Vì vậy, chúng ta thực sự có thể nói rằng\ntìm kiếm nhị phân nằm ở chữ O lớn của log n

7200
06:56:28,631 --> 06:56:32,800
bởi vì cánh cửa mà Rave\no đã mở lần cuối, cái này

7201
06:56:32,800 --> 06:56:34,720
tình cờ cách đó ba cánh cửa.

7202
06:56:34,721 --> 06:56:37,151
Và thực ra, nếu bạn làm\ntoán ở đây, thì đại khái là

7203
06:56:37,151 --> 06:56:38,961
hóa ra chính xác là trường hợp đó.

7204
06:56:38,960 --> 06:56:43,001
Nếu chúng ta thêm một cái vào thì có vẻ như không ổn\n

7205
06:56:43,001 --> 06:56:46,300
chúng tôi đã có thể tìm kiếm nó\n chỉ trong ba bước.

7206
06:56:46,300 --> 06:56:48,341
Thế còn ký hiệu omega thì sao?

7207
06:56:48,341 --> 06:56:51,581
Giống như, trong trường hợp tốt nhất, Rave\ncó thể đã gặp may.

7208
06:56:51,580 --> 06:56:53,530
Cô mở cửa, và nó ở đó.

7209
06:56:53,530 --> 06:56:59,330
Vậy làm thế nào chúng ta có thể mô tả giới hạn dưới\n

7210
06:57:03,580 --> 06:57:08,170
Vì vậy, ở đây cũng vậy, chúng tôi thấy rằng trong một số trường hợp\n

7211
06:57:08,170 --> 06:57:10,060
giống như, chúng khá tương đương nhau.

7212
06:57:10,061 --> 06:57:15,191
Và đây là lý do tại sao đôi khi\n

7213
06:57:15,190 --> 06:57:17,650
trong trường hợp xấu nhất\nvì thành thật mà nói, nói chung

7214
06:57:17,651 --> 06:57:19,961
ai thực sự quan tâm nếu thỉnh thoảng bạn gặp may mắn

7215
06:57:19,960 --> 06:57:21,640
và thuật toán của bạn siêu nhanh?

7216
06:57:21,640 --> 06:57:24,611
Điều bạn có thể quan tâm\là trường hợp xấu nhất.

7217
06:57:25,751 --> 06:57:29,530
tôi sẽ ngồi bao lâu\n

7218
06:57:29,530 --> 06:57:35,167
hoặc quả bóng bãi biển đang cố gắng cống hiến cho bản thân\n

7219
06:57:35,168 --> 06:57:38,001
Chà, rất có thể là bạn sẽ\n

7220
06:57:38,001 --> 06:57:39,791
Vì vậy thực sự, việc di chuyển\nvề phía trước, nói chung sẽ

7221
06:57:39,791 --> 06:57:43,091
nói về thời gian hoạt động của\n

7222
06:57:43,091 --> 06:57:45,140
ít hơn một chút về mặt omega.

7223
06:57:45,140 --> 06:57:47,501
Nhưng hiểu được phạm vi\n có thể quan trọng

7224
06:57:47,501 --> 06:57:53,061
tùy thuộc vào bản chất của dữ liệu\n

7225
06:57:53,061 --> 06:57:55,871
Được rồi, hãy để tôi tạm dừng và\nxem có câu hỏi nào không.

7226
06:58:03,210 --> 06:58:05,791
ĐỐI TƯỢNG: Vậy thì phương pháp này\nis rõ ràng là hiệu quả hơn

7227
06:58:05,791 --> 06:58:10,800
nhưng nó yêu cầu thông tin\n

7228
06:58:10,800 --> 06:58:14,131
Làm thế nào để bạn đảm bảo rằng bạn\ncó thể biên soạn thông tin

7229
06:58:14,131 --> 06:58:15,626
theo một thứ tự cụ thể ở quy mô?

7230
06:58:15,626 --> 06:58:17,501
DAVID J. Malan: Vâng, đó thực sự là một câu hỏi hay.

7231
06:58:17,501 --> 06:58:20,376
Và nếu tôi có thể khái quát nó thì làm thế nào\n

7232
06:58:20,376 --> 06:58:22,920
ở quy mô lớn, thuật toán nào tốt hơn?

7233
06:58:22,920 --> 06:58:25,800
Tôi đã dẫn chúng ta vào\ncon đường ngụ ý này

7234
06:58:25,800 --> 06:58:27,900
thuật toán\thuật toán nhị phân thứ hai của Rave

7235
06:58:27,901 --> 06:58:29,941
tốt hơn vì nó nhanh hơn rất nhiều.

7236
06:58:29,940 --> 06:58:33,960
Đó là nhật ký của n trong trường hợp xấu nhất\n thay vì chữ O lớn của n.

7237
06:58:33,960 --> 06:58:37,591
Nhưng Rave đã có được lợi thế khi\n

7238
06:58:38,582 --> 06:58:40,290
Và đó là cách\nêu câu hỏi

7239
06:58:40,291 --> 06:58:42,031
chà, với toàn bộ\ndữ liệu ngẫu nhiên

7240
06:58:42,030 --> 06:58:45,070
hoặc một tập dữ liệu nhỏ hoặc, chết tiệt,\n

7241
06:58:45,070 --> 06:58:48,901
hàng tỷ mẩu dữ liệu,\nbạn có nên sắp xếp dữ liệu đó trước không

7242
06:58:48,901 --> 06:58:51,511
từ nhỏ nhất đến\nlớn nhất rồi tìm kiếm?

7243
06:58:51,510 --> 06:58:56,280
Hay bạn chỉ nên lặn ngay\nin và tìm kiếm nó một cách tuyến tính?

7244
06:58:56,280 --> 06:58:57,998
Giống như, bạn có thể nghĩ về điều đó như thế nào?

7245
06:58:57,998 --> 06:58:59,791
Ví dụ: nếu bạn là Google\và bạn đã

7246
06:58:59,791 --> 06:59:03,451
có hàng triệu, hàng tỷ trang web,\n

7247
06:59:03,451 --> 06:59:06,210
bởi vì nó luôn hoạt động\mặc dù nó có thể chậm?

7248
06:59:06,210 --> 06:59:09,181
Hay họ nên đầu tư thời gian\vào việc sắp xếp tất cả dữ liệu đó--

7249
06:59:10,991 --> 06:59:13,261
và sau đó tìm kiếm nó hiệu quả hơn?

7250
06:59:13,260 --> 06:59:15,798
Giống như, bạn quyết định\ngiữa các lựa chọn đó như thế nào?

7251
06:59:15,798 --> 06:59:18,091
ĐỐI TƯỢNG: Nếu bạn đang sắp xếp\ndữ liệu thì phải không

7252
06:59:18,091 --> 06:59:20,934
phải xem qua tất cả dữ liệu?

7253
06:59:20,934 --> 06:59:23,101
DAVID J. Malan: Vâng, nếu anh\nphải sắp xếp dữ liệu trước--

7254
06:59:23,100 --> 06:59:25,060
và chúng tôi chưa chính thức\nbiết cách thực hiện việc này.

7255
06:59:25,061 --> 06:59:27,478
Nhưng rõ ràng, với tư cách là con người, chúng ta\ncó thể tìm ra được điều đó.

7256
06:59:27,477 --> 06:59:29,640
Dù sao thì bạn cũng phải xem\ntất cả dữ liệu.

7257
06:59:29,640 --> 06:59:33,120
Và như vậy bạn đang lãng phí\n

7258
06:59:35,041 --> 06:59:37,259
Nhưng có lẽ nó còn phụ thuộc nhiều hơn một chút.

7259
06:59:37,258 --> 06:59:39,300
Giống như, điều đó hoàn toàn\nđúng và nếu bạn chỉ

7260
06:59:39,300 --> 06:59:42,420
đang tìm kiếm một điều trong cuộc sống,\n

7261
06:59:42,420 --> 06:59:46,080
để sắp xếp nó và sau đó tìm kiếm nó bởi vì\n

7262
06:59:46,080 --> 06:59:48,240
Nhưng có một kịch bản khác\nmà bạn có thể không

7263
06:59:48,241 --> 06:59:53,771
hãy lo lắng về điều đó\n

7264
06:59:54,271 --> 07:00:00,940
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] bạn có thể đi\n

7265
07:00:00,940 --> 07:00:02,170
để tìm hiểu chuyện gì đang xảy ra.

7266
07:00:02,170 --> 07:00:03,212
DAVID J. Malan: Vâng, chính xác.

7267
07:00:03,212 --> 07:00:05,753
Vì vậy, nếu vấn đề của bạn là một vấn đề\ngiống như Google trong đó

7268
07:00:05,753 --> 07:00:08,710
bạn có nhiều hơn một người dùng\n

7269
07:00:08,710 --> 07:00:11,140
trang web, có lẽ bạn\nsẽ phải chịu chi phí trả trước

7270
07:00:11,140 --> 07:00:14,980
và sắp xếp toàn bộ vì\n

7271
07:00:14,980 --> 07:00:17,170
sẽ nhanh hơn,\nnhanh hơn, nhanh hơn bởi vì nó

7272
07:00:17,170 --> 07:00:20,800
đi tới thuật toán [KHÔNG NGHE ĐƯỢC] của nhị phân\n

7273
07:00:20,800 --> 07:00:23,681
số bước đó sẽ cộng lại\nvà sẽ có ít bước hơn

7274
07:00:23,681 --> 07:00:25,971
hơn là thực hiện tìm kiếm tuyến tính nhiều lần.

7275
07:00:25,971 --> 07:00:27,851
Vì vậy, một lần nữa,\ntùy thuộc vào trường hợp sử dụng

7276
07:00:27,850 --> 07:00:29,710
và phần lớn phụ thuộc vào mức độ quan trọng của nó.

7277
07:00:29,710 --> 07:00:32,411
Và điều này xảy ra ngay cả trong bối cảnh thế giới thực.

7278
07:00:32,411 --> 07:00:35,260
Tôi nghĩ lại luôn để tốt nghiệp\n

7279
07:00:35,260 --> 07:00:36,970
để phân tích một số tập dữ liệu lớn.

7280
07:00:36,971 --> 07:00:39,761
Và thành thật mà nói, vào thời điểm đó nó thực sự dễ dàng hơn đối với tôi

7281
07:00:39,760 --> 07:00:42,670
viết khá kém hiệu quả\nnhưng hy vọng là đúng

7282
07:00:42,670 --> 07:00:43,897
mã vì bạn biết gì không?

7283
07:00:43,898 --> 07:00:47,230
Tôi chỉ có thể đi ngủ trong tám tiếng\n

7284
07:00:47,730 --> 07:00:50,695
Tôi không cần phải viết\n

7285
07:00:50,695 --> 07:00:51,820
để chạy nó hiệu quả hơn.

7286
07:00:52,320 --> 07:00:55,881
Bởi vì tôi là người dùng duy nhất và tôi\n

7287
07:00:55,881 --> 07:00:58,061
Và đây là một cách tiếp cận hợp lý

7288
07:00:58,061 --> 07:01:01,911
hợp lý cho đến khi tôi thức dậy lúc tám giờ\n

7289
07:01:01,911 --> 07:01:05,320
Và bây giờ tôi phải chi thêm tám\n

7290
07:01:05,320 --> 07:01:07,271
Nhưng ngay cả ở đó, bạn\nthấy một ví dụ trong đó

7291
07:01:07,271 --> 07:01:09,251
nguồn tài nguyên quý giá nhất của bạn là gì?

7292
07:01:11,080 --> 07:01:13,330
Đã đến lúc viết mã chưa?

7293
07:01:13,330 --> 07:01:15,458
Đây có phải là dung lượng bộ nhớ\nmáy tính đang sử dụng không?

7294
07:01:15,458 --> 07:01:18,251
Đây là tất cả tài nguyên chúng ta sẽ bắt đầu\n

7295
07:01:18,251 --> 07:01:20,440
phụ thuộc vào mục tiêu của bạn là gì.

7296
07:01:20,440 --> 07:01:23,411
Vậy thì, có bất kỳ câu hỏi nào về giới hạn\nupper, giới hạn dưới

7297
07:01:23,411 --> 07:01:26,620
hoặc mỗi trong số hai\ntìm kiếm này, tuyến tính hay nhị phân?

7298
07:01:27,351 --> 07:01:29,940
ĐỐI TƯỢNG: Chỉ khi bạn\nđang tính thời gian chạy

7299
07:01:29,940 --> 07:01:34,677
bước sắp xếp\ncó được tính vào thời điểm đó không?

7300
07:01:34,677 --> 07:01:37,510
DAVID J. MALAN: Khi phân tích việc chạy\n

7301
07:01:37,510 --> 07:01:39,670
Nếu bạn muốn nếu bạn thực sự làm điều đó.

7302
07:01:39,670 --> 07:01:41,260
Hiện tại, nó không được áp dụng.

7303
07:01:41,260 --> 07:01:45,460
Tôi vừa mang lại cho Rave sự thoải mái\nbiết rằng dữ liệu đã được sắp xếp.

7304
07:01:45,460 --> 07:01:48,880
Nhưng nếu tôi thực sự muốn tính phí\nher trong khoảng thời gian

7305
07:01:48,881 --> 07:01:52,091
cần phải tìm ra số sáu đó,\nlẽ ra tôi phải cộng thêm thời gian

7306
07:01:52,091 --> 07:01:54,073
để sắp xếp cộng với thời gian để tìm kiếm.

7307
07:01:54,073 --> 07:01:55,780
Và trên thực tế, đó là con đường chúng ta sẽ đi.

7308
07:01:55,780 --> 07:01:57,530
Tại sao chúng ta không tiếp tục và\ntăng tốc như trước?

7309
07:01:57,530 --> 07:01:58,948
Chúng ta hãy nghỉ giải lao 10 phút ở đây.

7310
07:01:58,948 --> 07:02:01,491
Và khi quay lại, chúng tôi sẽ\nviết một số mã thực tế.

7311
07:02:01,491 --> 07:02:05,399
Vì vậy, chúng tôi đã thấy một vài tìm kiếm--\n

7312
07:02:05,399 --> 07:02:06,941
công bằng mà nói, chúng ta đã thấy lại vào tuần thứ 0.

7313
07:02:06,940 --> 07:02:10,150
Nhưng thực ra chúng ta hãy dịch tại\n

7314
07:02:10,151 --> 07:02:13,331
bằng cách sử dụng khối xây dựng này từ\ntuần trước nơi chúng tôi thực sự có thể

7315
07:02:13,330 --> 07:02:17,180
định nghĩa một mảng nếu chúng ta muốn, chẳng hạn như một\n

7316
07:02:17,181 --> 07:02:18,911
Vì vậy, hãy để tôi chuyển sang Mã VS ở đây.

7317
07:02:18,911 --> 07:02:22,271
Hãy để tôi tiếp tục và bắt đầu\na chương trình có tên là number.c.

7318
07:02:22,271 --> 07:02:25,300
Và trong số.c, hãy để tôi tiếp tục ở đây.

7319
07:02:25,300 --> 07:02:29,201
Và hãy bao gồm\n các tệp tiêu đề quen thuộc của chúng ta?

7320
07:02:31,030 --> 07:02:35,690
Tôi sẽ bao gồm Standardio.h mà chúng tôi có thể\n

7321
07:02:35,690 --> 07:02:38,771
Và bây giờ tôi sẽ tiếp tục\nvà dành cho mình khoảng trống chính.

7322
07:02:38,771 --> 07:02:40,460
Không có đối số dòng lệnh ngày hôm nay.

7323
07:02:40,460 --> 07:02:41,593
Vì vậy, tôi sẽ để nó trống rỗng.

7324
07:02:41,593 --> 07:02:43,300
Và tôi sẽ tiếp tục và cống hiến hết mình

7325
07:02:43,300 --> 07:02:45,771
một mảng gồm bảy số thì sao?

7326
07:02:45,771 --> 07:02:48,581
Vì vậy tôi sẽ gọi nó là int số 7.

7327
07:02:48,580 --> 07:02:50,620
Và sau đó tôi có thể điền\nmảng này bằng các con số.

7328
07:02:50,620 --> 07:02:54,460
Giống như, dấu ngoặc số 0 có thể là\n

7329
07:02:54,460 --> 07:02:58,668
có thể là số 6 và các số\n

7330
07:02:58,669 --> 07:03:01,211
Và đây chính là danh sách\nmà chúng ta đã thấy với [? Nomira ?] một chút

7331
07:03:01,210 --> 07:03:03,530
trước đây là 4, rồi 6, rồi 8.

7332
07:03:04,280 --> 07:03:06,700
Thực ra có một\nscú pháp khác tôi có thể chỉ cho bạn ở đây.

7333
07:03:06,701 --> 07:03:09,581
Nếu bạn biết trước\n một chương trình C mà bạn

7334
07:03:09,580 --> 07:03:14,750
muốn một mảng các giá trị nhất định và bạn\n

7335
07:03:14,751 --> 07:03:17,771
bạn muốn, bạn thực sự có thể làm điều này\n

7336
07:03:17,771 --> 07:03:20,921
Bạn có thể nói, đừng lo lắng\nvề việc nó lớn đến mức nào.

7337
07:03:20,920 --> 07:03:23,980
Nó sẽ được ẩn bởi\ncác dấu ngoặc nhọn này.

7338
07:03:23,980 --> 07:03:28,971
Ở đây, tôi có thể thực hiện 4, 6, 8, 2,\n7, 5, 0, đóng dấu ngoặc nhọn.

7339
07:03:28,971 --> 07:03:31,091
Vì vậy, đây là một\ncách sử dụng dấu ngoặc nhọn hơi mới.

7340
07:03:31,091 --> 07:03:35,140
Nhưng điều này có tác dụng mang lại\n

7341
07:03:35,140 --> 07:03:36,800
trong số đó là một loạt các số nguyên.

7342
07:03:37,390 --> 07:03:41,320
Trình biên dịch có thể suy ra nó từ những gì\n

7343
07:03:41,320 --> 07:03:44,501
Và nó dường như có\nkích thước 1, 2, 3, 4, 5, 6, 7.

7344
07:03:44,501 --> 07:03:49,870
Và tất cả bảy yếu tố sẽ là\n

7345
07:03:50,690 --> 07:03:53,140
Vì vậy chỉ cần tối ưu hóa một chút\ncode một cách khôn ngoan để thắt chặt

7346
07:03:53,140 --> 07:03:56,451
lẽ ra chuyện gì sẽ xảy ra\n

7347
07:03:56,451 --> 07:03:59,441
Bây giờ hãy tiếp tục và triển khai\ntìm kiếm tuyến tính, như chúng tôi đã gọi.

7348
07:03:59,440 --> 07:04:02,483
Và bạn có thể làm điều này trong một loạt\n

7349
07:04:02,483 --> 07:04:09,190
Với int tôi nhận được 0, tôi\nnhỏ hơn 7 tôi cộng thêm.

7350
07:04:09,190 --> 07:04:12,161
Sau đó, bên trong vòng lặp của tôi, tôi\nsẽ đặt câu hỏi

7351
07:04:12,161 --> 07:04:17,381
nếu các số tại vị trí i\nbằng nhau, như chúng tôi đã yêu cầu

7352
07:04:17,381 --> 07:04:21,041
[? Nomira, ?] số 0 thì tôi\n

7353
07:04:21,041 --> 07:04:25,811
như printf tìm thấy dấu gạch chéo ngược n.

7354
07:04:25,811 --> 07:04:27,641
Và sau đó tôi sẽ trả về 0.

7355
07:04:27,640 --> 07:04:30,400
Chỉ vì cuộc thảo luận tuần trước về việc quay lại

7356
07:04:30,401 --> 07:04:34,511
một giá trị cho main khi tất cả đều ổn,\n

7357
07:04:34,510 --> 07:04:37,420
chỉ để báo hiệu rằng thực sự,\ntôi đã tìm thấy thứ tôi đang tìm kiếm.

7358
07:04:37,420 --> 07:04:44,920
Nếu không thì tôi muốn ở dòng nào\n

7359
07:04:44,920 --> 07:04:46,960
và trả lại một cái gì đó khác 0?

7360
07:04:46,960 --> 07:04:51,220
Đúng rồi, tôi không nghĩ mình muốn cái khác\n

7361
07:04:51,221 --> 07:04:55,390
Vậy bạn thích tôi ở dòng nào hơn

7362
07:04:55,390 --> 07:04:58,850
không tìm thấy và tôi sẽ trả về lỗi?

7363
07:05:04,370 --> 07:05:06,078
Vì vậy, ở cuối vòng lặp\nfor vì bạn

7364
07:05:06,079 --> 07:05:07,911
muốn cung cấp\nchương trình hoặc tình nguyện viên của chúng tôi

7365
07:05:07,911 --> 07:05:11,341
sớm hơn một cơ hội để trải qua tất cả\n

7366
07:05:11,341 --> 07:05:14,061
Nhưng nếu bạn xem hết\nmọi thứ, qua toàn bộ vòng lặp

7367
07:05:14,061 --> 07:05:17,991
cuối cùng, có lẽ bạn chỉ\n

7368
07:05:17,991 --> 07:05:20,421
rồi trả về\nthứ gì đó như dương 1

7369
07:05:20,420 --> 07:05:22,400
chỉ để biểu thị rằng đã xảy ra lỗi.

7370
07:05:22,401 --> 07:05:24,531
Và một lần nữa, đây chỉ là một chi tiết nhỏ vào tuần trước.

7371
07:05:24,530 --> 07:05:28,730
Bất cứ khi nào main thành công,\n

7372
07:05:30,210 --> 07:05:33,380
Và nếu có sự cố xảy ra, giống như bạn\n

7373
07:05:33,381 --> 07:05:37,311
bạn có thể trả lại thứ gì khác ngoài\n

7374
07:05:37,311 --> 07:05:39,563
hoặc thậm chí là số âm nếu bạn muốn.

7375
07:05:39,562 --> 07:05:41,520
Được rồi, hãy để tôi\nđi trước và lưu lại cái này.

7376
07:05:49,401 --> 07:05:51,861
Được rồi, và nó đã được tìm thấy,\nas tôi hy vọng nó sẽ như vậy.

7377
07:05:51,861 --> 07:05:55,070
Và chỉ để kiểm tra một chút thôi, hãy\n

7378
07:05:55,070 --> 07:05:59,151
không có ở đó, giống như số âm 1.

7379
07:05:59,151 --> 07:06:02,001
Hãy để tôi tiếp tục và biên dịch lại\nmã với các số.

7380
07:06:02,001 --> 07:06:04,251
Hãy để tôi chạy lại mã\nvới số dấu chấm gạch chéo

7381
07:06:04,251 --> 07:06:06,260
và hy vọng-- ồ, được rồi, không tìm thấy.

7382
07:06:06,260 --> 07:06:08,833
Vì vậy, bằng chứng bằng ví dụ\ncó vẻ như đang hoạt động chính xác.

7383
07:06:08,833 --> 07:06:11,001
Nhưng bây giờ hãy làm cho mọi thứ trở nên thú vị hơn một chút.

7384
07:06:11,001 --> 07:06:14,061
Hiện tại, tôi chỉ đang sử dụng mảng số nguyên\nan.

7385
07:06:14,061 --> 07:06:18,451
Hãy để tôi tiếp tục và giới thiệu\ncó thể thay vào đó là một mảng các chuỗi.

7386
07:06:18,451 --> 07:06:21,721
Và có lẽ lần này, tôi sẽ lưu trữ một\n

7387
07:06:21,721 --> 07:06:23,461
nhưng chuỗi tên thực tế.

7388
07:06:24,690 --> 07:06:26,490
Vâng, hãy để tôi quay lại mã của tôi ở đây.

7389
07:06:26,491 --> 07:06:30,831
Tôi sẽ chuyển chúng ta sang\ncó thể là một tệp có tên lànames.c.

7390
07:06:30,830 --> 07:06:34,490
Và ở đây, tôi sẽ tiếp tục thêm cs50.h.

7391
07:06:37,911 --> 07:06:41,390
Và tôi sẽ tiếp tục và\nbây giờ sẽ thêm một người bạn mới vào

7392
07:06:41,390 --> 07:06:44,838
từ tuần trước, string.h, mang lại\n

7393
07:06:44,838 --> 07:06:47,631
Int main void vì tôi sẽ không đi\n

7394
07:06:48,841 --> 07:06:53,690
Và bây giờ nếu tôi muốn một mảng các chuỗi,\n

7395
07:06:56,480 --> 07:06:58,460
Và sau đó tôi có thể bắt đầu\nlàm như trước.

7396
07:06:58,460 --> 07:07:01,940
Khung tên 0 có thể là ai đó\nnhư Bill và khung tên 1

7397
07:07:01,940 --> 07:07:05,100
có thể là một người nào đó như\nCharlie, v.v.

7398
07:07:05,100 --> 07:07:08,712
Nhưng tôi có thể thực hiện cải tiến mới này.

7399
07:07:08,712 --> 07:07:11,420
Hãy để tôi để trình biên dịch tính toán\n

7400
07:07:11,420 --> 07:07:16,911
Và sử dụng dấu ngoặc nhọn, tôi sẽ thực hiện Bill\n

7401
07:07:16,911 --> 07:07:24,050
George rồi Ginny rồi Percy và\n

7402
07:07:24,050 --> 07:07:27,291
Được rồi, bây giờ tôi có\nbảy cái tên này dưới dạng chuỗi.

7403
07:07:32,091 --> 07:07:35,690
i nhỏ hơn 7 như trước,\ni cộng cộng như trước.

7404
07:07:35,690 --> 07:07:39,260
Và bên trong vòng lặp, cho phép điều này\n

7405
07:07:39,260 --> 07:07:41,990
và giả sử chúng ta đang tìm kiếm\nRon một cách tùy tiện.

7406
07:07:41,991 --> 07:07:44,451
Anh ấy ở đó, nên cuối cùng chúng ta cũng phải tìm được anh ấy.

7407
07:07:44,451 --> 07:07:51,890
Hãy để tôi tiếp tục và nói nếu khung tên\n

7408
07:07:51,890 --> 07:07:55,701
trong điều kiện if của tôi, tôi sẽ\n

7409
07:07:55,701 --> 07:07:57,951
Và tôi sẽ trả về 0\nchỉ vì tất cả đều ổn.

7410
07:07:57,951 --> 07:08:00,751
Và lần này tôi sẽ làm theo lời khuyên của bạn ngay từ đầu

7411
07:08:00,751 --> 07:08:04,920
và ở cuối vòng lặp, in ra\n

7412
07:08:04,920 --> 07:08:08,030
Tôi chưa tìm thấy bản in và\ntôi cũng chưa quay lại.

7413
07:08:08,030 --> 07:08:12,200
Vì vậy tôi sẽ tiếp tục và\n

7414
07:08:12,201 --> 07:08:14,781
Được rồi, hãy để tôi tiếp tục và\nbắt chéo ngón tay như mọi khi.

7415
07:08:17,670 --> 07:08:20,661
Và có vẻ như\nkhông giống mã của tôi ở đây.

7416
07:08:20,661 --> 07:08:22,730
Đây có lẽ là một\nlỗi mới mà có thể bạn chưa biết

7417
07:08:22,730 --> 07:08:25,440
đã thấy trong tên.c dòng 11.

7418
07:08:25,440 --> 07:08:28,280
Vì vậy, đó là dòng\nđây, điều kiện if của tôi.

7419
07:08:28,280 --> 07:08:32,330
Kết quả so sánh với một\nchuỗi ký tự không được chỉ định.

7420
07:08:32,330 --> 07:08:34,752
Thay vào đó, hãy sử dụng hàm string\ncomparison rõ ràng.

7421
07:08:34,753 --> 07:08:37,460
Ý tôi là, điều đó thật là thú vị,\n

7422
07:08:37,460 --> 07:08:39,960
bạn có thể sẽ không\nbiết cách hiểu điều đó.

7423
07:08:39,960 --> 07:08:43,490
Nhưng nó thực sự thu hút sự chú ý của chúng ta về điều gì đó không ổn

7424
07:08:43,491 --> 07:08:48,201
với việc kiểm tra đẳng thức\nở đây, với các giá trị bằng nhau và Ron.

7425
07:08:48,201 --> 07:08:50,601
Và đây là nơi\nchúng ta đã kể lại

7426
07:08:50,600 --> 07:08:53,060
một lời nói dối trắng trợn trong vài tuần qua.

7427
07:08:53,061 --> 07:08:57,261
Chuỗi là một thứ trong C. Chuỗi\na là một thứ trong lập trình.

7428
07:08:57,260 --> 07:08:59,030
Nhưng nhớ lại từ tuần trước\n, tôi đã từ chối

7429
07:08:59,030 --> 07:09:01,010
không có thứ đó\na là kiểu dữ liệu chuỗi

7430
07:09:01,010 --> 07:09:05,030
về mặt kỹ thuật vì nó không phải là\na nguyên thủy theo kiểu int

7431
07:09:05,030 --> 07:09:08,570
và một float và một bool là\n

7432
07:09:08,570 --> 07:09:12,530
Bạn không thể chỉ sử dụng phương trình\nequals để so sánh hai chuỗi.

7433
07:09:12,530 --> 07:09:15,470
Bạn thực sự phải sử dụng\na chức năng đặc biệt đó là

7434
07:09:15,471 --> 07:09:18,501
trong tệp tiêu đề này,\nchúng ta đã nói ngắn gọn về tuần trước.

7435
07:09:18,501 --> 07:09:21,140
Trong tệp tiêu đề đó có\nđộ dài chuỗi hoặc strlen.

7436
07:09:21,140 --> 07:09:23,850
Nhưng thay vào đó còn có những chức năng\n khác.

7437
07:09:23,850 --> 07:09:27,440
Thực tế, hãy để tôi tiếp tục\nvà mở các trang hướng dẫn.

7438
07:09:32,120 --> 07:09:37,161
Trong string.h bạn có thể suy ra\n

7439
07:09:37,161 --> 07:09:40,973
nơi bình đẳng cho ngày hôm nay.

7440
07:09:43,041 --> 07:09:47,666
DAVID J. Malan: Vậy strcmp, S-T-R-C-M-P,\n

7441
07:09:47,666 --> 07:09:49,791
Và nếu tôi nhấp vào đó,\nchúng ta sẽ thấy thêm thông tin.

7442
07:09:49,791 --> 07:09:53,871
Và thực sự, nếu tôi nhấp vào strcmp,\nchúng ta sẽ thấy trong phần tóm tắt

7443
07:09:53,870 --> 07:09:58,850
được rồi, tôi cần sử dụng tiêu đề CS50\n

7444
07:09:58,850 --> 07:10:02,210
Đây là nguyên mẫu của nó\ncho tôi biết

7445
07:10:02,210 --> 07:10:05,720
strcmp đó có hai\nchuỗi, S1 và S2, đó

7446
07:10:05,721 --> 07:10:07,251
có lẽ sẽ được so sánh.

7447
07:10:07,251 --> 07:10:09,591
Và nó trả về một số nguyên,\nđiều này thật thú vị.

7448
07:10:10,791 --> 07:10:14,091
Mô tả của chức năng này là\n

7449
07:10:15,230 --> 07:10:18,471
Vì vậy, chữ hoa hay chữ thường\n đều quan trọng, chỉ là thông tin cho bạn.

7450
07:10:18,471 --> 07:10:20,931
Và sau đó hãy xem\ngiá trị trả về ở đây.

7451
07:10:20,931 --> 07:10:25,221
Giá trị trả về của hàm này\ntrả về một int nhỏ hơn 0

7452
07:10:25,221 --> 07:10:32,841
nếu S1 đứng trước S2, 0 nếu S1 là\n

7453
07:10:35,300 --> 07:10:39,140
Vậy lý do mà chức năng này\n

7454
07:10:39,140 --> 07:10:41,751
bool, đúng hay sai,\nrằng nó thực sự sẽ

7455
07:10:41,751 --> 07:10:45,111
cho phép chúng tôi sắp xếp những thứ này\n

7456
07:10:45,111 --> 07:10:49,341
nếu hai chuỗi theo thứ tự này hoặc\n

7457
07:10:49,341 --> 07:10:51,440
bạn cần ba giá trị trả về có thể có.

7458
07:10:51,440 --> 07:10:53,271
Và tất nhiên là một bool\không mang lại cho bạn hai

7459
07:10:53,271 --> 07:10:56,841
nhưng một int mang lại cho bạn khoảng 4 tỷ\n

7460
07:10:56,841 --> 07:11:01,881
Vậy 0 hay số dương hay số âm\n

7461
07:11:01,881 --> 07:11:06,320
Và tài liệu tiếp tục giải thích\n

7462
07:11:06,320 --> 07:11:09,620
Nhớ lại chữ A\nis 65, chữ B là 66

7463
07:11:09,620 --> 07:11:12,021
và đó là những thứ cơ bản\nASCII hoặc Unicode

7464
07:11:12,021 --> 07:11:15,411
những con số mà máy tính sử dụng để tính\n

7465
07:11:15,411 --> 07:11:17,541
hoặc sau nó như trong từ điển.

7466
07:11:17,541 --> 07:11:20,311
Nhưng với mục đích hiện tại,\nchúng tôi chỉ quan tâm đến sự bình đẳng.

7467
07:11:20,311 --> 07:11:22,041
Vì vậy, tôi sẽ tiếp tục và làm điều này.

7468
07:11:22,041 --> 07:11:26,181
Nếu tôi muốn so sánh tên\nngoặc i với Ron

7469
07:11:26,181 --> 07:11:33,681
Tôi sử dụng khuấy so sánh hoặc strcmp, tên\n

7470
07:11:33,681 --> 07:11:35,870
Vì vậy, nó có liên quan nhiều\nhơn thực tế một chút

7471
07:11:35,870 --> 07:11:40,190
sử dụng bằng bằng,\ncó tác dụng với số nguyên, số dài

7472
07:11:41,361 --> 07:11:45,210
Nhưng đối với chuỗi, hóa ra chúng ta\n

7473
07:11:45,710 --> 07:11:47,990
Chà, tuần trước, hãy nhớ lại\nchuỗi thực sự là gì.

7474
07:11:47,991 --> 07:11:50,581
Đó là một mảng các ký tự.

7475
07:11:50,580 --> 07:11:54,050
Và vì vậy, trong khi bạn có thể sử dụng bằng\nequals cho các ký tự đơn

7476
07:11:54,050 --> 07:11:56,960
strcmp, như chúng ta sẽ thấy sau này, sẽ diễn ra

7477
07:11:56,960 --> 07:11:58,798
để so sánh nhiều ký tự cho chúng tôi.

7478
07:11:59,841 --> 07:12:03,931
Cần có một vòng lặp, và đó là\n

7479
07:12:03,931 --> 07:12:06,651
Nhưng nó không chỉ hoạt động\n

7480
07:12:06,651 --> 07:12:10,628
Điều đó thực sự có nghĩa là so sánh\n

7481
07:12:10,628 --> 07:12:12,710
Và chúng ta sẽ quay lại\nvào tuần tới để biết những gì

7482
07:12:12,710 --> 07:12:14,280
thực sự đang diễn ra dưới mui xe.

7483
07:12:14,280 --> 07:12:18,501
Vì vậy, hãy để tôi tiếp tục và sửa một\nlỗi mà tôi vừa nhận ra là mình đã mắc phải.

7484
07:12:18,501 --> 07:12:23,811
Tôi muốn kiểm tra xem giá trị return\n của str so sánh có bằng 0 không

7485
07:12:23,811 --> 07:12:27,021
bởi vì theo tài liệu,\nđiều đó có nghĩa là chúng giống nhau.

7486
07:12:27,021 --> 07:12:30,001
Được rồi, hãy để tôi tiếp tục\nvà đặt tên lần này.

7487
07:12:31,070 --> 07:12:34,131
Dấu gạch chéo tên, Enter, tìm thấy.

7488
07:12:34,131 --> 07:12:39,651
Và để kiểm tra sự tỉnh táo, hãy\n

7489
07:12:39,651 --> 07:12:43,371
Đang tìm kiếm Hermione\nsau khi biên dịch lại mã

7490
07:12:44,931 --> 07:12:46,640
Và trên thực tế, cô ấy không được tìm thấy.

7491
07:12:46,640 --> 07:12:49,580
Vì vậy, đây chỉ là một cách thực hiện tương tự của tìm kiếm tuyến tính

7492
07:12:49,580 --> 07:12:53,930
lần này không dành cho số nguyên\nmà thay vào đó là chuỗi

7493
07:12:53,931 --> 07:12:57,501
sự tinh tế mà chúng ta thực sự cần\n

7494
07:12:57,501 --> 07:13:02,001
để thực sự làm công việc đó cho chúng tôi\n

7495
07:13:02,001 --> 07:13:05,568
Được rồi, câu hỏi về một trong hai điều này\n

7496
07:13:05,568 --> 07:13:07,253
KHÁN GIẢ: Vì vậy, nếu tôi làm [KHÔNG NGHE ĐƯỢC]

7497
07:13:07,253 --> 07:13:08,460
DAVID J. Malan: À, câu hỏi hay.

7498
07:13:08,460 --> 07:13:12,620
Nếu tôi không sửa những gì tôi đã khẳng định\n

7499
07:13:12,620 --> 07:13:15,201
và thực ra chúng tôi đã thấy một ví dụ về\nđiều này vào tuần trước.

7500
07:13:15,201 --> 07:13:21,831
Nếu một hàm trả về một số nguyên,\n

7501
07:13:21,830 --> 07:13:25,100
khi bạn quay về 0,\nbiểu thức, biểu thức Boolean

7502
07:13:29,300 --> 07:13:33,830
Nếu một hàm trả về bất kỳ số dương nào\n

7503
07:13:33,830 --> 07:13:37,130
thậm chí điều đó sẽ được\nhiểu là đúng

7504
07:13:37,131 --> 07:13:41,871
nếu nó là tích cực hay tiêu cực, dù\n

7505
07:13:41,870 --> 07:13:45,931
Và vì vậy nếu tôi làm điều này,\nđiều này sẽ nói ngược lại.

7506
07:13:45,931 --> 07:13:51,291
Vì vậy nếu tôi phải nói điều này, nếu str so sánh\n

7507
07:13:51,291 --> 07:13:57,754
ngầm thích nói điều này không\n

7508
07:13:57,754 --> 07:14:00,171
nhưng bạn không muốn kiểm tra\nsự thật bởi vì, một lần nữa, chúng ta

7509
07:14:01,710 --> 07:14:05,361
Vậy lý do tôi làm 0\nở đây trong trường hợp này là

7510
07:14:05,361 --> 07:14:08,971
rằng nó kiểm tra việc trả lại một cách rõ ràng\n

7511
07:14:15,309 --> 07:14:17,351
DAVID J. Malan: Vâng, có thể bạn\nchưa thấy cái này

7512
07:14:17,350 --> 07:14:20,940
nhưng bạn có thể diễn đạt\tương đương bởi vì nếu bạn

7513
07:14:20,940 --> 07:14:24,661
muốn kiểm tra xem điều này có\nsai hay không, thực ra bạn có thể

7514
07:14:24,661 --> 07:14:27,661
sử dụng dấu chấm than,\được gọi là dấu chấm than trong lập trình

7515
07:14:29,320 --> 07:14:32,524
Vì thế sai trở thành đúng,\ntrue trở thành sai.

7516
07:14:32,524 --> 07:14:34,441
Vì vậy đây sẽ là một\ncách khác để thể hiện nó.

7517
07:14:34,440 --> 07:14:39,300
Tuy nhiên, đây được cho là một thiết kế tệ hơn,\n

7518
07:14:39,300 --> 07:14:43,021
nói rằng bạn nên kiểm tra\ntìm giá trị 0 hoặc dương

7519
07:14:43,021 --> 07:14:46,111
hoặc một giá trị âm, và\nthủ thuật nhỏ này, mặc dù đúng

7520
07:14:46,111 --> 07:14:49,861
và tôi nghĩ bạn có thể đưa ra một giải pháp hợp lý\n

7521
07:14:49,861 --> 07:14:51,780
Và thay vào đó tôi sẽ tranh luận\ntheo cách đầu tiên

7522
07:14:51,780 --> 07:14:53,968
thay vào đó hãy kiểm tra bằng 0.

7523
07:14:53,968 --> 07:14:55,800
Và nếu điều đó hơi\ntinh tế thì cũng đừng lo lắng.

7524
07:14:55,800 --> 07:15:00,600
Chúng ta sẽ quay lại với cú pháp nhỏ\n

7525
07:15:00,600 --> 07:15:05,130
Các câu hỏi khác về tìm kiếm tuyến tính\ntrong hai dạng này.

7526
07:15:05,131 --> 07:15:06,811
Có bàn tay hay bàn tay nào khác không?

7527
07:15:08,971 --> 07:15:10,261
Được rồi, cứ hét lên nếu tôi trượt.

7528
07:15:10,260 --> 07:15:12,372
Vì vậy bây giờ chúng ta hãy thực sự tiến\nbước này thêm một bước nữa.

7529
07:15:12,372 --> 07:15:15,330
Giả sử chúng ta muốn viết một\n

7530
07:15:15,330 --> 07:15:19,470
giống một cuốn danh bạ điện thoại hơn một chút\n

7531
07:15:19,471 --> 07:15:21,390
chỉ là số nguyên mà là số điện thoại thực tế.

7532
07:15:21,390 --> 07:15:23,701
Chà, chúng ta có thể leo thang\nnhững việc như thế này.

7533
07:15:23,701 --> 07:15:27,210
Bây giờ chúng ta có thể có hai mảng-- một\n

7534
07:15:27,210 --> 07:15:29,730
Và bây giờ tôi sẽ sử dụng\nstrings cho các con số

7535
07:15:29,730 --> 07:15:32,370
số điện thoại, bởi vì\n hầu hết các cộng đồng

7536
07:15:32,370 --> 07:15:36,091
số điện thoại có thể có dấu gạch ngang,\n

7537
07:15:36,091 --> 07:15:39,390
nó thực sự trông giống một chuỗi hơn\n

7538
07:15:39,390 --> 07:15:42,940
Có lẽ không muốn sử dụng int kẻo\n

7539
07:15:42,940 --> 07:15:47,521
Vì vậy, hãy để tôi chuyển về Mã VS ở đây,\n

7540
07:15:47,521 --> 07:15:49,394
trong một tập tin có tên phonebook.c.

7541
07:15:49,394 --> 07:15:51,061
Và bây giờ hãy để tôi tiếp tục và làm điều tương tự.

7542
07:15:52,741 --> 07:15:58,681
Hãy để tôi bao gồm Standardio.h,\nvà hãy để tôi bao gồm string.h.

7543
07:15:58,681 --> 07:16:01,741
Tôi sẽ lại làm int main void.

7544
07:16:01,741 --> 07:16:05,071
Và sau đó bên trong chương trình của tôi, tôi\n

7545
07:16:06,870 --> 07:16:09,361
Tên chuỗi lần này sẽ\nchỉ có hai chúng ta.

7546
07:16:12,751 --> 07:16:15,241
Và sau đó tôi sẽ tự cho mình--\noop, lỗi đánh máy rồi.

7547
07:16:15,241 --> 07:16:18,151
Nếu tôi muốn đây là một mảng, tôi\n

7548
07:16:18,151 --> 07:16:19,741
Trình biên dịch có thể đếm giúp tôi.

7549
07:16:19,741 --> 07:16:21,661
Nhưng tôi cần dấu ngoặc vuông.

7550
07:16:21,661 --> 07:16:28,111
Sau đó, để biết các con số, tôi lại tiếp tục\n

7551
07:16:28,111 --> 07:16:33,870
dấu ngoặc nhọn thì sao\nCarter có thể ở số 1-617-495-1000.

7552
07:16:33,870 --> 07:16:35,640
Còn số của tôi thì sao--

7553
07:16:35,640 --> 07:16:39,361
1-949-468-- ồ hình mẫu xuất hiện--

7554
07:16:42,960 --> 07:16:44,890
À, tôi chỉ đang sắp xếp mọi thứ thôi.

7555
07:16:44,890 --> 07:16:47,820
Vậy số của Carter dường như là số đầu tiên trong mảng này

7556
07:16:47,820 --> 07:16:51,161
và tôi khẳng định rằng anh ấy sẽ\n

7557
07:16:51,161 --> 07:16:53,971
Tôi, David, sẽ là người đầu tiên--\nngười thứ hai trong mảng tên

7558
07:16:53,971 --> 07:16:56,628
và thứ hai trong mảng số.

7559
07:16:56,628 --> 07:16:59,460
Nếu bạn muốn vui vẻ một chút\n

7560
07:16:59,460 --> 07:17:01,630
hoặc gọi cho tôi vào lúc nào đó theo số đó.

7561
07:17:01,631 --> 07:17:05,311
Vì vậy bây giờ chúng ta hãy thực sự sử dụng\ndữ liệu này theo một cách nào đó.

7562
07:17:05,311 --> 07:17:08,729
Hãy tiếp tục và thực sự tìm kiếm\n

7563
07:17:11,850 --> 07:17:16,450
Lần này có hai chúng tôi-- nên tôi ít hơn\n

7564
07:17:16,451 --> 07:17:18,841
Và bây giờ tôi sẽ thực hành\nnhững gì tôi đã giảng trước đó

7565
07:17:18,841 --> 07:17:22,800
và tôi sẽ sử dụng str so sánh\nđể tìm tên của mình trong trường hợp này.

7566
07:17:22,800 --> 07:17:29,460
Và tôi sẽ nói nếu strcmp của tên\n

7567
07:17:29,460 --> 07:17:33,100
và nó bằng 0,\ncó nghĩa là chúng giống nhau

7568
07:17:33,100 --> 07:17:35,970
thì cũng giống như trước đây, tôi sẽ\n

7569
07:17:35,971 --> 07:17:37,681
Nhưng lần này, tôi sẽ\nlàm cho chương trình trở nên hữu ích hơn

7570
07:17:37,681 --> 07:17:39,460
và không chỉ nói tìm thấy hoặc không tìm thấy.

7571
07:17:39,460 --> 07:17:43,411
Bây giờ tôi đang triển khai danh bạ điện thoại, chẳng hạn như\n

7572
07:17:43,411 --> 07:17:46,741
Vì vậy tôi sẽ nói điều gì đó\nnhư, trích dẫn, bỏ trích dẫn, tìm thấy phần trăm

7573
07:17:46,741 --> 07:17:53,191
s dấu gạch chéo ngược n và sau đó thực sự\ncắm vào khung số i

7574
07:17:53,190 --> 07:17:56,730
tương ứng với\ndấu ngoặc tên hiện tại i.

7575
07:17:56,730 --> 07:17:58,585
Và sau đó tôi sẽ trả về 0 như trước.

7576
07:17:58,585 --> 07:18:00,960
Và sau đó xuống đây nếu chúng ta\nđi hết vòng lặp

7577
07:18:00,960 --> 07:18:04,480
và David không có ở đó vì lý do nào đó,\n

7578
07:18:05,940 --> 07:18:10,950
Vậy hãy để tôi tiếp tục và biên dịch cái này\n

7579
07:18:10,951 --> 07:18:13,601
và có vẻ như nó đã tìm thấy con số.

7580
07:18:13,600 --> 07:18:17,490
Vì vậy, mã này tôi sắp xác nhận là chính xác.

7581
07:18:17,491 --> 07:18:20,551
Thật là ngu ngốc vì tôi đã\n

7582
07:18:20,550 --> 07:18:22,050
ứng dụng chỉ hỗ trợ hai người.

7583
07:18:22,050 --> 07:18:23,863
Họ sẽ chỉ có tôi và Carter.

7584
07:18:23,864 --> 07:18:26,281
Việc này giống như tải xuống\nứng dụng danh bạ trên điện thoại

7585
07:18:26,280 --> 07:18:28,198
và bạn chỉ có thể gọi\nhai người trên thế giới.

7586
07:18:28,198 --> 07:18:30,181
Không có khả năng\nthêm tên hoặc chỉnh sửa mọi thứ.

7587
07:18:30,181 --> 07:18:33,221
Tất nhiên, điều đó có thể đến sau\n

7588
07:18:33,221 --> 07:18:35,054
Nhưng bây giờ để thảo luận, tôi đã

7589
07:18:35,054 --> 07:18:37,811
chỉ cần mã hóa cứng hai\ntên và hai số.

7590
07:18:37,811 --> 07:18:40,651
Nhưng với những gì nó làm được, tôi\ncho rằng điều này đúng.

7591
07:18:40,651 --> 07:18:43,951
Nó sẽ tìm thấy tôi\nvà in ra số của tôi.

7592
07:18:45,841 --> 07:18:49,921
Bây giờ chúng ta hãy bắt đầu xem xét liệu\nchúng ta không chỉ sử dụng mảng

7593
07:18:49,920 --> 07:18:52,212
nhưng chúng ta có đang sử dụng chúng không?

7594
07:18:52,212 --> 07:18:55,170
Chúng tôi đã bắt đầu sử dụng chúng vào tuần trước,\n

7595
07:18:55,170 --> 07:18:59,040
Và tôi thậm chí có thể có ý gì khi\nsử dụng tốt một mảng hoặc thiết kế

7596
07:19:01,001 --> 07:19:06,300
Mọi lời phê bình hoặc quan ngại\nvề lý do tại sao điều này có thể không

7597
07:19:06,300 --> 07:19:08,460
hãy là con đường tốt nhất để chúng ta đi xuống khi

7598
07:19:08,460 --> 07:19:12,900
Tôi muốn triển khai một cái gì đó giống như\n

7599
07:19:12,901 --> 07:19:15,901
Có vẻ như tất cả đều dễ bị tổn thương\nchỉ là những sai lầm.

7600
07:19:15,901 --> 07:19:19,981
Ví dụ, nếu tôi làm hỏng\n thực tế

7601
07:19:19,980 --> 07:19:24,550
sao cho bây giờ nó nhiều hơn hoặc ít hơn\n

7602
07:19:24,550 --> 07:19:27,780
cảm giác như không có gì chặt chẽ\n

7603
07:19:27,780 --> 07:19:31,501
dữ liệu và đó chỉ là\n tin tưởng vào hệ thống danh dự

7604
07:19:31,501 --> 07:19:37,800
rằng bất cứ lúc nào tôi sử dụng khung tên i\n

7605
07:19:38,521 --> 07:19:40,440
Nếu bạn là người viết\nmã, có thể bạn

7606
07:19:40,440 --> 07:19:42,001
sẽ không thực sự làm hỏng chuyện này.

7607
07:19:42,001 --> 07:19:44,626
Nhưng nếu bạn bắt đầu cộng tác\nvới người khác hoặc chương trình

7608
07:19:44,626 --> 07:19:48,061
đang trở nên lâu hơn rất nhiều,\n

7609
07:19:48,061 --> 07:19:52,471
hãy nhớ rằng bạn chỉ là\n

7610
07:19:52,471 --> 07:19:54,781
như thế này cuối cùng sẽ thất bại.

7611
07:19:54,780 --> 07:19:57,900
Ai đó sẽ không nhận ra điều đó,\n

7612
07:19:57,901 --> 07:20:00,901
Và bạn sẽ bắt đầu đặt\n

7613
07:20:00,901 --> 07:20:05,070
nghĩa là sẽ tốt hơn nhiều nếu\n

7614
07:20:05,070 --> 07:20:09,210
các mẩu dữ liệu, tên và số,\n

7615
07:20:09,210 --> 07:20:13,260
rằng bạn không chỉ tin tưởng vào điều đó\n

7616
07:20:13,260 --> 07:20:16,990
và các con số có mối quan hệ như vậy với chính chúng.

7617
07:20:16,991 --> 07:20:19,561
Vì vậy, hãy xem xét\nchúng ta có thể giải quyết vấn đề này như thế nào.

7618
07:20:19,561 --> 07:20:23,761
Hôm nay chúng tôi sẽ giới thiệu một tính năng mới\n

7619
07:20:23,760 --> 07:20:27,640
Trong C, chúng ta có khả năng\phát minh ra các kiểu dữ liệu của riêng mình

7620
07:20:27,640 --> 07:20:30,916
nếu bạn muốn-- các kiểu dữ liệu\nmà tác giả của C thập kỷ

7621
07:20:30,916 --> 07:20:32,791
trước đây chỉ không hình dung\cũng không hề nghĩ tới

7622
07:20:32,791 --> 07:20:36,241
là cần thiết vì chúng tôi có thể triển khai\n

7623
07:20:36,241 --> 07:20:38,641
giống như bạn có thể tạo\ncác mảnh ghép tùy chỉnh

7624
07:20:38,640 --> 07:20:40,721
hoặc trong C, bạn có thể tạo\ncác hàm tùy chỉnh.

7625
07:20:40,721 --> 07:20:45,121
Vậy trong C, bạn có thể tạo\nloại dữ liệu của riêng mình không

7626
07:20:45,120 --> 07:20:49,260
vượt xa ints\nand tích hợp và thậm chí cả chuỗi?

7627
07:20:49,260 --> 07:20:54,900
Ví dụ: bạn có thể tạo một\n

7628
07:20:54,901 --> 07:20:57,451
nhập vào ngữ cảnh\nelections hoặc kiểu dữ liệu cá nhân

7629
07:20:57,451 --> 07:21:00,311
tổng quát hơn có thể có tên và số.

7630
07:21:02,080 --> 07:21:07,830
Thôi để tôi vào đây và cầu hôn\n

7631
07:21:07,830 --> 07:21:11,280
Sẽ thật tuyệt nếu chúng ta\ncó được kiểu dữ liệu cá nhân

7632
07:21:11,280 --> 07:21:13,830
và sau đó chúng ta có thể có mảng\nan được gọi là người?

7633
07:21:13,830 --> 07:21:17,130
Và có lẽ mảng đó là mảng\nonly của chúng tôi có hai thứ

7634
07:21:19,561 --> 07:21:22,501
Nhưng bằng cách nào đó, những kiểu dữ liệu đó, những người này

7635
07:21:22,501 --> 07:21:25,519
sẽ có cả tên và số\n được liên kết với chúng.

7636
07:21:25,519 --> 07:21:27,061
Vì vậy chúng ta không cần hai mảng riêng biệt.

7637
07:21:27,061 --> 07:21:31,601
Chúng tôi cần một nhóm người,\na kiểu dữ liệu hoàn toàn mới.

7638
07:21:33,251 --> 07:21:35,431
Chà, nếu chúng ta muốn mọi\nngười trên thế giới

7639
07:21:35,431 --> 07:21:37,681
hoặc trong chương trình này\ncó tên và số

7640
07:21:37,681 --> 07:21:40,741
theo nghĩa đen, chúng tôi loại bỏ\nđầu tiên hai loại dữ liệu đó.

7641
07:21:40,741 --> 07:21:42,221
Hãy cho tôi một chuỗi tên là name.

7642
07:21:42,221 --> 07:21:45,211
Đưa cho tôi một chuỗi tên là\nsố chấm phẩy, sau mỗi chuỗi.

7643
07:21:45,210 --> 07:21:48,390
Và sau đó chúng tôi gói nó lại,\nhai dòng mã đó

7644
07:21:48,390 --> 07:21:51,091
với cú pháp này, thoạt nhìn có vẻ hơi khó hiểu.

7645
07:21:51,091 --> 07:21:52,771
Đột nhiên có rất nhiều từ.

7646
07:21:52,771 --> 07:21:57,091
Nhưng typedef ngày nay là một từ khóa mới\nxác định một kiểu dữ liệu mới.

7647
07:21:57,091 --> 07:22:00,870
Đây là từ khóa C\ncho phép bạn tạo dữ liệu của riêng mình

7648
07:22:00,870 --> 07:22:02,460
gõ lần đầu tiên.

7649
07:22:02,460 --> 07:22:07,201
Cấu trúc là một từ khóa liên quan khác\n

7650
07:22:07,201 --> 07:22:11,671
một kiểu dữ liệu đơn giản, như int hoặc a\n

7651
07:22:13,300 --> 07:22:17,070
Nó có một số kích thước, như\n

7652
07:22:17,070 --> 07:22:19,620
hoặc thậm chí 50 thứ bên trong nó.

7653
07:22:19,620 --> 07:22:23,670
Từ cuối cùng ở đây là tên\n

7654
07:22:23,670 --> 07:22:26,340
và điều kỳ lạ là nó lại đi sau dấu ngoặc nhọn.

7655
07:22:26,341 --> 07:22:30,120
Nhưng đây là cách bạn tạo ra\na kiểu dữ liệu được gọi là người.

7656
07:22:30,120 --> 07:22:33,030
Và ý nghĩa của đoạn mã này\ngụ ý là từ nay về sau

7657
07:22:33,030 --> 07:22:38,341
tiếng kêu của trình biên dịch sẽ biết rằng a\n

7658
07:22:38,341 --> 07:22:41,131
một chuỗi và một số là một chuỗi.

7659
07:22:41,131 --> 07:22:44,131
Và bây giờ bạn không phải lo lắng\nvề việc có nhiều mảng.

7660
07:22:44,131 --> 07:22:48,311
Bạn chỉ có thể có một mảng\nngười tiến về phía trước.

7661
07:22:48,311 --> 07:22:50,279
Vậy làm thế nào chúng ta có thể sử dụng điều này?

7662
07:22:50,278 --> 07:22:52,320
Vâng, hãy để tôi quay lại\nmã của tôi trước đó ở đâu

7663
07:22:52,320 --> 07:22:53,701
Tôi đang thực hiện một danh bạ điện thoại.

7664
07:22:53,701 --> 07:22:56,076
Và tại sao chúng ta không nâng cao\nmã danh bạ điện thoại lên một chút

7665
07:22:56,076 --> 07:22:58,591
bằng cách mượn một số cú pháp mới đó?

7666
07:22:58,591 --> 07:23:01,081
Hãy để tôi đi lên đầu\nchương trình của tôi phía trên chương trình chính

7667
07:23:01,080 --> 07:23:04,020
và xác định một kiểu có cấu trúc hoặc dữ liệu

7668
07:23:04,021 --> 07:23:08,861
cấu trúc có tên bên trong\n

7669
07:23:08,861 --> 07:23:12,511
Và tên của cấu trúc mới này\n

7670
07:23:12,510 --> 07:23:17,911
Bây giờ bên trong mã của tôi, hãy để tôi tiếp tục\n

7671
07:23:17,911 --> 07:23:21,870
Hãy để tôi tạo cho mình một mảng\nđược gọi là những người có kích thước 2.

7672
07:23:21,870 --> 07:23:25,358
Và tôi sẽ sử dụng\ncách ngắn gọn để làm điều này.

7673
07:23:25,358 --> 07:23:26,940
Tôi sẽ không sử dụng dấu ngoặc nhọn.

7674
07:23:26,940 --> 07:23:31,501
Tôi sẽ đánh vần một cách khoa trương hơn\n

7675
07:23:31,501 --> 07:23:35,221
tại vị trí 0, là\nngười đầu tiên trong một mảng

7676
07:23:35,221 --> 07:23:37,051
bởi vì bạn luôn bắt đầu đếm từ 0.

7677
07:23:37,050 --> 07:23:40,861
Tôi sẽ đặt cho người đó\na tên của trích dẫn không trích dẫn Carter.

7678
07:23:40,861 --> 07:23:44,341
Và phải thừa nhận rằng dấu chấm ngày nay cũng là một\ncú pháp mới.

7679
07:23:44,341 --> 07:23:46,771
Dấu chấm có nghĩa là đi vào bên trong\ncấu trúc đó

7680
07:23:46,771 --> 07:23:50,550
và truy cập vào biến có tên\n

7681
07:23:50,550 --> 07:23:52,710
Tương tự, nếu tôi\ncho Carter một số

7682
07:23:52,710 --> 07:23:57,390
Tôi có thể đi vào dấu ngoặc người 0 chấm\n

7683
07:23:57,390 --> 07:24:02,310
như trước cộng thêm 1-617-495-1000.

7684
07:24:02,311 --> 07:24:04,591
Và sau đó tôi có thể tự làm\nđiều tương tự ở đây--

7685
07:24:04,591 --> 07:24:08,506
mọi người trong khung-- tôi nên đi đâu?

7686
07:24:08,506 --> 07:24:10,468
Được rồi, một vì một lần nữa, hai yếu tố.

7687
07:24:10,468 --> 07:24:11,800
Nhưng chúng tôi bắt đầu đếm từ số 0.

7688
07:24:11,800 --> 07:24:13,780
Tên khung bằng trích dẫn không trích dẫn David.

7689
07:24:13,780 --> 07:24:18,700
Và cuối cùng, mọi người đóng khung 1\n

7690
07:24:24,730 --> 07:24:27,611
Vì vậy bây giờ nếu tôi cuộn\nxuống đây để tìm logic của mình

7691
07:24:27,611 --> 07:24:30,491
Tôi nghĩ phần này\nkhông cần phải thay đổi quá nhiều.

7692
07:24:30,491 --> 07:24:35,041
Để thảo luận, tôi vẫn tiếp tục,\n

7693
07:24:35,041 --> 07:24:37,991
là 0 cho đến nhưng không qua 2.

7694
07:24:37,991 --> 07:24:41,031
Nhưng tôi nghĩ dòng\nof code này cần phải thay đổi.

7695
07:24:41,030 --> 07:24:49,271
Bây giờ tôi nên gọi tên người thứ n như thế nào khi tôi lặp lại?

7696
07:24:49,271 --> 07:24:52,611
Tôi nên so sánh câu trích dẫn\nunquote David với điều gì vào lúc này?

7697
07:24:54,411 --> 07:24:57,438
ĐỐI TƯỢNG: Người trong khung tôi chấm tên.

7698
07:24:57,438 --> 07:24:59,230
DAVID J. Malan: Vâng, mọi người\nngoặc tôi chấm tên.

7699
07:24:59,530 --> 07:25:01,198
Bởi vì mọi người là tên của mảng.

7700
07:25:01,198 --> 07:25:04,841
Dấu ngoặc i là người thứ i mà chúng ta\n

7701
07:25:04,841 --> 07:25:07,600
đầu tiên là 0, sau đó là một,\ncó thể cao hơn nếu có nhiều người hơn.

7702
07:25:07,600 --> 07:25:10,931
Sau đó, dấu chấm là cú pháp mới của chúng tôi để\nđi vào bên trong cấu trúc dữ liệu

7703
07:25:10,931 --> 07:25:14,230
và truy cập vào một biến trong đó\ntrong trường hợp này là tên.

7704
07:25:14,230 --> 07:25:16,640
Và vì vậy tôi có thể so sánh\nDavid giống như trước đây.

7705
07:25:16,640 --> 07:25:21,251
Vì vậy nó dài dòng hơn một chút, nhưng\n

7706
07:25:21,251 --> 07:25:26,831
bởi vì bây giờ những người này đã đầy\n

7707
07:25:26,830 --> 07:25:29,170
Không còn hệ thống danh dự\ntrong vòng lặp của tôi nữa

7708
07:25:29,170 --> 07:25:31,462
rằng cái này sẽ được xếp hàng\nvì chỉ trong giây lát nữa thôi

7709
07:25:31,462 --> 07:25:34,227
Tôi sẽ sửa lỗi này\ncòn sót lại của phiên bản trước.

7710
07:25:34,227 --> 07:25:36,310
Và nếu tôi có thể gọi lại\nbạn lần nữa, tôi nên làm gì

7711
07:25:36,311 --> 07:25:39,191
thay đổi số khung i sang thời điểm này?

7712
07:25:39,190 --> 07:25:45,120
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC] số chấm.

7713
07:25:45,120 --> 07:25:46,751
DAVID J. Malan: Chính xác là số chấm.

7714
07:25:46,751 --> 07:25:49,300
Vậy là hệ thống danh dự\n chỉ giả định đã biến mất

7715
07:25:49,300 --> 07:25:52,420
dấu ngoặc i trong mảng này thẳng hàng\n

7716
07:25:54,791 --> 07:25:56,351
Đó là một mảng được gọi là mọi người.

7717
07:25:56,350 --> 07:25:58,420
Những thứ nó lưu trữ là con người.

7718
07:25:58,420 --> 07:26:00,161
Một người có tên và một số.

7719
07:26:00,161 --> 07:26:02,578
Và vì vậy, mặc dù phải thừa nhận là nó hơi nhỏ

7720
07:26:02,578 --> 07:26:05,411
rằng đây là một chương trình ngắn và\n

7721
07:26:05,411 --> 07:26:07,661
trông phức tạp hơn\nang nhìn qua thì chúng ta

7722
07:26:07,661 --> 07:26:10,901
hiện đang đặt nền móng cho\n

7723
07:26:10,901 --> 07:26:13,541
bây giờ không thể làm hỏng\sự liên kết của những cái tên

7724
07:26:13,541 --> 07:26:17,140
bằng những con số vì\n của mỗi người

7725
07:26:17,140 --> 07:26:21,070
được gói gọn bên trong\n cùng một kiểu dữ liệu.

7726
07:26:21,070 --> 07:26:22,631
Và đó là một thuật ngữ nghệ thuật trong CS.

7727
07:26:22,631 --> 07:26:26,081
Đóng gói có nghĩa là\đóng gói-- nghĩa là chứa--

7728
07:26:26,080 --> 07:26:28,190
những thông tin có liên quan.

7729
07:26:28,190 --> 07:26:34,030
Và do đó, chúng ta có một người\n

7730
07:26:34,811 --> 07:26:36,671
Và điều này chỉ đặt\nnền tảng cho tất cả

7731
07:26:36,670 --> 07:26:39,550
về những thứ thú vị mà chúng ta đã nói\nvà bạn sử dụng hàng ngày.

7732
07:26:40,353 --> 07:26:43,271
Chà, hãy nhớ rằng một hình ảnh là một bó\n

7733
07:26:43,271 --> 07:26:46,931
Mỗi một dấu chấm\nha có giá trị RGB được liên kết

7734
07:26:46,931 --> 07:26:48,791
với nó-- đỏ, lục và lam.

7735
07:26:48,791 --> 07:26:52,121
Bạn có thể tưởng tượng bây giờ việc tạo cấu trúc\na trong C có thể là ở đâu

7736
07:26:52,120 --> 07:26:55,900
có thể bạn có ba giá trị,\nba biến-- một biến được gọi là màu đỏ

7737
07:26:55,901 --> 07:26:57,761
một cái gọi là xanh lá cây, một cái gọi là xanh lam.

7738
07:26:57,760 --> 07:27:00,341
Và sau đó bạn có thể đặt tên\nthứ đó không phải con người mà là pixel.

7739
07:27:00,341 --> 07:27:04,271
Và bây giờ bạn có thể lưu trữ trong C ba\n

7740
07:27:04,271 --> 07:27:08,338
một số màu xanh lá cây, một số màu xanh lam-- và gọi chung\n

7741
07:27:08,338 --> 07:27:11,381
Và bạn có thể tưởng tượng mình đang làm điều gì đó\n

7742
07:27:11,381 --> 07:27:14,800
Âm nhạc, bạn có thể có ba\n

7743
07:27:14,800 --> 07:27:17,021
thời lượng, độ ồn của nó.

7744
07:27:17,021 --> 07:27:20,480
Và bạn có thể tưởng tượng việc nghĩ ra\n

7745
07:27:20,480 --> 07:27:21,730
Vì thế đây là mức độ hơi thấp.

7746
07:27:21,730 --> 07:27:24,280
Chúng tôi chỉ đang sử dụng một\nứng dụng danh bạ quen thuộc.

7747
07:27:24,280 --> 07:27:28,630
Nhưng giờ đây chúng ta đã có cách trong mã\nđể thể hiện hầu hết mọi loại dữ liệu

7748
07:27:28,631 --> 07:27:32,621
mà cuối cùng chúng ta có thể muốn thực hiện\cũng như thảo luận.

7749
07:27:32,620 --> 07:27:37,870
Vì vậy, bây giờ mọi câu hỏi về struct\nor xác định loại của riêng chúng ta

7750
07:27:37,870 --> 07:27:42,470
mục đích sử dụng\n

7751
07:27:42,471 --> 07:27:45,640
bây giờ ở một thiết kế tốt hơn nhưng\ncũng để đặt nền móng

7752
07:27:45,640 --> 07:27:50,240
để triển khai bộ làm mát và bộ làm mát\n

7753
07:27:50,741 --> 07:27:52,074
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] là gì

7754
07:27:52,074 --> 07:27:55,074
DAVID J. Malan: Có gì khác biệt\n

7755
07:27:55,911 --> 07:27:58,751
Vì vậy, cần lưu ý một chút, C\nis không hướng đối tượng.

7756
07:27:58,751 --> 07:28:02,350
Các ngôn ngữ như Java và C và\n

7757
07:28:02,350 --> 07:28:05,560
của, tự lập trình, có bạn bè\n

7758
07:28:05,561 --> 07:28:09,791
ngôn ngữ trong những ngôn ngữ họ có\n

7759
07:28:10,811 --> 07:28:14,381
Và các đối tượng có thể lưu trữ không chỉ dữ liệu, như các biến.

7760
07:28:14,381 --> 07:28:18,851
Các đối tượng cũng có thể lưu trữ các hàm và\n

7761
07:28:18,850 --> 07:28:20,740
Nhưng nó không phải là loại thông thường.

7762
07:28:20,741 --> 07:28:24,131
Trong C, bạn có cấu trúc dữ liệu lưu trữ dữ liệu.

7763
07:28:24,131 --> 07:28:29,140
Trong các ngôn ngữ như Java và C , bạn có\n

7764
07:28:29,771 --> 07:28:32,151
Python cũng là một ngôn ngữ hướng đối tượng.

7765
07:28:32,151 --> 07:28:35,631
Vì vậy, chúng ta sẽ thấy vấn đề này sau vài tuần nữa,\n

7766
07:28:36,131 --> 07:28:38,116
ĐỐI TƯỢNG: Bạn có thể\nsử dụng cái này [KHÔNG NGHE ĐƯỢC] được không?

7767
07:28:38,741 --> 07:28:41,381
Bạn có thể sử dụng cấu trúc này để\nxác định lại cách xác định int không?

7768
07:28:42,611 --> 07:28:46,061
Chúng tôi đã nói chuyện một vài lần\nvề vấn đề tràn số nguyên.

7769
07:28:46,061 --> 07:28:50,261
Và gần đây nhất, bạn có thể đã thấy\n

7770
07:28:50,260 --> 07:28:52,841
điều đó thực sự có liên quan\nvới lỗi tràn int.

7771
07:28:52,841 --> 07:28:57,251
Đó là kết quả của việc chỉ int\nlưu trữ 4 byte hoặc 32 bit

7772
07:28:57,251 --> 07:29:00,161
hoặc thậm chí dài tới 64 bit hoặc 8 byte.

7773
07:29:01,241 --> 07:29:03,881
Nhưng nếu bạn muốn triển khai\nmột số phần mềm tài chính

7774
07:29:03,881 --> 07:29:06,461
hoặc một số phần mềm khoa học hoặc toán học

7775
07:29:06,460 --> 07:29:10,330
cho phép bạn đếm lớn hơn\nso với một số nguyên thông thường hoặc một số dài

7776
07:29:10,330 --> 07:29:13,495
bạn có thể tưởng tượng John sẽ đến\nvới cấu trúc của riêng bạn.

7777
07:29:13,495 --> 07:29:15,620
Và trên thực tế, trong một số\nngôn ngữ có một cấu trúc

7778
07:29:15,620 --> 07:29:19,730
được gọi là big int, cho phép bạn\nbiểu thị những số lớn hơn nữa.

7779
07:29:20,330 --> 07:29:24,770
Vâng, có thể bạn lưu trữ bên trong\na con kiến ​​lớn một mảng các giá trị.

7780
07:29:24,771 --> 07:29:27,852
Và bằng cách nào đó bạn cho phép mình\nlưu trữ ngày càng nhiều bit

7781
07:29:27,852 --> 07:29:29,810
dựa trên mức độ bạn muốn có thể đếm được.

7782
07:29:30,830 --> 07:29:34,200
Bây giờ chúng tôi có khả năng thực hiện\n

7783
07:29:34,201 --> 07:29:36,561
ngay cả khi nó không được tích hợp sẵn cho chúng tôi.

7784
07:29:43,122 --> 07:29:45,830
DAVID J. Malan: Bạn có thể định nghĩa một cái tên\n

7785
07:29:46,430 --> 07:29:48,347
Nó bắt đầu hơi lộn xộn\về mặt cú pháp

7786
07:29:48,347 --> 07:29:51,590
vì vậy tôi đã làm nó nhiều hơn một chút\ntheo từng dòng một.

7787
07:29:52,791 --> 07:29:57,271
ĐỐI TƯỢNG: hàm [KHÔNG NGHE ĐƯỢC]\nbạn sử dụng cho hàm

7788
07:29:57,271 --> 07:29:59,701
ở cuối [KHÔNG NGHE ĐƯỢC].

7789
07:29:59,701 --> 07:30:03,389
Bạn có thể làm điều gì\nnhư thế [KHÔNG NGHE ĐƯỢC] được không??

7790
07:30:03,389 --> 07:30:05,759
DAVID J. Malan: Nguyên mẫu--\nbạn phải làm A và C. Bạn

7791
07:30:05,759 --> 07:30:09,389
phải xác định bất cứ điều gì bạn đang đi\n

7792
07:30:09,389 --> 07:30:11,139
sử dụng trước khi bạn thực sự sử dụng nó.

7793
07:30:11,139 --> 07:30:15,190
Vậy nên tôi cố ý đặt nó\n

7794
07:30:15,190 --> 07:30:19,230
Nếu không thì trình biên dịch sẽ không biết\n

7795
07:30:19,230 --> 07:30:22,111
sử dụng nó ở đây trên dòng 14.

7796
07:30:22,111 --> 07:30:25,840
Vì vậy nó phải đến trước hoặc nó phải đến\n

7797
07:30:25,840 --> 07:30:29,340
để bạn đưa nó vào\nđầu mã của mình.

7798
07:30:37,643 --> 07:30:39,350
DAVID J. Malan: Vâng,\ncâu hỏi hay, và chúng tôi sẽ

7799
07:30:39,350 --> 07:30:42,860
hãy quay lại vấn đề này sau trong học kỳ khi\n

7800
07:30:42,861 --> 07:30:44,991
và lưu trữ mọi thứ trong cơ sở dữ liệu thực tế.

7801
07:30:44,991 --> 07:30:48,681
Nói chung, mặc dù chúng ta\n

7802
07:30:48,681 --> 07:30:52,161
hoặc ở Mỹ, chúng tôi có an sinh xã hội\n

7803
07:30:52,161 --> 07:30:56,420
thường có dấu câu khác trong đó,\n

7804
07:30:57,741 --> 07:31:01,701
Bạn không thể lưu trữ bất kỳ cú pháp nào trong số đó\n

7805
07:31:01,701 --> 07:31:03,241
Bạn chỉ có thể lưu trữ số.

7806
07:31:03,241 --> 07:31:05,301
Vì vậy, một động lực cho việc\nsử dụng một chuỗi chỉ là

7807
07:31:05,300 --> 07:31:08,931
Tôi có thể lưu trữ bất cứ thứ gì con người muốn\n

7808
07:31:10,050 --> 07:31:13,789
Một lý do khác để\nlưu trữ mọi thứ dưới dạng chuỗi

7809
07:31:13,789 --> 07:31:15,831
ngay cả khi chúng trông giống\nnhững con số, nằm trong ngữ cảnh

7810
07:31:15,830 --> 07:31:17,448
mã vùng ở Hoa Kỳ.

7811
07:31:17,449 --> 07:31:18,741
Một lần nữa, chúng ta sẽ quay lại vấn đề này.

7812
07:31:18,741 --> 07:31:21,051
Nhưng nói ngắn gọn--\nthực ra là nhiều năm trước--

7813
07:31:21,050 --> 07:31:24,093
Tôi đang sử dụng Microsoft\nOutlook cho ứng dụng email của mình.

7814
07:31:24,093 --> 07:31:25,550
Và cuối cùng tôi đã chuyển sang Gmail.

7815
07:31:25,550 --> 07:31:27,260
Và điều này giống như hơn 10 năm trước.

7816
07:31:27,260 --> 07:31:31,790
Và Outlook tại thời điểm đó cho phép bạn xuất\n

7817
07:31:33,140 --> 07:31:34,971
Thông tin thêm về điều đó trong những tuần tới cũng vậy.

7818
07:31:34,971 --> 07:31:36,763
Và điều đó chỉ có nghĩa là tôi\ncó thể tải văn bản xuống

7819
07:31:36,762 --> 07:31:40,070
tập tin với tất cả bạn bè của tôi và\n

7820
07:31:40,070 --> 07:31:44,172
Thật không may, tôi cũng mở tệp CSV đó\n

7821
07:31:44,172 --> 07:31:46,130
chỉ để tìm ra\nkiểm tra xem có gì không

7822
07:31:46,131 --> 07:31:47,761
trong đó có những gì nó được mong đợi.

7823
07:31:47,760 --> 07:31:51,230
Và tôi hẳn đã đánh theo bản năng,\n

7824
07:31:51,230 --> 07:31:54,260
Và ít nhất Excel cũng có thói quen này\n

7825
07:31:54,260 --> 07:31:56,990
Nếu mọi thứ trông giống như những con số,\nit sẽ coi chúng là những con số.

7826
07:31:56,991 --> 07:31:58,401
Và Apple Numbers cũng làm được điều này.

7827
07:31:58,401 --> 07:32:00,441
Bảng tính Google\nthực hiện điều này cho đến ngày nay.

7828
07:32:00,440 --> 07:32:07,400
Nhưng tóm lại, tôi đã nhập\n

7829
07:32:07,401 --> 07:32:11,121
Và bây giờ hơn 10 năm sau, tôi vẫn\n

7830
07:32:11,120 --> 07:32:17,001
thành viên có mã zip ở\nCambridge, Massachusetts 2138

7831
07:32:17,001 --> 07:32:20,661
thiếu số 0 vì\nchúng tôi ở Cambridge này là 02138.

7832
07:32:20,661 --> 07:32:23,780
Và đó là do tôi\nđã xử lý hoặc tôi để Excel

7833
07:32:23,780 --> 07:32:26,990
coi những gì trông giống như một số\là số thực hoặc int

7834
07:32:26,991 --> 07:32:29,901
và bây giờ các số 0 đứng đầu trở thành một\n

7835
07:32:29,901 --> 07:32:33,261
không có ý nghĩa gì, nhưng trong hệ thống\nmail, chúng có--

7836
07:32:34,431 --> 07:32:36,013
Được rồi, những câu hỏi cuối cùng khác ở đây.

7837
07:32:39,021 --> 07:32:42,861
DAVID J. Malan: Vâng, vậy tôi có thể có\n

7838
07:32:42,861 --> 07:32:47,091
mảng để giải quyết vấn đề\gần như chỉ có một mảng?

7839
07:32:47,091 --> 07:32:51,111
Có, nhưng có một điều, tôi cho rằng\nit khó đọc hơn, đặc biệt là

7840
07:32:51,111 --> 07:32:53,001
vì tôi nhận được rất nhiều tên và số.

7841
07:32:53,001 --> 07:32:56,091
Và hai, điều đó cũng là một dạng dựa vào hệ thống danh dự.

7842
07:32:56,091 --> 07:32:59,300
Sẽ rất dễ dàng nếu bỏ qua một số\n

7843
07:33:00,300 --> 07:33:04,370
Vì vậy, tôi cho rằng điều đó cũng không tốt bằng việc giới thiệu một cấu trúc.

7844
07:33:05,541 --> 07:33:10,431
Mảng hai chiều chỉ có nghĩa\n

7845
07:33:10,431 --> 07:33:12,440
Được rồi, bây giờ\nchúng ta có khả năng này

7846
07:33:12,440 --> 07:33:16,570
để lưu trữ các loại dữ liệu khác nhau\nnhư danh bạ trong danh bạ điện thoại

7847
07:33:16,570 --> 07:33:18,320
có tên và\nđịa chỉ, thực ra hãy

7848
07:33:18,320 --> 07:33:21,140
hãy lùi lại một bước và\nxem xét xem bây giờ chúng ta có thể làm thế nào

7849
07:33:21,140 --> 07:33:26,210
giải quyết một trong những vấn đề ban đầu bằng\n

7850
07:33:26,210 --> 07:33:30,291
đưa ra trước và xem xét,\n

7851
07:33:30,291 --> 07:33:33,261
tốn kém, tốn thời gian như thế nào\nvì điều đó có thể dẫn đến

7852
07:33:33,260 --> 07:33:37,370
thang đo thiên về sắp xếp,\nsau đó tìm kiếm hoặc có thể chỉ

7853
07:33:37,370 --> 07:33:39,320
không sắp xếp và chỉ tìm kiếm.

7854
07:33:39,320 --> 07:33:42,830
Có thể nói là nó sẽ cho chúng ta cảm giác\nđắt đến mức nào

7855
07:33:42,830 --> 07:33:44,705
sắp xếp một cái gì đó thực sự là.

7856
07:33:44,705 --> 07:33:46,580
Chà,\ncông thức của vấn đề này là gì?

7857
07:33:46,580 --> 07:33:48,140
Nó giống như tuần thứ 0.

7858
07:33:49,311 --> 07:33:51,480
Chúng tôi muốn nó được xuất ra như đã sắp xếp.

7859
07:33:51,480 --> 07:33:54,920
Ví dụ: nếu chúng ta\nlấy thông tin đầu vào chưa được sắp xếp làm đầu vào

7860
07:33:54,920 --> 07:33:58,255
chúng tôi muốn kết quả được sắp xếp là\nkết quả. Cụ thể hơn

7861
07:33:58,256 --> 07:33:59,631
nếu chúng ta có những con số như thế này--

7862
07:33:59,631 --> 07:34:04,461
63852741, chỉ là những số được sắp xếp ngẫu nhiên--

7863
07:34:04,460 --> 07:34:08,870
chúng tôi muốn quay trở lại 12345678.

7864
07:34:08,870 --> 07:34:10,800
Vì vậy, chúng tôi chỉ muốn những thứ đó được sắp xếp.

7865
07:34:10,800 --> 07:34:12,830
Một lần nữa, bên trong\nhộp đen đây là

7866
07:34:12,830 --> 07:34:17,820
sẽ là một hoặc nhiều thuật toán\n

7867
07:34:17,820 --> 07:34:20,041
Vậy chúng ta có thể thực hiện việc này như thế nào?

7868
07:34:20,041 --> 07:34:23,541
Chà, chỉ để thay đổi mọi thứ một chút\n

7869
07:34:23,541 --> 07:34:25,941
để có thêm một chút sự tham gia của khán giả.

7870
07:34:25,940 --> 07:34:28,150
Nhưng lần này, nếu có thể, chúng tôi cần\ntám người.

7871
07:34:28,151 --> 07:34:30,651
Tất cả các bạn phải cảm thấy thoải mái\nkhi xuất hiện trên internet.

7872
07:34:30,651 --> 07:34:33,526
Được rồi, điều này thực ra khá ổn\n

7873
07:34:33,526 --> 07:34:37,113
Thế còn 1, 2, 3, 4, 5, 6, 7--

7874
07:34:37,113 --> 07:34:41,421
ồ, được rồi, và có người tình nguyện\nbạn của họ-- số tám.

7875
07:34:43,236 --> 07:34:45,111
Và nếu bạn có thể, tôi\nsẽ sắp xếp mọi thứ.

7876
07:34:45,111 --> 07:34:47,991
Nếu tất cả các bạn có thể tham gia cùng Valerie,\nđồng nghiệp của tôi ở đằng kia

7877
07:34:47,991 --> 07:34:53,271
để cung cấp cho bạn một chỗ dựa để sử dụng ở đây,\nchúng ta sẽ tiếp tục trong giây lát

7878
07:34:53,271 --> 07:34:56,195
và cố gắng tìm một số con số trong tầm tay.

7879
07:34:59,541 --> 07:35:05,181
Chỉ trong chốc lát, mỗi tình nguyện viên của chúng ta\n

7880
07:35:05,181 --> 07:35:09,741
Và số nguyên đó ban đầu\nsẽ ở dạng chưa được sắp xếp.

7881
07:35:09,741 --> 07:35:13,461
Và tôi khẳng định rằng việc sử dụng thuật toán\nhướng dẫn từng bước

7882
07:35:13,460 --> 07:35:18,181
chúng ta có thể sắp xếp những người này vào\n

7883
07:35:18,181 --> 07:35:22,791
Vậy là chúng hiện đang ở trong tủ quần áo\n

7884
07:35:22,791 --> 07:35:27,306
có số Jersey trên đó,\n

7885
07:35:31,010 --> 07:35:35,630
Hãy cho chúng tôi một chút thời gian để hoàn tất việc chuẩn bị sẵn sàng trang phục.

7886
07:35:35,631 --> 07:35:40,401
Họ đang được trao một chiếc áo sơ mi và một con số.

7887
07:35:40,401 --> 07:35:42,981
Và hãy để tôi hỏi khán giả một lát.

7888
07:35:42,980 --> 07:35:47,120
Vì chúng tôi có những con số này ở đây trên\n

7889
07:35:47,120 --> 07:35:48,713
Chúng chỉ theo thứ tự ngẫu nhiên.

7890
07:35:48,713 --> 07:35:49,881
Và hãy để tôi hỏi khán giả.

7891
07:35:49,881 --> 07:35:55,341
Bạn sẽ sắp xếp như thế nào\n

7892
07:35:55,341 --> 07:35:57,291
Bạn sẽ sắp xếp những thứ này như thế nào?

7893
07:35:57,291 --> 07:35:58,498
Vâng, suy nghĩ của bạn là gì?

7894
07:35:58,498 --> 07:36:04,687
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC] con số\n

7895
07:36:05,271 --> 07:36:08,907
ĐỐI TƯỢNG: Số sau đây là\n

7896
07:36:09,491 --> 07:36:11,161
KHÁN GIẢ: Nếu không thì [KHÔNG NGHE ĐƯỢC].

7897
07:36:11,161 --> 07:36:13,712
DAVID J. Malan: Được rồi, vậy\nđể tóm tắt lại, bạn sẽ bắt đầu

7898
07:36:13,712 --> 07:36:15,170
với một trong các số ở cuối.

7899
07:36:15,170 --> 07:36:17,570
Bạn sẽ nhìn vào số ở\nbên phải hoặc bên trái của nó

7900
07:36:17,570 --> 07:36:18,890
tùy thuộc vào việc bạn bắt đầu ở điểm cuối nào.

7901
07:36:18,890 --> 07:36:21,473
Và nếu nó không đúng thứ tự, bạn\nsẽ bắt đầu hoán đổi mọi thứ.

7902
07:36:22,710 --> 07:36:24,795
Có rất nhiều\nsai sót cần sửa ở đây

7903
07:36:24,795 --> 07:36:26,420
bởi vì mọi thứ đang khá lộn xộn.

7904
07:36:26,420 --> 07:36:29,420
Nhưng có lẽ, nếu bạn bắt đầu\ngiải quyết những vấn đề nhỏ tại một thời điểm

7905
07:36:29,420 --> 07:36:32,270
bạn có thể đạt được kết quả cuối cùng của\n

7906
07:36:32,271 --> 07:36:35,181
Những bản năng khác, nếu bạn\nđược trao những con số này thì làm sao

7907
07:36:35,181 --> 07:36:38,438
bạn có thể sắp xếp chúng?

7908
07:36:44,501 --> 07:36:46,280
DAVID J. Malan: Được rồi, tôi thích điều đó.

7909
07:36:46,280 --> 07:36:50,200
Vậy để tóm tắt lại ở đó, hãy tìm số nhỏ nhất\n

7910
07:36:51,431 --> 07:36:54,703
Và có lẽ bạn có thể làm được\n

7911
07:36:54,703 --> 07:36:57,411
Và điều đó dường như mang lại cho bạn\n

7912
07:36:57,411 --> 07:37:00,070
Và nếu tất cả các bạn đều mặc trang phục ở đây--

7913
07:37:00,070 --> 07:37:03,161
bạn có muốn lên\không lên nếu bạn đã sẵn sàng?

7914
07:37:03,161 --> 07:37:05,021
Chúng tôi đã có một số [? cảm thấy ?] tình nguyện viên quá.

7915
07:37:07,390 --> 07:37:09,881
Vì vậy, nếu tất cả các bạn muốn\nxếp hàng

7916
07:37:09,881 --> 07:37:12,131
quay mặt về phía khán giả theo\chính xác theo thứ tự này-- vì vậy

7917
07:37:12,131 --> 07:37:14,531
ai là số 0\nnên ở đây

7918
07:37:14,530 --> 07:37:18,070
và người thứ năm\nsẽ ở đằng kia.

7919
07:37:18,070 --> 07:37:21,280
Hãy thoải mái giữ khoảng cách xa nhất có thể\n

7920
07:37:24,013 --> 07:37:25,181
Và tạo thêm một chút chỗ trống.

7921
07:37:29,451 --> 07:37:31,094
DAVID J. Malan: 4, hy vọng là 1.

7922
07:37:31,094 --> 07:37:32,261
Vâng, giữ chúng sang một bên.

7923
07:37:38,050 --> 07:37:41,435
Được rồi, ở đây, chúng ta có\nan mảng tám số--

7924
07:37:41,436 --> 07:37:42,561
tám số nguyên nếu bạn muốn.

7925
07:37:42,561 --> 07:37:45,131
Và bạn có muốn mỗi người nói\na lời chào nhanh với nhóm không?

7926
07:38:05,080 --> 07:38:07,265
KHÁN GIẢ: Xin chào, tôi là\nCeleste và xin chào Strauss.

7927
07:38:08,140 --> 07:38:11,291
Chà, chào mừng tất cả mọi người lên sân khấu,\nvà hãy cùng hình dung

7928
07:38:11,291 --> 07:38:13,791
có lẽ về cơ bản bạn sẽ giải quyết vấn đề này như thế nào.

7929
07:38:13,791 --> 07:38:16,901
Vì vậy, hiện tại chúng tôi có các số\n0 đến 7 không theo thứ tự.

7930
07:38:16,901 --> 07:38:20,869
Bạn có thể tiếp tục và tự mình đi từ 0 đến 7 được không?

7931
07:38:25,760 --> 07:38:28,560
DAVID J. Malan: Được rồi, vậy họ vừa làm gì?

7932
07:38:29,061 --> 07:38:30,621
Trước hết, vâng, làm rất tốt.

7933
07:38:34,390 --> 07:38:37,398
Bạn sẽ mô tả\nnhững gì họ vừa làm như thế nào?

7934
07:38:38,230 --> 07:38:40,420
Bạn có thể quay lại\nthứ tự đó trên màn hình--

7935
07:38:44,681 --> 07:38:47,800
Và bạn có thể làm lại chính xác\nnhững gì bạn vừa làm không?

7936
07:38:58,550 --> 07:39:01,841
Được rồi, phải thừa nhận là có loại\n

7937
07:39:01,841 --> 07:39:05,510
ngoại trừ số bốn, đang làm gì đó\n

7938
07:39:05,510 --> 07:39:07,751
Và đó thực sự không phải là cách máy tính thường hoạt động.

7939
07:39:07,751 --> 07:39:11,260
Giống như máy tính chỉ có thể nhìn vào\n

7940
07:39:11,260 --> 07:39:15,850
tại một thời điểm, máy tính chỉ có thể di chuyển\n

7941
07:39:15,850 --> 07:39:18,077
một tủ đựng đồ, kiểm tra những gì\nở đó, di chuyển nó khi cần thiết.

7942
07:39:18,078 --> 07:39:21,161
Vậy hãy thử cách này một cách có phương pháp hơn\n

7943
07:39:21,161 --> 07:39:26,710
Nếu tất cả các bạn có thể chọn ngẫu nhiên\nchính mình lần nữa thành 52741630

7944
07:39:26,710 --> 07:39:29,122
trước tiên hãy thực hiện phương pháp thứ hai trong số những cách tiếp cận đó.

7945
07:39:29,122 --> 07:39:30,580
Tôi sẽ xem xét những con số này.

7946
07:39:30,580 --> 07:39:33,230
Và mặc dù tôi với tư cách là con người\nrõ ràng có thể nhìn thấy tất cả các con số

7947
07:39:33,230 --> 07:39:35,291
và tôi gần như có\trực giác về cách khắc phục vấn đề này

7948
07:39:35,291 --> 07:39:37,541
chúng ta phải có phương pháp hơn\nvì cuối cùng, chúng ta đã

7949
07:39:37,541 --> 07:39:39,861
phải dịch cái này sang\nmã giả rồi viết mã.

7950
07:39:40,751 --> 07:39:43,561
Tôi sẽ tìm kiếm, như bạn\nđề xuất, số nhỏ nhất.

7951
07:39:43,561 --> 07:39:45,311
Và tôi sẽ bắt đầu\ntừ trái sang phải.

7952
07:39:45,311 --> 07:39:48,461
Tôi có thể làm từ phải sang trái, nhưng sang trái\n

7953
07:39:48,460 --> 07:39:51,440
Được rồi, 5 tại thời điểm này là\ncon số nhỏ nhất tôi từng thấy.

7954
07:39:51,440 --> 07:39:54,179
Vì vậy, tôi sẽ ghi nhớ\nmột biến đó, nếu bạn muốn.

7955
07:39:54,179 --> 07:39:55,721
Bây giờ tôi sẽ tiến thêm một bước nữa--

7956
07:39:56,291 --> 07:39:59,621
Được rồi, 2 tôi sẽ so sánh với\n

7957
07:39:59,620 --> 07:40:03,521
Tôi sẽ quên khoảng 5 và chỉ\n

7958
07:40:04,181 --> 07:40:07,451
7, không-- Tôi sẽ bỏ qua điều đó\n

7959
07:40:08,170 --> 07:40:11,530
4, 1-- OK, tôi sẽ\ncập nhật biến này

7960
07:40:11,530 --> 07:40:12,790
bởi vì nó thực sự nhỏ hơn.

7961
07:40:12,791 --> 07:40:15,491
Rõ ràng là con người chúng ta\nbiết rằng điều đó đang trở nên khá nhỏ bé.

7962
07:40:16,541 --> 07:40:19,991
Tôi phải kiểm tra tất cả các giá trị để xem\n

7963
07:40:19,991 --> 07:40:22,796
vì 6 không phải, 3 không phải, mà 0 thì có.

7964
07:40:22,795 --> 07:40:23,920
Và tên bạn nữa là gì?

7965
07:40:25,631 --> 07:40:32,320
Celeste hoặc số 0 nên đi đâu\n

7966
07:40:32,320 --> 07:40:33,951
Được rồi, tôi thấy rất nhiều điều này.

7967
07:40:33,951 --> 07:40:37,181
Vì vậy, ở đầu mảng,\nso trước khi thực hiện việc này

7968
07:40:37,181 --> 07:40:38,921
hãy để bạn bật ra phía trước.

7969
07:40:38,920 --> 07:40:42,460
Và các bạn có thể thay đổi\nvà nhường chỗ cho Celeste không?

7970
07:40:42,460 --> 07:40:46,390
Đây có phải là một ý kiến hay nếu để tất cả\nchúng di chuyển hay tương đương

7971
07:40:46,390 --> 07:40:48,911
di chuyển mọi thứ trong mảng\nđể nhường chỗ cho Celeste

7972
07:40:52,030 --> 07:40:53,238
Điều đó có vẻ giống như rất nhiều công việc.

7973
07:40:53,239 --> 07:40:56,561
Và mặc dù nó đã xảy ra khá tốt\n

7974
07:40:56,561 --> 07:40:58,401
xảy ra chỉ để di chuyển cô ấy vào vị trí.

7975
07:40:58,401 --> 07:41:00,941
Vậy có lẽ điều gì sẽ thông minh hơn một chút--

7976
07:41:00,940 --> 07:41:03,320
có lẽ hiệu quả hơn một chút?

7977
07:41:07,414 --> 07:41:08,831
DAVID J. Malan: Được rồi, thay thế hai giá trị.

7978
07:41:08,830 --> 07:41:12,450
Vì vậy nếu bạn muốn quay lại nơi\n

7979
07:41:12,451 --> 07:41:13,921
anh ấy không ở đúng chỗ.

7980
07:41:13,920 --> 07:41:15,150
Cuối cùng thì anh ấy cũng phải di chuyển.

7981
07:41:15,859 --> 07:41:18,661
Nếu đó là nơi Celeste thuộc về,\ntại sao chúng ta không hoán đổi 5 và 0?

7982
07:41:18,661 --> 07:41:21,286
Vì vậy, nếu bạn muốn tiếp tục và\nđổi chỗ cho nhau.

7983
07:41:21,286 --> 07:41:22,591
Chú ý những gì vừa xảy ra.

7984
07:41:22,591 --> 07:41:25,780
Vấn đề tôi đang cố gắng\ngiải quyết đã trở nên nhỏ hơn.

7985
07:41:25,780 --> 07:41:28,380
Thay vì kích thước\n8 thì bây giờ là kích thước 7.

7986
07:41:28,381 --> 07:41:31,411
Bây giờ đã được chấp nhận, tôi đã chuyển 5 đến\nmột vị trí sai.

7987
07:41:31,411 --> 07:41:33,300
Nhưng nếu những con số này\nbắt đầu một cách ngẫu nhiên

7988
07:41:33,300 --> 07:41:37,150
việc 5 đi đâu không thực sự quan trọng\n

7989
07:41:38,401 --> 07:41:41,791
Và bây giờ nếu tôi quay lại, vòng lặp của tôi sẽ quay trở lại.

7990
07:41:41,791 --> 07:41:46,050
Tôi có thể bỏ qua Celeste và làm điều này\n

7991
07:41:46,050 --> 07:41:47,791
bởi vì tôi biết cô ấy đang ở đúng nơi.

7992
07:41:53,431 --> 07:41:57,960
Bây giờ tôi biết với tư cách là một con người, đây\nsẽ là điều nhỏ nhặt tiếp theo của tôi.

7993
07:41:57,960 --> 07:42:02,460
Nhưng theo trực giác, tại sao\ntôi nên tiếp tục, bạn nghĩ sao?

7994
07:42:02,460 --> 07:42:05,310
Tôi không thể tối ưu hóa như một\ncon người và chỉ nói, số 1

7995
07:42:05,311 --> 07:42:07,121
hãy đưa bạn đến đúng nơi.

7996
07:42:07,120 --> 07:42:08,970
Tôi vẫn muốn kiểm tra toàn bộ mảng.

7997
07:42:10,230 --> 07:42:12,837
KHÁN GIẢ: Có lẽ còn có 1 nữa.

7998
07:42:12,837 --> 07:42:14,670
DAVID J. Malan: Có lẽ còn có 1 người khác, và đó

7999
07:42:14,670 --> 07:42:16,390
có thể là một vấn đề khác hoàn toàn

8000
07:42:17,631 --> 07:42:18,818
ĐỐI TƯỢNG: Có thể là 0 khác

8001
07:42:18,818 --> 07:42:20,611
DAVID J. Malan: Quả thực có thể có\nmột số 0 khác

8002
07:42:20,611 --> 07:42:22,921
nhưng tôi đã xem qua\ndanh sách một lần, phải không?

8003
07:42:22,920 --> 07:42:24,330
Và tôi biết là không có.

8004
07:42:24,931 --> 07:42:27,661
ĐỐI TƯỢNG: Bạn không biết rằng\nmọi giá trị đều được thể hiện.

8005
07:42:27,661 --> 07:42:31,747
Vì vậy có thể có một bạn [KHÔNG NGHE ĐƯỢC]\n

8006
07:42:32,580 --> 07:42:34,960
DAVID J. Malan: Vâng, tôi không nhất thiết phải biết ở đó có gì.

8007
07:42:34,960 --> 07:42:39,300
Và thành thật mà nói, tôi chỉ quy định trước đó\n

8008
07:42:39,300 --> 07:42:42,541
Tôi có thể sử dụng hai và nhớ\n

8009
07:42:42,541 --> 07:42:44,491
Tôi có thể sử dụng ba biến, bốn.

8010
07:42:44,491 --> 07:42:47,801
Nhưng sau đó tôi sẽ bắt đầu sử dụng\n

8011
07:42:47,800 --> 07:42:51,240
Vì vậy nếu tôi đã quy định rằng tôi chỉ có\n

8012
07:42:51,241 --> 07:42:53,551
Tôi không biết gì thêm\nvề những yếu tố này

8013
07:42:53,550 --> 07:42:55,758
bởi vì điều duy nhất tôi\nnhớ vào lúc này

8014
07:42:55,758 --> 07:42:57,850
số 1 là\nphần tử nhỏ nhất tôi từng thấy.

8015
07:43:01,070 --> 07:43:03,030
Được rồi, tôi biết số đó\n1 và tên bạn là--

8016
07:43:03,739 --> 07:43:06,211
DAVID J. Malan: --Hannah là\nphần tử nhỏ nhất tiếp theo.

8017
07:43:06,210 --> 07:43:08,701
Tôi có thể yêu cầu mọi người di chuyển\nover để nhường chỗ, nhưng không.

8018
07:43:09,420 --> 07:43:11,340
Bạn biết đấy, mặc dù bạn đang ở rất gần nơi tôi muốn bạn

8019
07:43:11,341 --> 07:43:13,530
Tôi sẽ giữ mọi chuyện\nđơn giản và hoán đổi hai bạn.

8020
07:43:13,530 --> 07:43:15,931
Vì vậy, tôi đã làm cho\nvấn đề trở nên tồi tệ hơn một chút.

8021
07:43:15,931 --> 07:43:19,561
Nhưng trung bình, tôi cũng có thể gặp\nmay mắn và chỉ giành được vị trí thứ 2

8022
07:43:20,640 --> 07:43:22,570
Bây giờ hãy để tôi tăng tốc điều này.

8023
07:43:22,570 --> 07:43:26,911
Bây giờ tôi có thể bỏ qua Hannah và Celeste,\n

8024
07:43:34,830 --> 07:43:37,920
Vậy hãy tiếp tục hoán đổi 2 và 7.

8025
07:43:37,920 --> 07:43:40,590
Và bây giờ tôi sẽ trình bày nó bằng lời nói.

8026
07:43:40,591 --> 07:43:42,311
4, bạn sắp phải làm gì đó.

8027
07:43:46,111 --> 07:43:48,841
Được rồi, 3-- bạn có thể đổi bằng 4 được không?

8028
07:43:48,841 --> 07:43:52,036
Được rồi, bây giờ chúng ta có 7, 6, 4, 5.

8029
07:43:52,036 --> 07:43:54,780
Được rồi, 4, bạn có thể đổi bằng 7 được không?

8030
07:44:02,521 --> 07:44:04,050
Và bây giờ có lẽ là một tràng pháo tay.

8031
07:44:05,341 --> 07:44:09,611
Được rồi, đợi một phút.

8032
07:44:09,611 --> 07:44:11,491
Vì vậy chúng ta sẽ thực hiện theo cách tiếp cận khác.

8033
07:44:11,491 --> 07:44:14,581
Và Chúa ơi, điều đó có vẻ chậm hơn rất nhiều\nsso với cách tiếp cận đầu tiên

8034
07:44:14,580 --> 07:44:17,400
nhưng đó là một, bởi vì tôi đã\n

8035
07:44:17,401 --> 07:44:22,051
Nhưng hai, chúng tôi đang làm một việc tại một\n

8036
07:44:22,050 --> 07:44:25,470
có khả năng di chuyển\nnhư tám CPU khác nhau--

8037
07:44:25,471 --> 07:44:28,051
bộ não, nếu bạn muốn-- tất cả đều\không hoạt động cùng một lúc.

8038
07:44:28,050 --> 07:44:29,501
Và những chiếc máy tính như thế tồn tại.

8039
07:44:29,501 --> 07:44:32,254
Có thể nói, nếu bạn có một máy tính có\nnhiều lõi

8040
07:44:32,254 --> 07:44:34,171
điều đó giống như có một\nmáy tính về mặt kỹ thuật

8041
07:44:34,170 --> 07:44:35,850
có thể làm nhiều việc cùng một lúc.

8042
07:44:35,850 --> 07:44:38,830
Nhưng thông thường thì phần mềm\nas chúng tôi đã viết nó cho đến nay

8043
07:44:38,830 --> 07:44:40,555
chỉ có thể làm một việc tại một thời điểm.

8044
07:44:40,556 --> 07:44:42,431
Vì vậy, lát nữa, chúng tôi sẽ bổ sung\nup tất cả các bước này.

8045
07:44:42,431 --> 07:44:44,223
Nhưng bây giờ, chúng ta hãy\nkhông có cách tiếp cận nào khác.

8046
07:44:44,223 --> 07:44:46,501
Nếu tất cả các bạn có thể sắp xếp lại\nbản thân như thế--

8047
07:44:46,501 --> 07:44:51,300
52741630-- hãy áp dụng\ncách tiếp cận khác

8048
07:44:51,300 --> 07:44:54,970
được đề xuất chỉ bằng cách sửa lỗi nhỏ\n

8049
07:44:54,971 --> 07:44:57,091
Vì vậy, chúng tôi trở lại theo thứ tự ban đầu.

8050
07:44:57,091 --> 07:44:59,172
5 và 2 rõ ràng là không hợp lệ.

8051
07:44:59,881 --> 07:45:01,711
Bây giờ chúng ta hãy giải quyết vấn đề này.

8052
07:45:03,451 --> 07:45:04,890
Bây giờ hãy để tôi thực hiện bước tiếp theo.

8053
07:45:06,690 --> 07:45:09,360
Đúng là có một khoảng cách, nhưng đó\ncó thể không phải là vấn đề lớn.

8054
07:45:12,780 --> 07:45:15,510
Được rồi, 7 và 1, hãy đổi chỗ cho nhau nhé.

8055
07:45:15,510 --> 07:45:18,480
7 và 6, cho các bạn đổi chỗ nhé.

8056
07:45:22,050 --> 07:45:23,850
Bây giờ hãy để tôi tạm dừng một lát.

8057
07:45:26,830 --> 07:45:29,700
Nhưng tôi đã cải thiện được vấn đề chưa?

8058
07:45:29,701 --> 07:45:32,460
Đúng, tôi không thể nhìn thấy-- giống như\ntrước đây, tôi không thể tối ưu hóa như

8059
07:45:32,460 --> 07:45:34,570
trước vì 0 rõ ràng không có ở đây.

8060
07:45:34,570 --> 07:45:38,521
Vì vậy, trừ khi họ vẫn còn quay lại đó,\n

8061
07:45:40,661 --> 07:45:42,407
Nhưng tôi đã thực hiện bất kỳ cải tiến nào chưa?

8062
07:45:43,616 --> 07:45:45,841
Điều này được cải thiện theo nghĩa nào?

8063
07:45:45,841 --> 07:45:50,411
Điều gì cụ thể mà bạn\ncó thể chỉ ra là tốt hơn?

8064
07:45:50,911 --> 07:45:52,471
ĐỐI TƯỢNG: Sắp xếp số cao nhất.

8065
07:45:52,471 --> 07:45:55,051
DAVID J. Malan: Tôi đã sắp xếp\n

8066
07:45:55,050 --> 07:45:59,760
Và ngược lại, nếu bạn thích, Celeste\n

8067
07:45:59,760 --> 07:46:04,330
Bây giờ trong trường hợp xấu nhất, Celeste sẽ\n

8068
07:46:04,330 --> 07:46:06,900
Vì vậy, tôi có thể cần phải làm điều này\ntổng cộng n lần

8069
07:46:06,901 --> 07:46:08,576
để di chuyển cô ấy suốt chặng đường.

8070
07:46:08,576 --> 07:46:09,701
Nhưng điều đó có thể ổn.

8071
07:46:23,741 --> 07:46:25,871
lưu ý rằng các giá trị\n cao, như bạn đã lưu ý

8072
07:46:25,870 --> 07:46:28,510
sắp nổi lên, nếu bạn muốn, ở cuối danh sách.

8073
07:46:36,140 --> 07:46:37,730
Tất nhiên là 5, 6, 7 là tốt.

8074
07:46:37,730 --> 07:46:40,536
Vì vậy, bây giờ bạn có thể thấy\nsự cố tự giải quyết.

8075
07:46:40,536 --> 07:46:42,161
Và chúng ta hãy thực hiện phần này nhanh hơn.

8076
07:46:48,521 --> 07:46:53,238
Được rồi, bây giờ là 1 và 2,\n2, 3 và 0, thế là ổn.

8077
07:46:53,238 --> 07:46:54,820
Vì vậy, chúng tôi có một số tối ưu hóa ở đó.

8078
07:46:54,820 --> 07:46:57,221
Chúng ta không cần phải tiếp tục\nvì tất cả những thứ đó đã được sắp xếp.

8079
07:47:01,091 --> 07:47:04,690
1 và 0-- và một tràng pháo tay\no lớn khi kết thúc.

8080
07:47:09,251 --> 07:47:11,501
Chúng tôi cần lấy lại những con rối,\nnhưng bạn có thể giữ lại những chiếc áo sơ mi.

8081
07:47:11,501 --> 07:47:13,201
Cảm ơn bạn đã tình nguyện ở đây.

8082
07:47:13,201 --> 07:47:16,171
Hãy thoải mái rẽ trái hoặc phải theo đường của bạn.

8083
07:47:16,170 --> 07:47:18,120
Và hãy xem liệu,\nnhờ các tình nguyện viên của chúng tôi

8084
07:47:18,120 --> 07:47:24,361
ở đây, bây giờ chúng ta không thể chính thức hóa một chút\n

8085
07:47:24,361 --> 07:47:28,530
Tôi khẳng định rằng thuật toán đầu tiên\ntình nguyện viên của chúng tôi đã thực hiện tốt

8086
07:47:28,530 --> 07:47:30,091
được gọi là sắp xếp lựa chọn.

8087
07:47:30,091 --> 07:47:35,341
Và đúng như tên gọi, chúng tôi đã chọn\n

8088
07:47:35,341 --> 07:47:37,890
và một lần nữa,\nlàm theo cách của chúng ta từ trái sang phải

8089
07:47:37,890 --> 07:47:42,460
đặt Celeste vào đúng chỗ,\n

8090
07:47:42,460 --> 07:47:45,420
Vì vậy, sắp xếp lựa chọn, như\nit được gọi chính thức

8091
07:47:45,420 --> 07:47:48,360
có thể được mô tả, chẳng hạn,\nvới mã giả này ở đây--

8092
07:47:52,710 --> 07:47:54,780
Đây chỉ là cách nói về mảng.

8093
07:47:54,780 --> 07:47:59,280
Đầu bên trái là 0, đầu bên phải\n

8094
07:47:59,280 --> 07:48:01,080
n tình cờ có tám người.

8095
07:48:03,061 --> 07:48:06,601
Vậy đối với tôi từ 0 đến n\nminus 1, tôi đã làm gì?

8096
07:48:06,600 --> 07:48:11,760
Tôi đã tìm thấy số nhỏ nhất giữa\n

8097
07:48:13,170 --> 07:48:15,390
Thoạt nhìn thì có vẻ hơi khó hiểu, nhưng điều này

8098
07:48:15,390 --> 07:48:18,870
chỉ là một cách nói rất giả\ncode

8099
07:48:18,870 --> 07:48:22,320
tìm phần tử nhỏ nhất\nam trong số tám tình nguyện viên

8100
07:48:22,320 --> 07:48:27,480
bởi vì nếu tôi bắt đầu ở 0 và n trừ\n

8101
07:48:27,480 --> 07:48:31,591
8, 8 người, vậy 8 trừ\n1 bằng 7, lần đầu tiên

8102
07:48:31,591 --> 07:48:34,681
nói tìm số nhỏ nhất\ngiữa các số trong ngoặc 0

8103
07:48:34,681 --> 07:48:37,710
và khung số 7, nếu bạn muốn.

8104
07:48:38,911 --> 07:48:42,091
Hoán đổi số nhỏ nhất\nvới dấu ngoặc số i.

8105
07:48:42,091 --> 07:48:45,570
Vậy đó là cách chúng tôi có được Celeste từ\n

8106
07:48:45,570 --> 07:48:47,701
Chúng tôi chỉ trao đổi hai giá trị đó.

8107
07:48:47,701 --> 07:48:50,201
Điều gì sẽ xảy ra tiếp theo\trong mã giả này?

8108
07:48:50,201 --> 07:48:52,261
tất nhiên là tôi đi từ 0 đến 1.

8109
07:48:52,260 --> 07:48:54,420
Và đó là\ncách nói kỹ thuật bây giờ

8110
07:48:54,420 --> 07:48:58,170
tìm phần tử nhỏ nhất trong số\n7 tình nguyện viên còn lại

8111
07:48:58,170 --> 07:49:01,930
phớt lờ Celeste lần này vì cô ấy\n

8112
07:49:01,931 --> 07:49:04,320
Vì vậy, vấn đề đã chuyển\ntừ cỡ 8 lên cỡ 7.

8113
07:49:04,320 --> 07:49:07,861
Và nếu chúng ta lặp lại, kích thước 6,\n5, 4, 3, 2, 1, cho đến khi bùng nổ

8114
07:49:07,861 --> 07:49:10,181
tất cả đều được thực hiện vào cuối.

8115
07:49:10,181 --> 07:49:13,561
Vì vậy đây chỉ là một cách\nbiểu diễn bằng mã giả những gì

8116
07:49:13,561 --> 07:49:17,401
chúng tôi đã làm một cách tự nhiên hơn một chút\n

8117
07:49:17,401 --> 07:49:19,781
tình nguyện ra ngoài làm khán giả.

8118
07:49:19,780 --> 07:49:24,661
Vì vậy, nếu chúng ta xem xét,\tính hiệu quả của thuật toán này

8119
07:49:24,661 --> 07:49:27,091
có lẽ trừu tượng hóa nó\nbây giờ như một loạt các cánh cửa

8120
07:49:27,091 --> 07:49:31,320
luôn luôn là nơi bên trái nhất\n

8121
07:49:31,320 --> 07:49:34,710
hoặc tương đương, thứ hai đến cuối cùng\n

8122
07:49:34,710 --> 07:49:38,911
là n trừ 3 trong đó n có thể\n bằng 8 hoặc bất kỳ giá trị nào khác

8123
07:49:38,911 --> 07:49:43,980
chúng ta nghĩ về hoặc định lượng như thế nào\n

8124
07:49:46,591 --> 07:49:49,591
Ý tôi là, cần phải cộng thêm rất nhiều\nbước.

8125
07:49:49,591 --> 07:49:53,491
Có lẽ là nhiều hơn n, phải không,\n

8126
07:49:54,390 --> 07:49:59,100
Nó giống như n cộng n\nminus 1 cộng n trừ 2.

8127
07:50:01,440 --> 07:50:04,980
Bây giờ chúng tôi đã có cả\nnhóm trong dàn nhạc.

8128
07:50:04,980 --> 07:50:09,541
Hãy để tôi đề nghị chúng ta suy nghĩ về điều này\n

8129
07:50:09,541 --> 07:50:13,710
Vì vậy, lần đầu tiên, tôi phải\nxem xét n tình nguyện viên khác nhau.

8130
07:50:13,710 --> 07:50:17,490
n là 8 trong trường hợp này, nhưng nói chung,\n

8131
07:50:17,491 --> 07:50:19,591
để quyết định xem ai là người nhỏ nhất.

8132
07:50:19,591 --> 07:50:21,631
Và chắc chắn rồi, Celeste\nở cuối cùng.

8133
07:50:21,631 --> 07:50:23,463
Tình cờ cô ấy ở tận bên phải.

8134
07:50:23,463 --> 07:50:27,870
Nhưng tôi chỉ biết điều đó khi nhìn vào tất cả 8 hoặc tất cả n tình nguyện viên.

8135
07:50:27,870 --> 07:50:30,240
Vì vậy, điều đó đã khiến tôi mất n bước đầu tiên.

8136
07:50:30,241 --> 07:50:33,631
Nhưng một khi danh sách đã được hoán đổi\nvào đúng vị trí thì

8137
07:50:33,631 --> 07:50:37,651
vấn đề của tôi với kích thước n trừ 1,\nvà tôi có n trừ 1 người khác

8138
07:50:40,230 --> 07:50:44,186
Sau đó là n trừ 2 cộng\n

8139
07:50:44,186 --> 07:50:45,631
chấm cho đến khi tôi thực hiện được bước cuối cùng.

8140
07:50:45,631 --> 07:50:48,820
Và rõ ràng là tôi chỉ còn lại một người để cân nhắc.

8141
07:50:48,820 --> 07:50:51,541
Vì vậy, chúng ta có thể vẫy tay\nđiều này bằng một chút dấu chấm lửng

8142
07:50:51,541 --> 07:50:54,761
và chỉ cần nói dot dot dot\nplus 1 cho bước cuối cùng.

8143
07:50:54,760 --> 07:50:56,251
Bây giờ điều này thực sự bằng bao nhiêu?

8144
07:50:56,251 --> 07:50:57,841
Chà, đây là lúc bạn\ncó thể nghĩ lại, như

8145
07:50:57,841 --> 07:50:59,760
sách giáo khoa toán\hay vật lý trung học của bạn mà

8146
07:50:59,760 --> 07:51:03,001
có một bảng ghi chú nhỏ ở cuối\n

8147
07:51:03,001 --> 07:51:05,850
Điều đó xảy ra\nvề mặt toán học là

8148
07:51:05,850 --> 07:51:09,480
n lần n cộng 1 tất cả chia cho 2.

8149
07:51:09,480 --> 07:51:13,050
Đó chỉ là sự tái diễn,\n

8150
07:51:13,050 --> 07:51:15,661
Vì vậy, nếu bạn tin rằng\ntoán học đó là đúng, hãy

8151
07:51:15,661 --> 07:51:19,890
vừa rồi nhân số này\ntheo toán học.

8152
07:51:19,890 --> 07:51:26,280
Đó là n bình cộng n chia cho 2 hoặc\n

8153
07:51:26,280 --> 07:51:29,251
Và đây là nơi chúng ta bắt đầu\n

8154
07:51:29,251 --> 07:51:34,440
Giống như, thành thật mà nói, khi n thực sự\n

8155
07:51:34,440 --> 07:51:39,300
hoặc một tỷ trang web trong tìm kiếm của Google\n

8156
07:51:39,300 --> 07:51:41,760
sẽ quan trọng\nvề mặt toán học nhất

8157
07:51:43,561 --> 07:51:46,201
Có phải n bình phương chia cho\n2 thừa số trội

8158
07:51:46,201 --> 07:51:48,620
hay n chia cho 2\n thừa số trội?

8159
07:51:50,355 --> 07:51:51,480
DAVID J. Malan: Vâng, n bình phương.

8160
07:51:51,480 --> 07:51:53,650
Ý tôi là, bất kể n\nis-- và nó càng lớn

8161
07:51:53,651 --> 07:51:56,941
việc nâng nó lên\n lũy thừa 2 càng lớn.

8162
07:51:57,690 --> 07:52:00,630
Chúng ta hãy vẫy tay với điều này\nvì vào cuối ngày

8163
07:52:00,631 --> 07:52:04,140
khi n trở nên thực sự lớn, ưu thế\n

8164
07:52:04,890 --> 07:52:08,650
Kể cả số bị chia 2, như tôi đã nói trước đó\n

8165
07:52:08,651 --> 07:52:11,320
hai đường thẳng nếu về cơ bản bạn\ntiếp tục thu nhỏ

8166
07:52:11,320 --> 07:52:16,120
trông giống nhau khi n đủ lớn,\n

8167
07:52:16,850 --> 07:52:21,490
Vậy có nghĩa là một nhà khoa học máy tính\n

8168
07:52:21,491 --> 07:52:24,221
theo thứ tự n bước bình phương.

8169
07:52:24,221 --> 07:52:25,871
Đó là một sự đơn giản hóa quá mức.

8170
07:52:25,870 --> 07:52:28,960
Nếu chúng ta thực sự cộng nó lại thì\thực ra nó có nhiều bước như thế này-- n

8171
07:52:28,960 --> 07:52:30,970
bình phương chia cho 2 cộng n trên 2.

8172
07:52:30,971 --> 07:52:34,781
Nhưng một lần nữa, nếu chúng ta muốn có thể\n

8173
07:52:34,780 --> 07:52:38,170
hiệu suất, tôi nghĩ nó sẽ thành công\n

8174
07:52:38,170 --> 07:52:44,080
đặt hàng để hiểu được\n

8175
07:52:44,080 --> 07:52:46,900
hoặc thậm chí nó trông như thế nào về mặt đồ họa.

8176
07:52:46,901 --> 07:52:50,531
Được rồi, như đã nói,\nchúng ta có thể mô tả kiểu sắp xếp bong bóng

8177
07:52:52,151 --> 07:52:56,061
xin lỗi, lựa chọn sắp xếp theo dạng O lớn trên n bình phương.

8178
07:52:56,061 --> 07:53:01,391
Nhưng điều gì sẽ xảy ra nếu bây giờ chúng ta xem xét\n

8179
07:53:01,390 --> 07:53:03,431
để nói về giới hạn dưới?

8180
07:53:03,431 --> 07:53:07,666
Trong trường hợp tốt nhất, việc sắp xếp lựa chọn mất bao nhiêu\nbước?

8181
07:53:07,666 --> 07:53:09,041
Vâng, ở đây chúng ta cần một số bối cảnh.

8182
07:53:09,041 --> 07:53:11,681
Giống như,\ntrường hợp tốt nhất hay trường hợp xấu nhất nghĩa là gì

8183
07:53:13,451 --> 07:53:16,960
Giống như, bạn có thể tưởng tượng được ý nghĩa gì\n

8184
07:53:16,960 --> 07:53:20,011
đang cố gắng sắp xếp một loạt các con số?

8185
07:53:20,011 --> 07:53:21,460
Tôi đã đưa toàn bộ phi hành đoàn đến đây một lần nữa.

8186
07:53:21,760 --> 07:53:23,411
ĐỐI TƯỢNG: Họ đã được sắp xếp rồi.

8187
07:53:23,411 --> 07:53:24,730
DAVID J. Malan: Được rồi, chúng đã được sắp xếp rồi, phải không?

8188
07:53:24,730 --> 07:53:28,390
Tôi thực sự không thể tưởng tượng ra một kịch bản nào tốt hơn\n

8189
07:53:28,390 --> 07:53:30,400
nhưng họ đã sắp xếp cho tôi rồi.

8190
07:53:30,401 --> 07:53:35,531
Nhưng liệu thuật toán này\ncó tận dụng được thực tế đó trong thực tế không?

8191
07:53:35,530 --> 07:53:38,470
Ngay cả khi tất cả con người của chúng ta đã xếp hàng từ 0 đến 7

8192
07:53:38,471 --> 07:53:41,291
Tôi khá chắc chắn rằng mình sẽ\nbắt đầu một cách khá ngây thơ ở đây.

8193
07:53:41,291 --> 07:53:43,031
Và vâng, Celeste tình cờ có mặt ở đây.

8194
07:53:43,030 --> 07:53:47,736
Nhưng tôi chỉ biết cô ấy cần ở đây\n

8195
07:53:47,736 --> 07:53:50,361
Và rồi tôi sẽ nhận ra\nà, điều đó thật lãng phí thời gian.

8196
07:53:51,640 --> 07:53:53,861
Nhưng sau đó tôi sẽ làm gì?

8197
07:53:53,861 --> 07:53:57,221
Tôi sẽ bỏ qua vị trí của cô ấy\n

8198
07:53:57,221 --> 07:54:00,621
Bây giờ tôi cũng có thể làm điều tương tự\n

8199
07:54:00,620 --> 07:54:03,681
Vì vậy, mỗi lần tôi bước qua,\ntôi không làm được nhiều việc hữu ích.

8200
07:54:03,681 --> 07:54:06,221
Nhưng tôi đang thực hiện những\nso sánh đó bởi vì tôi

8201
07:54:06,221 --> 07:54:09,861
không biết cho đến khi tôi làm việc đó\n

8202
07:54:09,861 --> 07:54:14,800
Vì vậy điều này dường như ngụ ý rằng\n

8203
07:54:14,800 --> 07:54:18,100
kịch bản, thậm chí, giới hạn dưới của\n

8204
07:54:20,201 --> 07:54:21,831
DAVID J. Malan: To hơn một chút?

8205
07:54:22,771 --> 07:54:24,611
DAVID J. Malan: Nó vẫn\nsẽ là n bình phương

8206
07:54:24,611 --> 07:54:30,181
thực tế là vì đoạn mã tôi đưa ra\n

8207
07:54:30,181 --> 07:54:34,620
khỏi bất kỳ tình huống nào trong số đó bởi vì\nit cứ tiếp tục một cách vô thức

8208
07:54:36,131 --> 07:54:41,371
Vì vậy, trong trường hợp này, vâng, tôi sẽ khẳng định rằng\n

8209
07:54:43,190 --> 07:54:44,940
Vì vậy, đó là những loại số cần đánh bại.

8210
07:54:44,940 --> 07:54:48,120
Có vẻ như giới hạn trên\nand giới hạn dưới của lựa chọn

8211
07:54:50,491 --> 07:54:52,741
Và do đó chúng ta cũng có thể mô tả\nsắp xếp lựa chọn, do đó

8212
07:54:52,741 --> 07:54:54,078
như ở theta của n bình phương.

8213
07:54:54,078 --> 07:54:56,911
Đó là thuật toán đầu tiên chúng tôi\n

8214
07:54:56,911 --> 07:54:59,010
có nghĩa là nó hơi chậm.

8215
07:54:59,010 --> 07:55:00,955
Ý tôi là, có lẽ các\thuật toán khác chậm hơn

8216
07:55:00,955 --> 07:55:02,580
nhưng đây không phải là điểm khởi đầu tốt nhất.

8217
07:55:03,730 --> 07:55:07,291
Chà, có lý do mà tôi đã hướng dẫn chúng ta\n

8218
07:55:07,291 --> 07:55:09,791
Mặc dù bạn đã đề xuất\nchúng bằng lời nói theo một thứ tự khác

8219
07:55:09,791 --> 07:55:12,960
Thuật toán thứ hai mà chúng tôi đã thực hiện\nthường được gọi là sắp xếp bong bóng.

8220
07:55:12,960 --> 07:55:15,570
Và tôi đã cố tình dùng\ntừ đó cách đây không lâu

8221
07:55:15,570 --> 07:55:19,291
nói rằng những giá trị lớn\nđang tiến dần về phía bên phải

8222
07:55:19,291 --> 07:55:22,351
để nắm bắt được sự thật rằng\thực sự, thuật toán này hoạt động

8223
07:55:22,980 --> 07:55:25,230
Nhưng hãy xem xét liệu nó tốt hơn hay tệ hơn.

8224
07:55:25,230 --> 07:55:28,320
Vì vậy, ở đây, chúng ta có mã giả\ncode để sắp xếp bong bóng.

8225
07:55:28,320 --> 07:55:30,291
Bạn cũng có thể viết điều này\ntheo nhiều cách khác nhau.

8226
07:55:30,291 --> 07:55:32,911
Nhưng hãy xem xét những gì\nchúng tôi đã làm trên sân khấu.

8227
07:55:32,911 --> 07:55:36,210
Chúng tôi lặp lại điều sau\nn trừ 1 lần.

8228
07:55:36,210 --> 07:55:39,751
Ít nhất chúng tôi đã khởi tạo, mặc dù\n

8229
07:55:39,751 --> 07:55:44,791
một biến giống như i từ 0\nđến n trừ 2, n trừ 2.

8230
07:55:44,791 --> 07:55:46,171
Và sau đó tôi hỏi câu hỏi này.

8231
07:55:46,170 --> 07:55:52,830
Nếu số trong ngoặc i và số\n

8232
07:55:54,611 --> 07:55:56,941
Vì vậy, một lần nữa, tôi chỉ làm việc đó một cách\trực quan hơn bằng cách chỉ vào

8233
07:55:56,940 --> 07:55:59,310
nhưng đây sẽ là một cách,\nvới một chút mã giả

8234
07:55:59,311 --> 07:56:00,508
để mô tả những gì đang xảy ra.

8235
07:56:00,508 --> 07:56:03,091
Nhưng hãy lưu ý rằng tôi đang làm điều gì đó\hơi khác một chút ở đây.

8236
07:56:03,091 --> 07:56:07,091
Tôi đang lặp lại từ if\nequals 0 đến n trừ 2.

8237
07:56:07,591 --> 07:56:11,100
Chà, nếu tôi đang so sánh hai\nthứ, tay trái và tay phải

8238
07:56:11,100 --> 07:56:13,050
Tôi vẫn muốn bắt đầu từ con số 0.

8239
07:56:13,050 --> 07:56:15,810
Nhưng tôi không muốn đi\n đến n trừ 1

8240
07:56:15,811 --> 07:56:19,409
bởi vì khi đó tôi sẽ đi quá\nranh giới của mảng của mình, điều này

8241
07:56:19,951 --> 07:56:22,441
Tôi muốn chắc chắn rằng\ntay trái của tôi-- tôi, nếu bạn muốn--

8242
07:56:22,440 --> 07:56:27,181
dừng ở n trừ 2 để khi\nI cộng 1 trong mã giả của mình

8243
07:56:27,181 --> 07:56:29,971
Tôi đang xem hai phần tử cuối cùng, không phải phần tử cuối cùng

8244
07:56:31,260 --> 07:56:33,093
Đó thực sự là một lỗi lập trình\nphổ biến

8245
07:56:33,094 --> 07:56:34,980
mà chắc chắn chúng ta\nsẽ sớm thực hiện được bằng cách đi

8246
07:56:34,980 --> 07:56:37,240
vượt ra ngoài ranh giới của mảng của bạn.

8247
07:56:37,241 --> 07:56:43,891
Vì vậy, mã giả này cho phép tôi\n

8248
07:56:43,890 --> 07:56:46,091
và trao đổi chúng nếu chúng không còn hoạt động.

8249
07:56:46,091 --> 07:56:50,550
Tại sao tôi lại lặp lại toàn bộ\ntrừ 1 lần?

8250
07:56:50,550 --> 07:56:55,861
Giống như, tại sao\nchỉ thực hiện vòng lặp này ở đây là không đủ?

8251
07:56:55,861 --> 07:56:59,341
Hãy nghĩ xem điều gì đã xảy ra với Celeste.

8252
07:56:59,341 --> 07:57:03,841
Tại sao tôi lại lặp lại toàn bộ điều này n trừ 1 lần?

8253
07:57:12,216 --> 07:57:14,591
DAVID J. Malan: Quả thực, và tôi nghĩ\nnếu tôi có thể tóm tắt lại một cách chính xác

8254
07:57:14,591 --> 07:57:16,001
hãy nghĩ lại về Celeste.

8255
07:57:16,001 --> 07:57:18,491
Và tôi xin lỗi vì cứ gọi\không phải bạn là số 0 của chúng tôi.

8256
07:57:18,491 --> 07:57:22,031
Mỗi lần thực hiện bong bóng\nsort, cô ấy chỉ di chuyển một bước.

8257
07:57:22,030 --> 07:57:25,640
Và tổng cộng, nếu có n\nđịa điểm, vào cuối ngày

8258
07:57:25,640 --> 07:57:30,291
cô ấy cần di chuyển n trừ 1 bước để có được\n

8259
07:57:30,291 --> 07:57:34,691
Và vòng lặp bên trong này, nếu bạn\n

8260
07:57:34,690 --> 07:57:37,060
điều đó chỉ khắc phục được một số vấn đề.

8261
07:57:37,061 --> 07:57:40,511
Nhưng nó không khắc phục được tất cả vấn đề\n

8262
07:57:42,021 --> 07:57:45,771
Và làm cách nào chúng ta có thể định lượng\nthời gian chạy của thuật toán này?

8263
07:57:45,771 --> 07:57:49,030
Chà, một cách để thấy nó là\n

8264
07:57:49,030 --> 07:57:53,530
Vòng lặp bên ngoài lặp lại n\nminus 1 lần theo định nghĩa.

8265
07:57:54,850 --> 07:58:00,320
Vòng lặp bên trong, vòng lặp for,\ncũng lặp n trừ 1 lần.

8266
07:58:00,820 --> 07:58:02,901
Bởi vì nó đang đi từ 0 đến n trừ 2.

8267
07:58:02,901 --> 07:58:06,941
Và nếu điều đó thật khó nghĩ,\n

8268
07:58:06,940 --> 07:58:09,681
nếu bạn chỉ thêm 1 vào\ncả hai đầu của công thức.

8269
07:58:09,681 --> 07:58:14,271
Vậy điều đó có nghĩa là bạn đang làm n\nminus 1 việc n trừ 1 lần.

8270
07:58:14,271 --> 07:58:16,901
Vì vậy, theo nghĩa đen, tôi nhân bao nhiêu lần vòng lặp bên ngoài

8271
07:58:16,901 --> 07:58:20,320
đang chạy bao nhiêu lần\n

8272
07:58:20,320 --> 07:58:23,681
loại phương pháp FOIL n trừ 1 bình phương.

8273
07:58:23,681 --> 07:58:25,661
Và tôi có thể nhân\ntoàn bộ điều đó ra.

8274
07:58:25,661 --> 07:58:28,690
Chà, chúng ta hãy xem xét điều này một cách có phương pháp hơn một chút ở đây.

8275
07:58:28,690 --> 07:58:32,742
Nếu tôi có n trừ 1 ở bên trong, n trừ 1 ở bên trong--

8276
07:58:32,742 --> 07:58:33,950
hãy tiếp tục và FOIL điều này.

8277
07:58:33,951 --> 07:58:37,541
Vậy n bình phương trừ n\nminus n cộng 1, kết hợp

8278
07:58:37,541 --> 07:58:40,931
như các số hạng-- n bình trừ 2n cộng 1.

8279
07:58:40,931 --> 07:58:45,831
Và bây giờ điều khoản nào trong số này rõ ràng\n

8280
07:58:46,811 --> 07:58:48,081
DAVID J. Malan: --n bình phương.

8281
07:58:48,080 --> 07:58:50,620
Vì vậy, mặc dù\nminus 2n là một điều tốt

8282
07:58:50,620 --> 07:58:53,021
bởi vì nó đang giảm bớt\nmột phần thời gian cần thiết

8283
07:58:53,021 --> 07:58:56,050
cộng 1 không phải là điều gì to tát,\n

8284
07:58:56,050 --> 07:58:58,480
n trở nên rất lớn, như\n hàng triệu hoặc hàng tỷ

8285
07:58:58,480 --> 07:59:02,870
chắc chắn, bong bóng đó sắp xếp 2\nis theo thứ tự n bình phương.

8286
07:59:02,870 --> 07:59:05,470
Nó không giống hệt như cách sắp xếp lựa chọn.

8287
07:59:05,471 --> 07:59:07,390
Nhưng khi n lớn lên,\thành thật mà nói, chúng tôi hầu như không

8288
07:59:07,390 --> 07:59:09,890
rất có thể sẽ nhận thấy\nsự khác biệt.

8289
07:59:09,890 --> 07:59:13,550
Và vì vậy nó cũng có thể được coi là\n ở cấp n bình phương.

8290
07:59:13,550 --> 07:59:18,890
Và nếu bây giờ chúng ta xem xét mức thấp hơn\n

8291
07:59:18,890 --> 07:59:23,080
đây là nơi mọi thứ trở nên\ncó thể thú vị.

8292
07:59:23,080 --> 07:59:28,810
Bạn có thể khẳng định điều gì đang chạy\n

8293
07:59:28,811 --> 07:59:32,591
Và trường hợp tốt nhất, tôi khẳng định, là khi\n

8294
07:59:32,591 --> 07:59:35,081
Mã giả của chúng ta có tính đến điều đó không?

8295
07:59:43,403 --> 07:59:45,070
DAVID J. Malan: Vâng, và đó là từ khóa.

8296
07:59:45,070 --> 07:59:49,510
Tóm lại, theo kiểu sắp xếp nổi, tôi có\n

8297
07:59:49,510 --> 07:59:52,120
đừng nhìn vào tất cả n phần tử,\nvề mặt lý thuyết tôi

8298
07:59:52,120 --> 07:59:53,620
chỉ đoán xem nó có được sắp xếp hay không.

8299
07:59:53,620 --> 07:59:55,841
Giống như, tôi rõ ràng phải nhìn theo trực giác

8300
07:59:55,841 --> 07:59:58,751
ở mọi yếu tố đều quyết định được hay không, phải theo đúng thứ tự.

8301
07:59:58,751 --> 08:00:01,541
Và tuy nhiên, mã giả ban đầu của tôi khá ngây thơ.

8302
08:00:01,541 --> 08:00:07,001
Nó sẽ quay lại một cách mù quáng và\n

8303
08:00:08,170 --> 08:00:10,120
Nhưng điều gì sẽ xảy ra nếu tôi thêm một\nsự tối ưu hóa

8304
08:00:10,120 --> 08:00:12,370
mà bạn có thể đã nhìn thấy\non trang trình bày cách đây một lát

8305
08:00:12,370 --> 08:00:15,970
ở đâu nếu tôi so sánh hai người và tôi\n

8306
08:00:15,971 --> 08:00:18,911
đừng hoán đổi chúng, và tôi sẽ xem hết\ndanh sách để so sánh

8307
08:00:18,911 --> 08:00:22,480
mọi cặp\nngười liền kề và tôi không thực hiện hoán đổi

8308
08:00:22,480 --> 08:00:25,181
nó sẽ không chỉ ngây thơ mà còn ngu ngốc

8309
08:00:25,181 --> 08:00:28,721
để thực hiện lại quy trình đó\n

8310
08:00:28,721 --> 08:00:31,511
Tôi sẽ không đưa ra\bất kỳ quyết định nào khác.

8311
08:00:31,510 --> 08:00:34,100
Tôi sẽ không làm gì nữa, không làm gì nữa.

8312
08:00:34,100 --> 08:00:37,510
Vì vậy, vào thời điểm đó, điều đó sẽ thật ngu ngốc,\n

8313
08:00:38,570 --> 08:00:42,431
Vì vậy, nếu tôi sửa đổi mã giả của chúng tôi bằng\n

8314
08:00:44,411 --> 08:00:50,561
Bên trong cùng một mã giả đó, cái gì\n

8315
08:00:50,561 --> 08:00:54,371
Giống như thoát, sớm trước khi\ncác vòng lặp chạy xong.

8316
08:00:54,370 --> 08:00:57,740
Một trong các vòng lặp đã\nđi qua theo vết lõm ở đây.

8317
08:00:57,741 --> 08:01:00,551
Nhưng nếu tôi thực hiện một vòng lặp từ\ntrái sang phải và tôi

8318
08:01:00,550 --> 08:01:03,041
chưa thực hiện giao dịch hoán đổi nào, mà bạn\ncó thể coi đó chỉ là

8319
08:01:03,041 --> 08:01:06,611
một biến khác cộng với dấu cộng\n

8320
08:01:07,181 --> 08:01:09,100
nếu tôi không thực hiện hoán đổi\ntừ trái sang phải

8321
08:01:09,100 --> 08:01:11,600
Tôi cũng sẽ không thực hiện bất kỳ giao dịch hoán đổi nào\nvào lần tới.

8322
08:01:11,600 --> 08:01:14,390
Vì vậy, chúng ta hãy bỏ thuốc lá vào thời điểm đó.

8323
08:01:14,390 --> 08:01:16,990
Và điều đó có nghĩa là trong\ntrường hợp tốt nhất, nếu bạn muốn

8324
08:01:16,991 --> 08:01:20,771
khi danh sách đã được sắp xếp,\n

8325
08:01:20,771 --> 08:01:25,820
thực sự có thể là omega của n\nnếu bạn thêm sự tối ưu hóa đó

8326
08:01:25,820 --> 08:01:28,420
để làm ngắn mạch\ntất cả những điều không hiệu quả đó

8327
08:01:28,420 --> 08:01:34,190
lặp lại để thực hiện việc đó\nnhiều lần khi cần thiết.

8328
08:01:34,190 --> 08:01:36,640
Hãy để tôi tạm dừng để xem liệu có câu hỏi nào ở đây không.

8329
08:01:37,552 --> 08:01:46,399
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC] để tối ưu hóa\n

8330
08:01:46,399 --> 08:01:47,441
DAVID J. Malan: Câu hỏi hay.

8331
08:01:47,440 --> 08:01:53,050
Nếu thời gian chạy của lựa chọn sắp xếp\n

8332
08:01:53,050 --> 08:01:58,841
của n bình phương nhưng loại lựa chọn nằm trong\n

8333
08:01:58,841 --> 08:02:01,661
trong omega của n, nghe hay hơn--

8334
08:02:01,661 --> 08:02:04,870
Tôi nghĩ nếu có thể, chúng ta có nên luôn sử dụng tính năng sắp xếp nổi không?

8335
08:02:04,870 --> 08:02:09,040
Có nếu chúng tôi nghĩ rằng chúng ta\ncó thể được hưởng lợi theo thời gian

8336
08:02:09,041 --> 08:02:13,611
từ rất nhiều trường hợp tốt\nkịch bản hoặc trường hợp tốt nhất.

8337
08:02:13,611 --> 08:02:15,701
Tuy nhiên, mục tiêu\ntrước mắt chỉ trong chốc lát là

8338
08:02:15,701 --> 08:02:17,841
thậm chí còn có thể làm tốt hơn cả hai điều này.

8339
08:02:17,841 --> 08:02:19,690
Vì vậy, hãy giữ câu hỏi đó\nthêm một lúc.

8340
08:02:20,190 --> 08:02:25,717
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] n trừ 1?

8341
08:02:27,440 --> 08:02:31,251
Vì vậy tôi nói omega của n, nhưng về mặt kỹ thuật nó có phải là omega của n trừ 1 không?

8342
08:02:31,251 --> 08:02:34,471
Có thể, nhưng một lần nữa, chúng tôi\nđang loại bỏ các thuật ngữ cấp thấp hơn.

8343
08:02:34,471 --> 08:02:38,031
Và đó là một lợi thế vì chúng tôi\n

8344
08:02:38,030 --> 08:02:41,540
Giống như tôi đã vẽ bằng\nbiểu đồ xanh, vàng và đỏ

8345
08:02:41,541 --> 08:02:44,341
Tôi chỉ muốn hiểu\nhình dạng của các thuật toán này

8346
08:02:44,341 --> 08:02:47,690
để khi n thực sự\nlớn, lựa chọn nào sau đây

8347
08:02:47,690 --> 08:02:49,545
sẽ là vấn đề quan trọng nhất?

8348
08:02:49,545 --> 08:02:51,920
Vào cuối ngày, điều đó\thực sự là hoàn toàn hợp lý

8349
08:02:51,920 --> 08:02:53,820
sử dụng sắp xếp chọn\hoặc sắp xếp bong bóng nếu bạn

8350
08:02:53,820 --> 08:02:56,570
không có nhiều dữ liệu vì\n

8351
08:02:56,570 --> 08:02:58,881
Chúa ơi, máy tính của chúng ta\ngày nay có tốc độ 1 gigahertz

8352
08:02:58,881 --> 08:03:02,800
2 gigahertz, 1 tỷ thứ mỗi\n

8353
08:03:02,800 --> 08:03:05,300
Nhưng nếu chúng ta có các tập dữ liệu lớn,\nas chúng ta sẽ làm sau này trong thuật ngữ này

8354
08:03:05,300 --> 08:03:07,830
và như bạn có thể làm trong thế giới thực,\n

8355
08:03:07,830 --> 08:03:09,890
thì bạn sẽ muốn\nchu đáo hơn.

8356
08:03:09,890 --> 08:03:11,600
Và đó là nơi chúng ta sẽ đến hôm nay.

8357
08:03:11,600 --> 08:03:14,450
Được rồi, chúng ta hãy thực sự xem\nđiều này được hình dung một chút.

8358
08:03:14,451 --> 08:03:16,370
Trong giây lát, tôi sẽ\nchuyển đổi màn hình ở đây

8359
08:03:16,370 --> 08:03:21,710
để mở ra một\ncông cụ trực quan hóa nhỏ sẽ cung cấp cho chúng ta những gì

8360
08:03:21,710 --> 08:03:25,280
cảm nhận về những điều này thực sự như thế nào\n

8361
08:03:25,280 --> 08:03:27,181
hơn những gì con người chúng ta có thể làm được trên sân khấu.

8362
08:03:27,181 --> 08:03:31,940
Vì vậy đây là một hình dung khác của một\n

8363
08:03:31,940 --> 08:03:35,030
Thanh ngắn nghĩa là số nhỏ,\thanh cao nghĩa là số lớn.

8364
08:03:35,030 --> 08:03:37,280
Vì vậy, thay vì có\nnhững con số trên thân họ ở đây

8365
08:03:37,280 --> 08:03:42,050
chúng tôi chỉ có các thanh nhỏ hoặc cao\n

8366
08:03:42,050 --> 08:03:44,990
Hãy để tôi tiếp tục và tôi\nđã định cấu hình trước điều này

8367
08:03:44,991 --> 08:03:46,411
để hoạt động hơi nhanh chóng.

8368
08:03:46,411 --> 08:03:49,911
Hãy tiếp tục và thực hiện các lựa chọn\nsắp xếp bằng cách nhấp vào nút này.

8369
08:03:49,911 --> 08:03:52,580
Và bạn sẽ thấy một số thanh màu hồng bay ngang qua.

8370
08:03:52,580 --> 08:03:56,000
Và điều đó giống như việc tôi đi\ntrái và phải, trái và phải

8371
08:03:56,001 --> 08:03:58,501
để chọn số nhỏ nhất tiếp theo.

8372
08:03:58,501 --> 08:04:01,940
Và những gì bạn sẽ thấy xảy ra trên\n

8373
08:04:01,940 --> 08:04:04,880
là Celeste, nếu bạn muốn, và\nall những số nhỏ hơn khác

8374
08:04:04,881 --> 08:04:08,390
đang xuất hiện ở bên trái trong khi\n

8375
08:04:10,170 --> 08:04:13,537
Vì vậy, một lần nữa, chúng ta không còn phải\nchạm vào những con số nhỏ hơn ở đây nữa.

8376
08:04:13,538 --> 08:04:16,370
Vậy ra đó là lý do tại sao vấn đề lại xảy ra\n

8377
08:04:17,151 --> 08:04:20,781
Nhưng bây giờ bạn có thể nhận thấy\nbằng trực quan, hãy nhìn xem bao nhiêu lần

8378
08:04:22,280 --> 08:04:25,070
Đây là lý do tại sao những thứ\nbình phương có xu hướng

8379
08:04:25,070 --> 08:04:29,190
bị cau mày nếu có thể tránh được vì\n

8380
08:04:29,690 --> 08:04:31,970
Khi tôi đi qua, tôi\nliên tục chỉ vào những con người đó

8381
08:04:34,021 --> 08:04:37,111
Vì vậy, hãy xem liệu sắp xếp bong bóng trông\cũng như có cảm giác khác biệt một chút hay không.

8382
08:04:37,111 --> 08:04:40,548
Hãy để tôi sắp xếp lại thứ đó một cách ngẫu nhiên và để\n

8383
08:04:40,548 --> 08:04:43,341
Và như bạn có thể suy ra, có\n

8384
08:04:43,341 --> 08:04:44,633
không phải tất cả chúng ta sẽ xem xét.

8385
08:04:46,100 --> 08:04:48,931
Cùng một màu hồng nhưng nó\ncó tác dụng khác.

8386
08:04:48,931 --> 08:04:52,221
Đó là hai thanh màu hồng đi qua\n lần nữa so sánh

8387
08:04:53,911 --> 08:04:57,411
Và bạn sẽ thấy cái đó lớn nhất\n

8388
08:04:57,411 --> 08:05:02,480
ở bên phải, nhưng những số\nnhỏ hơn, như số 0 của chúng ta là

8389
08:05:02,480 --> 08:05:04,648
chỉ đang dần dần vượt qua.

8390
08:05:06,561 --> 08:05:09,261
Và sẽ mất một lúc\nđể đi hết sang bên trái.

8391
08:05:09,260 --> 08:05:12,920
Và ở đây nữa, hãy chú ý\nnhiều lần các nhịp giống nhau

8392
08:05:12,920 --> 08:05:16,950
đang trở thành màu hồng, bao nhiêu lần\n

8393
08:05:17,960 --> 08:05:21,501
Bởi vì nó chỉ giải quyết được một\nvấn đề tại một thời điểm trên mỗi lượt.

8394
08:05:21,501 --> 08:05:25,078
Và mỗi lần chúng ta làm điều đó, chúng ta đang bước\n

8395
08:05:25,078 --> 08:05:28,161
Và bây giờ tôi đã có thể tăng tốc độ này\n

8396
08:05:28,161 --> 08:05:32,480
nhưng Chúa ơi, đây chỉ là, cái gì, giống như\n

8397
08:05:33,501 --> 08:05:36,681
Giống như, n bình phương\n trông như thế này và có cảm giác như thế này.

8398
08:05:36,681 --> 08:05:38,931
Và bây giờ tôi chỉ đang cố gắng\n nghĩ ra từ ngữ để nói

8399
08:05:38,931 --> 08:05:40,640
cho đến khi chúng ta về đích ở đây.

8400
08:05:40,640 --> 08:05:43,611
Giống như, điều này sẽ gây khó chịu nếu\nđây là tốc độ sắp xếp

8401
08:05:43,611 --> 08:05:47,494
và đây là lý do tôi bí mật\n

8402
08:05:47,493 --> 08:05:49,911
bởi vì nó sẽ phải mất\nus một số bước khó chịu

8403
08:05:49,911 --> 08:05:51,570
để có được điều đó thay cho cô ấy.

8404
08:05:51,570 --> 08:05:54,530
Vậy hai thuật toán đó là n bình phương.

8405
08:05:54,530 --> 08:05:56,626
Trên thực tế, chúng ta có thể làm tốt hơn không?

8406
08:05:56,626 --> 08:05:59,751
Chà, để lưu thuật toán tốt nhất cho\n

8407
08:06:00,251 --> 08:06:04,771
Và khi chúng tôi quay lại, chúng tôi sẽ\nlàm tốt hơn n bình phương.

8408
08:06:06,841 --> 08:06:11,541
Vì vậy, thách thức trước mắt là\nlàm tốt hơn việc sắp xếp theo lựa chọn

8409
08:06:11,541 --> 08:06:14,631
và tốt hơn so với sắp xếp nổi\nvà lý tưởng nhất là không chỉ ở mức độ nhẹ

8410
08:06:14,631 --> 08:06:16,820
tốt hơn nhưng về cơ bản là tốt hơn.

8411
08:06:16,820 --> 08:06:20,330
Giống như tuần thứ 0, tuần thứ ba\n

8412
08:06:20,330 --> 08:06:23,220
về cơ bản là\nnhanh hơn hai cái còn lại.

8413
08:06:23,221 --> 08:06:26,311
Vậy liệu chúng ta có thể làm tốt hơn thứ gì đó\không phải thứ n bình phương không?

8414
08:06:26,311 --> 08:06:28,671
Chà, tôi cá là chúng ta có thể nếu\nchúng ta bắt đầu tiếp cận

8415
08:06:28,670 --> 08:06:30,440
vấn đề hơi khác một chút.

8416
08:06:30,440 --> 08:06:32,562
Những loại chúng tôi đã thực hiện\ncho đến nay, được biết đến rộng rãi

8417
08:06:32,562 --> 08:06:34,520
dưới dạng so sánh--\nvà kiểu nắm bắt đó

8418
08:06:34,521 --> 08:06:38,361
thực tế là chúng tôi đang làm rất lớn\n

8419
08:06:38,361 --> 08:06:41,721
Và bạn gần như đã thấy điều đó theo chiều dọc\n

8420
08:06:41,721 --> 08:06:43,216
đã được so sánh nhiều lần.

8421
08:06:43,216 --> 08:06:45,591
Nhưng có kỹ thuật\nlập trình này, và nó thực sự

8422
08:06:45,591 --> 08:06:48,501
một kỹ thuật toán học\còn được gọi là đệ quy

8423
08:06:48,501 --> 08:06:50,311
mà chúng ta thực sự đã thấy trước đây.

8424
08:06:50,311 --> 08:06:53,361
Và đây là một\nkhối xây dựng hoặc một mô hình tinh thần

8425
08:06:53,361 --> 08:06:56,661
chúng ta có thể giải quyết vấn đề\nđể giải quyết vấn đề sắp xếp

8426
08:06:56,661 --> 08:06:58,100
về cơ bản là khác nhau.

8427
08:06:58,100 --> 08:07:00,980
Nhưng trước tiên, hãy xem xét nó\trong một bối cảnh quen thuộc hơn.

8428
08:07:00,980 --> 08:07:07,550
Cách đây không lâu, tôi đã đề xuất cái giả này\n

8429
08:07:07,550 --> 08:07:10,490
Và hãy chú ý rằng điều thú vị về mã này

8430
08:07:10,491 --> 08:07:14,331
mặc dù tôi đã không gọi nó ra lúc\n

8431
08:07:14,330 --> 08:07:17,090
Giống như, tôi khẳng định đây là thuật toán\nan dành cho tìm kiếm

8432
08:07:17,091 --> 08:07:21,111
tuy nhiên có vẻ hơi bất công\nkhi tôi đang sử dụng tìm kiếm động từ

8433
08:07:21,111 --> 08:07:23,320
bên trong thuật toán tìm kiếm.

8434
08:07:23,320 --> 08:07:26,080
Nó giống như một kiểu\nđịnh nghĩa một từ bằng cách sử dụng từ đó trong tiếng Anh.

8435
08:07:26,080 --> 08:07:28,210
Thông thường, bạn thực sự không nên bỏ qua điều đó.

8436
08:07:28,210 --> 08:07:30,791
Nhưng có điều gì đó\nthú vị ở kỹ thuật này

8437
08:07:30,791 --> 08:07:35,471
ở đây vì mặc dù\ntoàn bộ thứ này là một thuật toán tìm kiếm

8438
08:07:35,471 --> 08:07:40,871
và tôi đang sử dụng thuật toán của riêng mình để\n

8439
08:07:40,870 --> 08:07:42,880
tính năng chính ở đây\nthường không có

8440
08:07:42,881 --> 08:07:46,031
xảy ra trong tiếng Anh khi bạn\nđịnh nghĩa một từ theo một từ

8441
08:07:46,030 --> 08:07:49,661
đó là khi tôi tìm kiếm ở bên trái\n

8442
08:07:51,170 --> 08:07:52,450
Tôi đang sử dụng thuật toán tương tự.

8443
08:07:52,451 --> 08:07:55,421
Nhưng vấn đề là,\nđịnh nghĩa, chỉ lớn bằng một nửa.

8444
08:07:55,420 --> 08:07:58,540
Vì vậy, đây sẽ không phải là một cuộc tranh luận theo chu kỳ theo cách tương tự.

8445
08:07:58,541 --> 08:08:02,111
Cách tiếp cận này, bằng cách sử dụng\ntìm kiếm trong tìm kiếm

8446
08:08:02,111 --> 08:08:05,651
sẽ giảm bớt vấn đề\n

8447
08:08:05,651 --> 08:08:08,541
một cửa hoặc không còn cửa.

8448
08:08:08,541 --> 08:08:11,081
Và đệ quy là một\nkỹ thuật lập trình

8449
08:08:11,080 --> 08:08:14,290
theo đó một hàm sẽ gọi chính nó.

8450
08:08:14,291 --> 08:08:18,581
Và chúng tôi chưa thấy điều này trong C, và\n

8451
08:08:18,580 --> 08:08:22,482
Nhưng trong C, bạn có thể có\na hàm gọi chính nó.

8452
08:08:22,483 --> 08:08:24,190
Và hình thức\ncó nghĩa đen như vậy

8453
08:08:24,190 --> 08:08:28,540
sử dụng tên hàm bên trong\n

8454
08:08:28,541 --> 08:08:32,671
Thực ra chúng tôi cũng từng thấy cơ hội này\ncho việc này trước đây.

8455
08:08:33,670 --> 08:08:35,920
Đây chính là mã giả\nđể tìm kiếm ai đó

8456
08:08:35,920 --> 08:08:37,540
trong một danh bạ điện thoại thực tế.

8457
08:08:37,541 --> 08:08:40,061
Và hãy để ý những đường màu vàng ở đây.

8458
08:08:40,061 --> 08:08:44,171
Chúng tôi đã mô tả những điều đó trong tuần 0\na tạo ra một vòng lặp, một chu kỳ.

8459
08:08:44,170 --> 08:08:48,670
Và đây là một cách tiếp cận mang tính thủ tục,\n

8460
08:08:48,670 --> 08:08:50,830
rất máy móc,\nnếu bạn muốn, hãy nói

8461
08:08:50,830 --> 08:08:54,730
tôi quay lại dòng thứ ba để\nthực hiện kiểu lặp này.

8462
08:08:54,730 --> 08:08:59,111
Nhưng thực sự, điều đó đang làm trong\n

8463
08:08:59,111 --> 08:09:04,480
cuốn sách chỉ bảo tôi tìm kiếm\n

8464
08:09:04,480 --> 08:09:08,260
Tôi đang làm việc đó một cách máy móc hơn\nbằng cách tự nhủ

8465
08:09:08,260 --> 08:09:09,850
số dòng nào để quay lại.

8466
08:09:09,850 --> 08:09:12,760
Nhưng điều đó tương đương với việc chỉ nói\n

8467
08:09:12,760 --> 08:09:15,310
tìm kiếm ở nửa bên phải,\nđiều quan trọng là bên trái

8468
08:09:15,311 --> 08:09:18,081
có và nửa bên phải\nnhỏ hơn bài toán ban đầu.

8469
08:09:18,080 --> 08:09:21,990
Sẽ là một lỗi nếu tôi chỉ nói tìm kiếm\n

8470
08:09:21,991 --> 08:09:23,741
bởi vì rõ ràng là bạn sẽ không bao giờ đi đến đâu cả.

8471
08:09:23,741 --> 08:09:25,901
Nhưng nếu bạn tìm kiếm một nửa, một nửa, một nửa

8472
08:09:25,901 --> 08:09:27,831
vấn đề ngày càng nhỏ hơn.

8473
08:09:27,830 --> 08:09:34,540
Vì vậy, hãy định dạng lại điện thoại của tuần số 0\n

8474
08:09:34,541 --> 08:09:39,501
nhưng đệ quy nhờ đó trong\nthuật toán tìm kiếm này

8475
08:09:39,501 --> 08:09:42,940
Tìm kiếm nhị phân AKA, trước đây\nđược gọi là phân chia và chinh phục, tôi là

8476
08:09:42,940 --> 08:09:46,300
theo nghĩa đen cũng sẽ sử dụng\nviệc tìm kiếm từ khóa ở đây.

8477
08:09:46,300 --> 08:09:48,310
Hãy chú ý đến những lợi ích\ncủa việc làm này

8478
08:09:48,311 --> 08:09:51,159
kiểu như thắt chặt mã lại,\nlàm cho mã ngắn gọn hơn một chút

8479
08:09:51,158 --> 08:09:53,201
mặc dù đó là một loại phúc lợi phụ ở đây.

8480
08:09:53,201 --> 08:09:56,710
Nhưng đó cũng là một\ncách mô tả tao nhã

8481
08:09:56,710 --> 08:10:01,570
một vấn đề xảy ra khi chỉ có hàm\na sử dụng chính nó

8482
08:10:01,570 --> 08:10:05,690
để giải một câu đố nhỏ hơn trong tầm tay.

8483
08:10:05,690 --> 08:10:08,740
Vì vậy bây giờ chúng ta hãy xem xét một\nvấn đề quen thuộc, một vấn đề nhỏ hơn

8484
08:10:08,741 --> 08:10:11,493
phiên bản khác với phiên bản bạn đã thử\nvới-- kiểu kim tự tháp này

8485
08:10:11,492 --> 08:10:12,700
nửa kim tự tháp này từ Mario.

8486
08:10:12,701 --> 08:10:15,431
Và hãy vứt bỏ những phần\nkhông thú vị chút nào

8487
08:10:15,431 --> 08:10:19,780
và chỉ cần cân nhắc xem chúng ta có thể làm thế nào,\n

8488
08:10:19,780 --> 08:10:21,880
kim tự tháp căn trái này, nếu bạn muốn.

8489
08:10:21,881 --> 08:10:28,991
Hãy để tôi qua đây và để tôi tạo\n

8490
08:10:28,991 --> 08:10:32,441
Và trong tệp này, tôi sẽ tiếp tục thêm cs50.h.

8491
08:10:32,440 --> 08:10:36,251
Và tôi sẽ bao gồm stdio.h.

8492
08:10:36,251 --> 08:10:41,800
Và mục tiêu trước mắt là triển khai trong\n

8493
08:10:41,800 --> 08:10:43,640
cái này và chính xác là kim tự tháp này.

8494
08:10:43,640 --> 08:10:46,473
Vì vậy không có chuỗi get hay bất kỳ chuỗi nào trong số đó--\n

8495
08:10:46,473 --> 08:10:49,760
và in chính xác\nkim tự tháp có chiều cao 4 tại đây.

8496
08:10:50,931 --> 08:10:55,306
Được rồi, hãy để tôi tiếp tục, và điều quan trọng là,\n

8497
08:10:55,306 --> 08:10:56,931
tốt, chúng ta sẽ tiếp tục và khái quát hóa nó.

8498
08:10:56,931 --> 08:10:58,763
Hãy tiếp tục và hỏi\nđộ cao của người dùng.

8499
08:10:58,763 --> 08:11:00,611
Chúng tôi đang sử dụng getint như trước đây.

8500
08:11:00,611 --> 08:11:02,861
Và tôi sẽ lưu trữ nó trong một\nbiến được gọi là chiều cao.

8501
08:11:02,861 --> 08:11:05,111
Và sau đó hãy để tôi tiếp tục\nvà chỉ cần gọi hàm

8502
08:11:05,111 --> 08:11:06,771
draw đi qua ở độ cao đó.

8503
08:11:06,771 --> 08:11:09,401
Vì vậy, hiện tại, hãy để tôi\giả sử rằng ai đó ở đâu đó

8504
08:11:09,401 --> 08:11:10,991
đã thực hiện một chức năng vẽ.

8505
08:11:10,991 --> 08:11:14,171
Và đây là\ntoàn bộ chương trình của tôi.

8506
08:11:14,170 --> 08:11:17,330
Được rồi, thật không may, C\nkhông có chức năng vẽ.

8507
08:11:17,330 --> 08:11:19,180
Vì vậy, hãy để tôi tiếp tục và phát minh ra một cái.

8508
08:11:19,181 --> 08:11:20,661
Nó không cần phải trả về một giá trị.

8509
08:11:20,661 --> 08:11:23,210
Nó chỉ cần in\nthứ gì đó-- cái gọi là tác dụng phụ.

8510
08:11:23,210 --> 08:11:27,820
Vì vậy tôi sẽ định nghĩa một hàm\n

8511
08:11:27,820 --> 08:11:30,640
Tôi sẽ gọi nó là n cho số, nhưng\ntôi có thể gọi nó là bất cứ thứ gì tôi muốn.

8512
08:11:32,210 --> 08:11:37,600
Tôi sẽ tiếp tục và in ra\n

8513
08:11:38,350 --> 08:11:42,070
Đặc điểm nổi bật ở đây là điều này\n

8514
08:11:43,181 --> 08:11:46,600
Và bây giờ ở độ cao thứ 4,\nhàng đầu tiên có một viên gạch.

8515
08:11:49,631 --> 08:11:52,461
Đó là một mẫu hay mà tôi\ncó thể thể hiện bằng mã.

8516
08:11:53,570 --> 08:11:55,751
Chà, tôi nhận được 4 int thì sao--

8517
08:11:55,751 --> 08:11:57,311
hãy để tôi làm theo cách cũ--

8518
08:11:58,091 --> 08:12:02,890
Và khi đó i nhỏ hơn hoặc bằng n.

8519
08:12:04,541 --> 08:12:08,171
nên tôi sẽ đi từ 1 đến 4\nđể giữ cho mình tỉnh táo ở đây.

8520
08:12:08,170 --> 08:12:11,050
Và bên trong\nvòng lặp này, tôi muốn làm gì?

8521
08:12:11,050 --> 08:12:12,920
Thực ra, hãy để tôi giữ nó\ntheo cách thông thường.

8522
08:12:12,920 --> 08:12:16,330
Hãy để tôi thay đổi điều này thành\nthành thông thường hơn 0

8523
08:12:16,330 --> 08:12:20,530
tới n dù có thể không phải vậy\n

8524
08:12:21,911 --> 08:12:24,326
Ở hàng 1, tôi muốn hai\nviên gạch, dot dot dot.

8525
08:12:26,890 --> 08:12:28,600
Nhưng tôi đang trở nên truyền thống hơn.

8526
08:12:28,600 --> 08:12:32,800
Vậy trên mỗi hàng, tôi muốn in bao nhiêu\ngạch?

8527
08:12:32,800 --> 08:12:34,240
Ồ, tôi nghĩ tôi muốn làm việc này.

8528
08:12:34,241 --> 08:12:40,061
Ví dụ, đối với int j, chung cho\n

8529
08:12:40,061 --> 08:12:47,291
hãy bắt đầu j từ 0 và làm điều này\nmiễn là nhỏ hơn tôi cộng 1

8530
08:12:50,861 --> 08:12:55,030
Vâng, một lần nữa, khi tôi bằng 0, đó là\n

8531
08:12:55,030 --> 08:12:57,010
Khi tôi bằng 1, đó là hàng thứ hai.

8532
08:12:57,791 --> 08:13:00,611
Và dot dot dot, khi tôi\nis 3, tôi muốn bốn viên gạch.

8533
08:13:00,611 --> 08:13:03,820
Vậy một lần nữa mình phải cộng 1 với i\nđể có tổng số viên gạch

8534
08:13:03,820 --> 08:13:05,480
mà tôi muốn in ra màn hình.

8535
08:13:05,480 --> 08:13:10,181
Vì vậy, bên trong vòng lặp for lồng nhau này,\n

8536
08:13:13,330 --> 08:13:17,472
Thay vào đó, tôi sẽ lưu dòng\nmới cho about ở đây.

8537
08:13:17,473 --> 08:13:19,181
Được rồi, điều\ncuối cùng tôi sẽ làm

8538
08:13:19,181 --> 08:13:22,911
là sao chép và dán nguyên mẫu\na ở đầu tệp.

8539
08:13:23,980 --> 08:13:27,088
Và một lần nữa, đây là\ntuần một, tuần hai.

8540
08:13:27,088 --> 08:13:29,381
Sẽ không nhất thiết phải xuất hiện trong tâm trí bạn nhanh như vậy

8541
08:13:29,381 --> 08:13:32,741
có thể khai thác sau tất cả quá trình luyện tập này,\n

8542
08:13:32,741 --> 08:13:35,591
về những gì chính bạn đã làm cho Mario-- in ra

8543
08:13:35,591 --> 08:13:38,690
một kim tự tháp hy vọng trong giây lát\nsẽ trông như thế này.

8544
08:13:38,690 --> 08:13:40,730
Vì vậy, hãy để tôi quay lại mã của tôi.

8545
08:13:40,730 --> 08:13:44,920
Hãy để tôi thực hiện phép lặp và\nhãy để tôi thực hiện phép lặp dấu chấm.

8546
08:13:46,901 --> 08:13:50,201
Có vẻ đúng và hãy giả sử\n

8547
08:13:56,131 --> 08:13:59,820
Vì vậy, đây thực sự là một ví dụ\nsự lặp lại-- làm điều gì đó

8548
08:14:02,521 --> 08:14:05,521
Giống như, tôi thực sự có một chức năng\n

8549
08:14:05,521 --> 08:14:09,931
Nhưng tôi có thể nghĩ đến việc triển khai\n

8550
08:14:11,070 --> 08:14:13,080
Và nó hoàn toàn không cần thiết cho vấn đề này

8551
08:14:13,080 --> 08:14:15,720
bởi vì thực lòng mà nói thì vấn đề này không phức tạp lắm

8552
08:14:15,721 --> 08:14:17,747
để giải quyết khi bạn đã\nthực hành thành thạo.

8553
08:14:17,747 --> 08:14:20,580
Chắc chắn là lần đầu tiên,\n

8554
08:14:20,580 --> 08:14:23,610
Nhưng bây giờ bạn đã liên kết, được rồi, hàng một

8555
08:14:23,611 --> 08:14:26,370
với một viên gạch, hàng thứ hai với hai viên gạch\n

8556
08:14:27,701 --> 08:14:30,131
Nhưng chúng ta có thể nghĩ về vấn đề này bằng cách nào khác?

8557
08:14:30,131 --> 08:14:33,300
Chà, cấu trúc vật lý này,\nnhững viên gạch này, theo một nghĩa nào đó

8558
08:14:33,300 --> 08:14:39,341
là một cấu trúc đệ quy, một cấu trúc\n

8559
08:14:40,721 --> 08:14:45,961
Chà, nếu tôi hỏi bạn câu hỏi này,\n

8560
08:14:45,960 --> 08:14:49,080
trông giống như,\ntất nhiên, bạn sẽ chỉ vào bức ảnh này.

8561
08:14:49,080 --> 08:14:55,530
Nhưng bạn cũng có thể nói một cách khéo léo với tôi rằng, à

8562
08:14:55,530 --> 08:15:00,600
thực tế nó là một hình chóp có\nchiều cao 3 cộng thêm 1 hàng nữa.

8563
08:15:00,600 --> 08:15:02,597
Và đây là lập luận mang tính chu kỳ, phải không?

8564
08:15:02,598 --> 08:15:05,431
Việc làm này thường khó chịu\n

8565
08:15:05,431 --> 08:15:07,561
bởi vì bạn đang xác định một\nthứ theo chính nó.

8566
08:15:07,561 --> 08:15:08,769
Kim tự tháp có chiều cao 4 là gì?

8567
08:15:08,769 --> 08:15:12,541
Vâng, đó là một hình chóp có\nchiều cao 3 cộng thêm 1 hàng nữa.

8568
08:15:12,541 --> 08:15:15,300
Nhưng chúng ta có thể tận dụng\nlogic này trong mã.

8569
08:15:15,300 --> 08:15:16,951
Chà, kim tự tháp có chiều cao 3 là gì?

8570
08:15:16,951 --> 08:15:19,230
Vâng, đó là một hình chóp có\nchiều cao 2 cộng thêm 1 hàng nữa.

8571
08:15:19,230 --> 08:15:21,300
Được rồi, kim tự tháp có chiều cao 2 là gì?

8572
08:15:21,300 --> 08:15:23,730
Vâng, đó là một hình chóp\ncó chiều cao 1 cộng thêm 1 hàng nữa.

8573
08:15:23,730 --> 08:15:26,730
Và hy vọng rằng quá trình này\n

8574
08:15:26,730 --> 08:15:29,350
kim tự tháp ngày càng nhỏ hơn.

8575
08:15:29,350 --> 08:15:32,970
Vậy là bạn sẽ không có cái này\n

8576
08:15:32,971 --> 08:15:36,911
vô số lần bởi vì khi\n

8577
08:15:36,911 --> 08:15:38,491
phần cuối của kim tự tháp, tốt thôi.

8578
08:15:38,491 --> 08:15:39,961
Kim tự tháp có chiều cao 1 là gì?

8579
08:15:39,960 --> 08:15:42,990
Chà, đó là một kim tự tháp không có chiều cao cộng thêm một hàng nữa.

8580
08:15:42,991 --> 08:15:45,631
Và tại thời điểm đó, mọi thứ\ntrở nên tiêu cực--

8581
08:15:46,411 --> 08:15:48,396
Nếu không thì mọi thứ sẽ trở nên tiêu cực.

8582
08:15:48,396 --> 08:15:49,771
Và vì vậy bạn có thể dừng lại.

8583
08:15:49,771 --> 08:15:52,291
Trường hợp cơ bản là khi\nkhông còn kim tự tháp nữa.

8584
08:15:52,291 --> 08:15:56,441
Vì vậy có một cách để vẽ một đường trong\n

8585
08:15:56,440 --> 08:16:00,540
Nhưng ý tưởng xác định một vật chất\n

8586
08:16:00,541 --> 08:16:06,541
hoặc mã theo nghĩa của chính nó thực sự cho phép\n

8587
08:16:06,541 --> 08:16:08,521
Hãy để tôi quay lại mã của tôi ở đây.

8588
08:16:08,521 --> 08:16:14,161
Hãy để tôi tiếp tục và tạo một cái\n

8589
08:16:14,161 --> 08:16:20,460
thúc đẩy ý tưởng này\n

8590
08:16:22,440 --> 08:16:26,100
Hãy để tôi tiếp tục và bao gồm\nstandardio.h, int main void.

8591
08:16:26,100 --> 08:16:30,360
Và sau đó vào bên trong phần chính, tôi sẽ đi\n

8592
08:16:30,361 --> 08:16:34,831
chiều cao bằng get int,\nassking người dùng về chiều cao.

8593
08:16:34,830 --> 08:16:38,230
Và sau đó tôi sẽ tiếp tục\nvà gọi draw truyền theo chiều cao.

8594
08:16:38,230 --> 08:16:39,881
Vì vậy, điều đó sẽ vẫn như cũ.

8595
08:16:39,881 --> 08:16:45,941
Tôi thậm chí còn định làm nguyên mẫu của mình\n

8596
08:16:45,940 --> 08:16:48,181
Và bây giờ tôi sẽ\nimplement void ở đây

8597
08:16:48,181 --> 08:16:49,951
tất nhiên là với nguyên mẫu đó.

8598
08:16:49,951 --> 08:16:52,831
Tuy nhiên, mã bây giờ\nsẽ khác một chút.

8599
08:16:54,431 --> 08:16:59,971
Chà, trước hết, nếu bạn yêu cầu\ntôi vẽ một hình chóp có chiều cao n

8600
08:16:59,971 --> 08:17:02,941
Tôi sẽ trở thành một người khôn ngoan ở đây và nói, à, chỉ cần

8601
08:17:02,940 --> 08:17:05,370
vẽ một hình chóp của n trừ 1--

8602
08:17:06,122 --> 08:17:08,580
Được rồi, nhưng vẫn\na còn một ít việc phải làm.

8603
08:17:08,580 --> 08:17:13,020
Điều gì xảy ra sau khi tôi in hoặc\nvẽ một hình chóp có chiều cao n trừ 1

8604
08:17:13,021 --> 08:17:17,701
theo định nghĩa\ncấu trúc của chúng ta vừa rồi?

8605
08:17:17,701 --> 08:17:22,831
Những gì còn lại sau khi vẽ một kim tự tháp\n

8606
08:17:25,201 --> 08:17:26,761
Chúng ta cần thêm một hàng băm nữa.

8607
08:17:26,760 --> 08:17:28,110
Được rồi, vậy tôi có thể làm điều đó phải không?

8608
08:17:28,111 --> 08:17:29,574
Tôi ổn với các vòng lặp đơn.

8609
08:17:29,574 --> 08:17:30,991
Không có sự lồng ghép cần thiết ở đây.

8610
08:17:30,991 --> 08:17:35,371
Tôi sẽ làm điều này-- vì\nint tôi nhận được 0, tôi nhỏ hơn n

8611
08:17:35,370 --> 08:17:37,545
đó là chiều cao\nđược truyền vào, i cộng cộng.

8612
08:17:37,545 --> 08:17:39,420
Và bên trong\nvòng lặp này, tôi rất đơn giản

8613
08:17:39,420 --> 08:17:41,100
sẽ in ra một hàm băm duy nhất.

8614
08:17:41,100 --> 08:17:45,010
Và sau đó xuống đây, tôi sẽ\n

8615
08:17:45,960 --> 08:17:48,080
Tôi có thể không thấy thoải mái\nvới các vòng lặp lồng nhau.

8616
08:17:49,080 --> 08:17:52,020
Vòng lặp này\nở đây làm gì trên dòng 17 đến 20?

8617
08:17:52,021 --> 08:17:57,901
Theo nghĩa đen, nó in n giá trị băm bằng\n

8618
08:17:59,491 --> 08:18:02,291
Vì vậy, đó là cú pháp kiểu tuần một.

8619
08:18:02,291 --> 08:18:05,101
Nhưng điều này thật khó hiểu\nbởi vì bằng cách nào đó tôi đã

8620
08:18:05,100 --> 08:18:09,841
tóm tắt việc triển khai\n

8621
08:18:11,611 --> 08:18:15,611
Nhưng điều này có vấn đề vì\nis vì trong trường hợp này

8622
08:18:15,611 --> 08:18:22,261
chức năng ngăn kéo của tôi, xin lưu ý, luôn là\n

8623
08:18:23,251 --> 08:18:28,561
Nhưng lý tưởng nhất là khi nào tôi muốn\nquá trình mang tính chu kỳ này dừng lại?

8624
08:18:28,561 --> 08:18:32,371
Khi nào tôi không muốn gọi draw nữa?

8625
08:18:35,657 --> 08:18:37,740
Khi tôi lên tới đỉnh\nkim tự tháp, khi n bằng 1

8626
08:18:37,741 --> 08:18:40,081
hoặc chết tiệt, khi các kim tự tháp\n biến mất và n bằng 0.

8627
08:18:40,080 --> 08:18:42,420
Tôi có thể chọn bất kỳ đường nào trên cát, miễn là nó

8628
08:18:42,420 --> 08:18:44,050
đại loại như vậy ở cuối quá trình.

8629
08:18:44,050 --> 08:18:45,841
Sau đó tôi không muốn gọi draw nữa.

8630
08:18:45,841 --> 08:18:48,210
Vậy có lẽ điều tôi nên làm là thế này.

8631
08:18:48,210 --> 08:18:54,810
Nếu n bằng 0 thì\nthực sự không có gì để vẽ.

8632
08:18:54,811 --> 08:18:58,701
Vậy nên tôi sẽ đi\nap tiếp và quay lại như thế này.

8633
08:18:58,701 --> 08:19:01,281
Nếu không, tôi sẽ\ntiếp tục và vẽ

8634
08:19:01,280 --> 08:19:04,598
n trừ đi 1 hàng rồi thêm một hàng nữa.

8635
08:19:04,598 --> 08:19:06,140
Và tôi có thể diễn đạt điều này một cách khác.

8636
08:19:06,140 --> 08:19:08,900
Tôi có thể làm điều gì đó như thế này,\nđiều này cũng tương đương.

8637
08:19:08,901 --> 08:19:13,851
Tôi có thể nói điều gì đó như nếu n\nis lớn hơn hoặc bằng 0

8638
08:19:13,850 --> 08:19:15,823
sau đó tiếp tục và vẽ hàng.

8639
08:19:15,823 --> 08:19:17,030
Nhưng tôi thích nó theo cách này đầu tiên.

8640
08:19:17,030 --> 08:19:18,948
Hiện tại, tôi sẽ\nđi theo cách ban đầu

8641
08:19:18,948 --> 08:19:22,100
chỉ để hỏi một câu hỏi đơn giản và\n

8642
08:19:23,330 --> 08:19:26,100
Và chết tiệt, để được\nsiêu an toàn, đề phòng

8643
08:19:26,100 --> 08:19:28,400
người dùng nhập vào\nsố âm, hãy để tôi cũng vậy

8644
08:19:28,401 --> 08:19:31,341
chỉ cần kiểm tra xem n có phải là số âm không,\n

8645
08:19:32,570 --> 08:19:35,850
Tôi không trả về giá trị vì\nmột lần nữa, hàm này không có giá trị.

8646
08:19:35,850 --> 08:19:38,040
Nó không cần hoặc có giá trị trả về.

8647
08:19:38,041 --> 08:19:40,221
Vì vậy chỉ cần nói return là đủ.

8648
08:19:40,221 --> 08:19:45,021
Nhưng nếu n bằng 1 hoặc 2\cũng không phải 3 hoặc bất cứ giá trị nào cao hơn

8649
08:19:45,021 --> 08:19:50,480
thật hợp lý khi vẽ một kim tự tháp\n

8650
08:19:50,480 --> 08:19:55,041
trong số 4, 3, rồi tiếp tục\nvà in thêm một hàng.

8651
08:19:55,041 --> 08:20:00,811
Vì vậy đây là một ví dụ về mã\n

8652
08:20:02,510 --> 08:20:07,280
Nhưng cái gọi là trường hợp cơ bản\nensures, điều kiện này đảm bảo

8653
08:20:07,280 --> 08:20:09,050
rằng chúng ta sẽ không làm điều này mãi mãi.

8654
08:20:09,050 --> 08:20:11,661
Nếu không thì chúng ta thực sự sẽ\nlàm điều này vô số lần

8655
08:20:11,661 --> 08:20:14,690
và điều gì đó tồi tệ\ncó thể sẽ xảy ra.

8656
08:20:14,690 --> 08:20:18,591
Được rồi, để tôi tiếp tục và\n

8657
08:20:18,591 --> 08:20:22,611
OK, không có lỗi cú pháp-- gạch chéo dấu chấm\nđệ quy, Enter, chiều cao 4

8658
08:20:24,951 --> 08:20:28,761
Nếu chỉ vì một số bạn đã chạy\n

8659
08:20:28,760 --> 08:20:32,780
hãy để tôi loại bỏ trường hợp cơ bản\n

8660
08:20:34,341 --> 08:20:36,510
Ồ, và thực ra, bây giờ\nit đang thực sự nắm bắt được nó.

8661
08:20:36,510 --> 08:20:39,411
Vì vậy, trình biên dịch ở đây đủ thông minh\đủ để nhận ra

8662
08:20:39,411 --> 08:20:42,830
rằng tất cả các đường dẫn qua hàm\n này sẽ tự gọi chính nó.

8663
08:20:42,830 --> 08:20:45,661
AKA, Nó sẽ lặp lại mãi mãi.

8664
08:20:45,661 --> 08:20:47,451
Vậy hãy để tôi làm điều đầu tiên.

8665
08:20:47,451 --> 08:20:49,911
Giả sử tôi chỉ kiểm tra n bằng 0.

8666
08:20:49,911 --> 08:20:53,751
Hãy để tôi tiếp tục và biên dịch lại\nmã này bằng cách thực hiện đệ quy.

8667
08:20:53,751 --> 08:20:56,390
Và bây giờ hãy để tôi\nbất hợp tác.

8668
08:20:56,390 --> 08:21:00,560
Khi tôi chạy chương trình này,\nvẫn hoạt động với giá trị 4, vẫn hoạt động với giá trị 0.

8669
08:21:00,561 --> 08:21:03,471
Nếu tôi thích âm 100 thì sao?

8670
08:21:03,471 --> 08:21:07,281
Có ai trong số các bạn gặp phải\nlỗi phân đoạn hoặc lỗi kết xuất lõi chưa?

8671
08:21:08,600 --> 08:21:13,341
Giống như, điều này có nghĩa là tôi bằng cách nào đó\n

8672
08:21:13,341 --> 08:21:17,271
Và tóm lại, tôi thực sự đã gọi\nhàm này hàng ngàn lần

8673
08:21:17,271 --> 08:21:19,911
vô tình, có vẻ như\nbây giờ, cho đến khi chương trình chỉ

8674
08:21:19,911 --> 08:21:22,774
bảo lãnh cho tôi vì cuối cùng\ntôi đã chạm vào bộ nhớ trong máy tính

8675
08:21:23,690 --> 08:21:25,501
Điều đó thậm chí còn có ý nghĩa hơn vào tuần tới.

8676
08:21:25,501 --> 08:21:27,001
Nhưng hiện tại, nó chỉ đơn giản là một lỗi.

8677
08:21:27,001 --> 08:21:28,791
Và tôi có thể tránh được\nlỗi đó trong bối cảnh này

8678
08:21:28,791 --> 08:21:33,261
có lẽ không phải bối cảnh pset của riêng bạn,\n

8679
08:21:33,260 --> 08:21:35,700
cho phép số âm cả.

8680
08:21:35,701 --> 08:21:38,061
Vậy với việc\nkhối tòa nhà này được đặt đúng chỗ, điều gì

8681
08:21:38,061 --> 08:21:41,781
bây giờ chúng ta có thể sắp xếp theo\nnhững con số tương tự không?

8682
08:21:41,780 --> 08:21:44,751
Chà, hóa ra là có một\n

8683
08:21:44,751 --> 08:21:46,341
Và còn có rất nhiều người khác nữa.

8684
08:21:46,341 --> 08:21:51,283
Nhưng sắp xếp hợp nhất là một điều hay để thảo luận\n

8685
08:21:51,283 --> 08:21:53,451
sẽ hoạt động tốt hơn\nsắp xếp lựa chọn và bong bóng

8686
08:21:53,451 --> 08:21:55,851
sắp xếp tốt hơn n bình phương.

8687
08:21:55,850 --> 08:21:58,598
Nhưng điều đáng chú ý là việc nghĩ đến\nkhó hơn một chút.

8688
08:21:58,598 --> 08:22:01,640
Trên thực tế, tôi sẽ tự mình thực hiện với\n

8689
08:22:01,640 --> 08:22:05,721
chứ không phải con người vì đệ quy\n

8690
08:22:05,721 --> 08:22:08,061
để tập trung suy nghĩ,\nthường là luyện tập một chút.

8691
08:22:08,061 --> 08:22:10,269
Nhưng tôi sẽ xem liệu chúng ta có thể\nđi qua nó một cách có phương pháp hay không

8692
08:22:10,269 --> 08:22:12,620
đủ để điều này được đưa ra ánh sáng.

8693
08:22:12,620 --> 08:22:16,820
Vì vậy đây là mã giả mà tôi đề xuất\n

8694
08:22:16,820 --> 08:22:20,001
Theo tinh thần đệ quy,\nthuật toán sắp xếp này

8695
08:22:20,001 --> 08:22:25,381
theo nghĩa đen là gọi chính nó bằng cách sử dụng\n

8696
08:22:25,381 --> 08:22:26,961
Vậy cách sắp xếp hợp nhất hoạt động như thế nào?

8697
08:22:26,960 --> 08:22:30,380
Nó nói một cách đáng ghét, à, nếu\n

8698
08:22:30,381 --> 08:22:33,081
sắp xếp nửa bên trái rồi\ngo sắp xếp nửa bên phải

8699
08:22:33,080 --> 08:22:34,790
và sau đó hợp nhất cả hai lại với nhau.

8700
08:22:34,791 --> 08:22:36,043
Bây giờ đáng ghét theo nghĩa nào?

8701
08:22:36,043 --> 08:22:38,751
Chà, nếu tôi vừa yêu cầu bạn sắp xếp\n

8702
08:22:38,751 --> 08:22:40,431
ừ, hãy sắp xếp thứ đó\nrồi sắp xếp

8703
08:22:40,431 --> 08:22:43,098
chuyện đó, mục đích của việc hỏi bạn ngay từ đầu là gì?

8704
08:22:43,098 --> 08:22:45,441
Nhưng điều quan trọng là\nmỗi dòng này là

8705
08:22:45,440 --> 08:22:48,240
sắp xếp một phần nhỏ hơn của vấn đề.

8706
08:22:48,241 --> 08:22:50,811
Vì vậy, cuối cùng, chúng ta\nsẽ có thể giảm bớt điều này

8707
08:22:50,811 --> 08:22:54,771
vào một điều gì đó không tiếp diễn\n

8708
08:22:56,480 --> 08:22:59,300
Có một trường hợp chúng ta\nchỉ cần kiểm tra, đợi một chút

8709
08:22:59,300 --> 08:23:01,881
nếu chỉ có một\nsố để sắp xếp thì thế là xong.

8710
08:23:01,881 --> 08:23:03,831
Hãy bỏ cuộc vì bạn đã hoàn tất.

8711
08:23:03,830 --> 08:23:06,950
Vì vậy phải có trường hợp cơ bản này\ntrong bất kỳ việc sử dụng đệ quy nào

8712
08:23:06,951 --> 08:23:11,451
để đảm bảo rằng bạn không vô tâm gọi mình mãi mãi.

8713
08:23:11,451 --> 08:23:13,741
Bạn phải dừng lại ở một điểm nào đó.

8714
08:23:13,741 --> 08:23:16,921
Vì vậy, hãy tập trung vào\nbước thứ ba trong số các bước này.

8715
08:23:16,920 --> 08:23:21,688
Việc hợp nhất hai\ndanh sách, hai nửa danh sách có ý nghĩa gì

8716
08:23:21,688 --> 08:23:23,480
chỉ vì điều này\rõ ràng sẽ xảy ra

8717
08:23:23,480 --> 08:23:25,650
một thành phần quan trọng-- vậy\nở đây, ví dụ

8718
08:23:25,651 --> 08:23:28,251
là hai nửa của danh sách có kích thước 8.

8719
08:23:28,251 --> 08:23:31,370
Chúng ta có số 2-- và tôi sẽ gọi\n

8720
08:23:36,561 --> 08:23:41,070
Lưu ý rằng nửa bên trái ở\n

8721
08:23:41,070 --> 08:23:45,361
và nửa bên phải, 0136,\nis cũng được sắp xếp.

8722
08:23:45,361 --> 08:23:48,230
Vì vậy, đó là một điều tốt vì\nit có nghĩa là về mặt lý thuyết, tôi đã

8723
08:23:48,230 --> 08:23:49,640
đã sắp xếp nửa bên trái rồi.

8724
08:23:49,640 --> 08:23:51,980
Tôi đã sắp xếp được nửa bên phải\trước khi chúng ta bắt đầu.

8725
08:23:51,980 --> 08:23:54,050
Tôi chỉ cần hợp nhất hai nửa này.

8726
08:23:54,050 --> 08:23:56,161
Việc sắp xếp hai nửa có ý nghĩa gì?

8727
08:23:56,161 --> 08:23:57,911
Vâng, để thảo luận, tôi chỉ

8728
08:23:57,911 --> 08:24:03,701
sẽ lật hầu hết các số\n

8729
08:24:04,721 --> 08:24:07,751
Ở đây có hai nửa, trái và phải.

8730
08:24:07,751 --> 08:24:09,820
Hiện tại, tôi\không cân nhắc

8731
08:24:09,820 --> 08:24:13,893
phần tử ngoài cùng bên trái của mỗi nửa--\n

8732
08:24:13,893 --> 08:24:15,100
và cái bên trái đây.

8733
08:24:15,100 --> 08:24:18,161
Làm cách nào để hợp nhất hai danh sách này lại với nhau?

8734
08:24:18,161 --> 08:24:22,901
Chà, nếu tôi nhìn vào 2 và tôi nhìn vào 0,\n

8735
08:24:23,863 --> 08:24:25,570
Vì vậy tôi sẽ lấy\nsố 0 và tôi sẽ

8736
08:24:25,570 --> 08:24:28,510
để đặt nó vào vị trí riêng\không phải cái kệ mới này ở đây.

8737
08:24:28,510 --> 08:24:34,661
Và bây giờ tôi sẽ xem xét,\na là một phần trong quá trình lặp lại của tôi

8738
08:24:34,661 --> 08:24:37,631
phần đầu của danh sách này và\nphần đầu mới của danh sách này.

8739
08:24:37,631 --> 08:24:39,491
Vì vậy, bây giờ tôi đang so sánh 2 và 1.

8740
08:24:40,570 --> 08:24:42,760
Tôi sẽ tiếp tục và lấy số 1.

8741
08:24:42,760 --> 08:24:45,490
Bây giờ tôi sẽ so sánh phần đầu của danh sách bên trái

8742
08:24:45,491 --> 08:24:47,801
và phần đầu mới của\ndanh sách bên phải, 2 và 3.

8743
08:24:49,379 --> 08:24:51,671
Bây giờ tôi sẽ so sánh phần đầu của danh sách bên trái

8744
08:24:51,670 --> 08:24:53,650
và phần đầu\ndanh sách bên phải, 4 và 3.

8745
08:24:55,870 --> 08:24:58,611
Bây giờ tôi sẽ so sánh 4\na với phần đầu và phần cuối

8746
08:24:58,611 --> 08:25:00,191
hóa ra, trong danh sách thứ hai--

8747
08:25:01,348 --> 08:25:03,640
Bây giờ tôi sẽ so sánh phần đầu của danh sách bên trái

8748
08:25:03,640 --> 08:25:05,183
và phần đầu của danh sách bên phải--

8749
08:25:06,791 --> 08:25:09,371
Tôi nhận ra rằng chuyện này sẽ không kết thúc tốt đẹp vì tôi đã rời đi

8750
08:25:09,370 --> 08:25:10,780
quá nhiều khoảng cách giữa các con số.

8751
08:25:10,780 --> 08:25:12,698
Nhưng điều đó không liên quan gì đến thuật toán.

8752
08:25:12,698 --> 08:25:14,201
7 là sự bắt đầu của danh sách bên trái.

8753
08:25:14,201 --> 08:25:15,820
6 là sự khởi đầu của danh sách bên phải.

8754
08:25:17,320 --> 08:25:20,771
Và có nguy cơ\nkết thúc tất cả những điều này

8755
08:25:20,771 --> 08:25:27,671
nếu bây giờ tôi dành chỗ cho\yếu tố này, chúng tôi hy vọng

8756
08:25:27,670 --> 08:25:34,760
sắp xếp toàn bộ bằng cách hợp nhất\n

8757
08:25:40,809 --> 08:25:43,101
Tôi hơi lo lắng vì\nbây giờ tôi đang trở nên mỉa mai

8758
08:25:43,100 --> 08:25:48,230
nhưng bây giờ chúng tôi đã hợp nhất hai nửa danh sách.

8759
08:25:48,230 --> 08:25:51,791
Chúng tôi chưa làm được điều can đảm\n

8760
08:25:52,791 --> 08:25:55,521
Nhưng tôi khẳng định rằng đó\là cách bạn máy móc

8761
08:25:57,320 --> 08:25:59,420
Bạn tiếp tục nhìn vào\nđầu mỗi danh sách

8762
08:25:59,420 --> 08:26:02,001
và bạn chỉ cần\nkết hợp chúng lại với nhau dựa trên

8763
08:26:02,001 --> 08:26:05,431
cái nào thuộc về\nđầu tiên dựa trên kích thước của nó.

8764
08:26:05,431 --> 08:26:07,820
Vì vậy, nếu bạn đồng ý rằng\nđó là một cách hợp lý

8765
08:26:07,820 --> 08:26:12,381
để hợp nhất hai danh sách lại với nhau,\nhãy tiếp tục và tập trung vào cuối cùng

8766
08:26:12,381 --> 08:26:15,621
về ý nghĩa của việc\thực sự sắp xếp nửa bên trái

8767
08:26:15,620 --> 08:26:17,797
và sắp xếp nửa bên phải của\na cả dãy số.

8768
08:26:17,797 --> 08:26:19,880
Và để làm được điều này, tôi sẽ\ntiếp tục đặt hàng chúng

8769
08:26:19,881 --> 08:26:21,681
theo thứ tự có vẻ ngẫu nhiên này.

8770
08:26:21,681 --> 08:26:24,561
Và tôi chỉ có một chút gian lận\n

8771
08:26:24,561 --> 08:26:26,691
Và lần này tôi sẽ bắt đầu từ\nđầu.

8772
08:26:26,690 --> 08:26:29,751
Và hy vọng rằng những thứ này\nsẽ không rơi xuống bất cứ lúc nào.

8773
08:26:29,751 --> 08:26:35,661
Nhưng tôi chỉ cố tình đặt\n

8774
08:26:41,361 --> 08:26:43,701
Hy vọng điều này sẽ không sụp đổ.

8775
08:26:43,701 --> 08:26:48,351
Bây giờ đây là một mảng\nsize 8 với 8 số nguyên.

8776
08:26:49,651 --> 08:26:52,693
Tôi có thể sử dụng phương pháp sắp xếp lựa chọn và chỉ\n

8777
08:26:52,692 --> 08:26:55,460
Tôi có thể sử dụng tính năng sắp xếp nổi bật và\nso sánh các cặp, cặp, cặp.

8778
08:26:55,460 --> 08:26:58,190
Nhưng những cái đó sẽ theo thứ tự O lớn của n bình phương.

8779
08:26:58,190 --> 08:27:00,360
Hy vọng của tôi là\nvề cơ bản sẽ làm tốt hơn ở đây.

8780
08:27:00,361 --> 08:27:02,120
Vậy hãy xem liệu chúng ta có thể làm tốt hơn không.

8781
08:27:02,120 --> 08:27:04,161
Được rồi, bây giờ hãy để tôi\nxem mã của tôi.

8782
08:27:05,850 --> 08:27:07,670
Làm cách nào để triển khai sắp xếp hợp nhất?

8783
08:27:07,670 --> 08:27:09,663
Chà, nếu chỉ có\không có số nào, tôi bỏ cuộc.

8784
08:27:10,580 --> 08:27:12,630
Có tám số,\nnên không áp dụng được.

8785
08:27:12,631 --> 08:27:14,963
Tôi sẽ tiếp tục và\nsắp xếp nửa bên trái của số.

8786
08:27:14,963 --> 08:27:16,820
Được rồi, đây là nửa bên trái--

8787
08:27:18,830 --> 08:27:21,590
Tôi có sắp xếp một mảng có kích thước 4 không?

8788
08:27:21,591 --> 08:27:24,530
Chà, đây là lúc\nđệ quy bắt đầu.

8789
08:27:24,530 --> 08:27:26,510
Làm thế nào để bạn sắp xếp một danh sách kích thước 4?

8790
08:27:26,510 --> 08:27:28,670
Vâng, có\ncode giả trên bảng.

8791
08:27:28,670 --> 08:27:31,850
Tôi sắp xếp nửa bên trái\ncủa danh sách kích thước 4.

8792
08:27:37,041 --> 08:27:38,841
Được rồi, bây giờ tôi có danh sách cỡ 2.

8793
08:27:50,841 --> 08:27:52,370
Nếu chỉ có một số, tôi đã làm xong.

8794
08:27:53,594 --> 08:27:55,011
Được rồi, bước tiếp theo là gì?

8795
08:27:55,010 --> 08:27:56,540
Bây giờ bạn phải tua lại thời gian.

8796
08:27:56,541 --> 08:28:00,871
Tôi vừa sắp xếp nửa bên trái của\nnửa bên trái của nửa bên trái.

8797
08:28:07,100 --> 08:28:11,420
Vì vậy, tại thời điểm này của câu chuyện,\n

8798
08:28:11,420 --> 08:28:14,210
5 được sắp xếp và 2 được sắp xếp.

8799
08:28:14,210 --> 08:28:18,771
Nhưng bước thứ ba và bước cuối cùng là gì\n

8800
08:28:20,010 --> 08:28:21,960
Đây là danh sách bên trái,\nđây là danh sách bên phải.

8801
08:28:21,960 --> 08:28:23,210
Làm cách nào để hợp nhất những thứ này lại với nhau?

8802
08:28:23,210 --> 08:28:25,890
Tôi so sánh các danh sách\nvà tôi đặt cả hai vào đó.

8803
08:28:25,890 --> 08:28:27,951
Tôi chỉ có [? 5 ?]\ncòn lại và tôi làm điều đó.

8804
08:28:27,951 --> 08:28:30,351
Vì vậy, bây giờ chúng tôi thấy một số tiến bộ rõ ràng.

8805
08:28:32,580 --> 08:28:37,220
Chúng tôi bắt đầu sắp xếp nửa bên trái của\n

8806
08:28:39,260 --> 08:28:42,450
Chúng ta vừa sắp xếp\nnửa bên trái của nửa bên trái.

8807
08:28:42,451 --> 08:28:45,501
Vậy điều gì sẽ xảy ra sau khi sắp xếp\nnửa bên trái của mọi thứ?

8808
08:28:46,052 --> 08:28:48,260
Được rồi, đây cũng là điều vô nghĩa tương tự.

8809
08:28:55,951 --> 08:28:59,241
Vậy đó là số 4, và đó là số 7.

8810
08:29:00,471 --> 08:29:05,431
Tổng cộng, bây giờ tôi đã sắp xếp\nnửa còn lại của thứ ban đầu.

8811
08:29:07,453 --> 08:29:08,661
Đợi một chút, đợi một chút.

8812
08:29:10,911 --> 08:29:13,580
Tôi đã sắp xếp nửa bên trái của nửa bên trái

8813
08:29:13,580 --> 08:29:16,710
và tôi đã sắp xếp nửa bên phải của nửa bên trái.

8814
08:29:16,710 --> 08:29:19,070
Rốt cuộc bây giờ tôi cần phải làm gì?

8815
08:29:19,070 --> 08:29:21,001
Hợp nhất hai danh sách đó lại với nhau.

8816
08:29:21,001 --> 08:29:22,922
Vì vậy, một lần nữa, tôi đặt\nngón tay của mình vào phần đầu

8817
08:29:22,922 --> 08:29:24,630
của danh sách này,\nphần đầu của danh sách này.

8818
08:29:24,631 --> 08:29:26,721
Và nếu bạn muốn, tôi sẽ làm điều tương tự\nkhi tôi hợp nhất lần trước

8819
08:29:26,721 --> 08:29:28,191
để rõ ràng những gì tôi đang so sánh.

8820
08:29:28,190 --> 08:29:30,800
2 và 4-- rõ ràng là 2 đứng đầu.

8821
08:29:36,030 --> 08:29:40,280
Tiếp theo là số 5 và\ncuối cùng, tất nhiên là số 7.

8822
08:29:40,280 --> 08:29:44,370
Lưu ý rằng 2457 hiện đã được sắp xếp.

8823
08:29:44,370 --> 08:29:47,163
Vì vậy, nửa bên trái ban đầu được sắp xếp.

8824
08:29:47,163 --> 08:29:49,370
Và tôi sẽ làm phần còn lại nhanh hơn một chút\nvì Chúa ơi

8825
08:29:49,370 --> 08:29:50,745
điều này có cảm giác như phải mất mãi mãi.

8826
08:29:50,745 --> 08:29:52,790
Nhưng tôi cá là chúng ta đang đạt được điều gì đó ở đây.

8827
08:29:54,681 --> 08:29:56,931
Tôi vừa sắp xếp nửa bên trái của bản gốc.

8828
08:29:56,931 --> 08:29:58,640
Sắp xếp nửa bên phải của bản gốc.

8829
08:29:59,661 --> 08:30:02,241
Tôi sắp xếp nửa bên trái của nửa bên phải.

8830
08:30:03,411 --> 08:30:05,721
Tôi sắp xếp nửa bên trái của nửa bên trái.

8831
08:30:06,681 --> 08:30:08,721
Tôi sắp xếp nửa bên phải của nửa bên trái.

8832
08:30:09,620 --> 08:30:11,751
Bây giờ tôi hợp nhất cả hai lại với nhau.

8833
08:30:11,751 --> 08:30:14,550
Số 1 đến trước, số 6 đến sau.

8834
08:30:14,550 --> 08:30:18,740
Bây giờ tôi sắp xếp\nnửa bên phải của nửa bên phải.

8835
08:30:25,591 --> 08:30:27,440
Đó là bước thứ ba của giai đoạn đó.

8836
08:30:27,440 --> 08:30:32,120
Bây giờ chúng ta đang ở đâu trong cửa hàng-- ồ\n

8837
08:30:32,120 --> 08:30:36,591
Chúng tôi đã sắp xếp nửa bên trái của nửa bên phải

8838
08:30:36,591 --> 08:30:38,541
và nửa bên phải của nửa bên phải.

8839
08:30:40,623 --> 08:30:42,791
Vì vậy tôi sẽ so sánh,\nvà tôi sẽ di chuyển chúng

8840
08:30:42,791 --> 08:30:44,951
xuống chỉ để làm rõ\nnhững gì tôi đang so sánh

8841
08:30:44,951 --> 08:30:46,661
đầu của cả hai danh sách con.

8842
08:30:57,370 --> 08:30:59,290
Và cuối cùng là thứ 6.

8843
08:30:59,291 --> 08:31:01,241
Được rồi, chúng ta đang ở đâu trong câu chuyện?

8844
08:31:01,241 --> 08:31:03,581
Bây giờ chúng tôi đã sắp xếp\nnửa trái của bản gốc

8845
08:31:03,580 --> 08:31:05,140
và nửa bên phải của bản gốc.

8846
08:31:07,390 --> 08:31:09,431
Được rồi, tôi cũng sẽ đưa ra quan điểm tương tự.

8847
08:31:09,431 --> 08:31:12,050
Và đây thực sự\nlà những gì chúng tôi đã làm trước đó

8848
08:31:12,050 --> 08:31:16,120
bởi vì tôi đã cố tình demo chúng\n

8849
08:31:37,061 --> 08:31:41,121
Và cuối cùng-- đây là lúc\nchúng tôi hết bộ nhớ--

8850
08:31:41,120 --> 08:31:45,370
cái số 7 đằng kia thực sự đã có sẵn.

8851
08:31:47,751 --> 08:31:50,227
OK, phải thừa nhận rằng,\nkhó giải thích hơn một chút

8852
08:31:50,227 --> 08:31:52,310
và thành thật mà nói, nó hơi khó hiểu một chút vì nó

8853
08:31:52,311 --> 08:31:55,341
rất dễ quên\nbạn đang ở đâu trong câu chuyện

8854
08:31:55,341 --> 08:31:58,041
bởi vì chúng tôi liên tục\đi sâu vào thuật toán

8855
08:31:58,041 --> 08:31:59,611
và sau đó lùi lại khỏi nó.

8856
08:31:59,611 --> 08:32:02,331
Nhưng trong mã, chúng ta có thể\ndiễn đạt điều này khá chính xác

8857
08:32:02,330 --> 08:32:05,360
và hóa ra là khá\kém hiệu quả bởi vì những gì

8858
08:32:05,361 --> 08:32:09,021
Tôi đang làm, mặc dù\nnó sẽ lâu hơn khi tôi làm bằng lời nói

8859
08:32:09,021 --> 08:32:12,620
Tôi đã chạm vào những phần tử này rất ít lần, phải không?

8860
08:32:12,620 --> 08:32:15,890
Tôi không đi tới đi lui\n

8861
08:32:16,850 --> 08:32:21,600
Tôi chỉ cố tình hợp nhất\n

8862
08:32:21,600 --> 08:32:24,560
Vì vậy, mỗi lần chúng ta hợp nhất, mặc dù\ntôi đã làm điều đó rất nhanh

8863
08:32:24,561 --> 08:32:28,730
ngón tay của tôi chỉ chạm\nmỗi phần tử một lần.

8864
08:32:28,730 --> 08:32:34,512
Và chúng ta đã chia bao nhiêu lần,\n

8865
08:32:34,512 --> 08:32:36,470
Chà, chúng ta đã bắt đầu với\nang phần tử ở đây

8866
08:32:36,471 --> 08:32:37,679
và có tám người trong số họ.

8867
08:32:37,679 --> 08:32:41,221
Và sau đó chúng tôi di chuyển chúng\n1, 2, 3 vị trí.

8868
08:32:41,221 --> 08:32:47,781
Vậy chiều cao của hình ảnh này,\n

8869
08:32:47,780 --> 08:32:50,640
Nếu tôi bắt đầu với 8, sẽ biến\nnếu bạn làm phép tính

8870
08:32:50,640 --> 08:32:54,740
đây là log n chiều cao\nvì 2 mũ 3 là 8.

8871
08:32:54,741 --> 08:32:57,111
Nhưng hiện tại, chỉ cần tin tưởng\nrằng đây là chiều cao log n.

8872
08:32:58,640 --> 08:33:02,631
Chà, nó có chiều rộng n vì\ncó n phần tử bất cứ lúc nào

8873
08:33:03,830 --> 08:33:08,097
Về mặt kỹ thuật, tôi gần như\n

8874
08:33:08,098 --> 08:33:09,681
đây là lần đầu tiên tôi cần kệ.

8875
08:33:09,681 --> 08:33:13,370
Với các ví dụ của con người, chúng ta vừa có\n

8876
08:33:13,881 --> 08:33:16,561
Ở đây, tôi đang sử dụng\nngày càng nhiều bộ nhớ hơn.

8877
08:33:16,561 --> 08:33:19,131
Trên thực tế, tôi đã sử dụng\nbộ nhớ nhiều gấp bốn lần

8878
08:33:19,131 --> 08:33:21,291
mặc dù đó chỉ là\nvì mục đích hình dung.

8879
08:33:21,291 --> 08:33:25,401
Việc sắp xếp hợp nhất thực sự yêu cầu bạn\n

8880
08:33:25,401 --> 08:33:28,406
để di chuyển các phần tử vào khi\nbạn hợp nhất chúng lại với nhau.

8881
08:33:28,405 --> 08:33:31,280
Nhưng nếu tôi thực sự muốn và nếu tôi\n

8882
08:33:31,280 --> 08:33:33,950
thành thật mà nói, lẽ ra tôi có thể quay lại\n

8883
08:33:33,951 --> 08:33:35,611
Thế là đủ.

8884
08:33:35,611 --> 08:33:40,550
Vì vậy, việc sắp xếp hợp nhất sẽ sử dụng nhiều bộ nhớ hơn\ncho quá trình hợp nhất này

8885
08:33:40,550 --> 08:33:43,460
nhưng ưu điểm của việc\nsử dụng nhiều bộ nhớ hơn là

8886
08:33:43,460 --> 08:33:49,041
tổng thời gian chạy, nếu bạn có thể\n

8887
08:33:49,041 --> 08:33:51,921
Hóa ra là ký hiệu O lớn cho\nsắp xếp hợp nhất

8888
08:33:51,920 --> 08:33:54,890
thực sự sẽ là n lần log n.

8889
08:33:54,890 --> 08:33:57,411
Và ngay cả khi bạn hơi khó tính về logarit của mình

8890
08:33:57,411 --> 08:34:02,751
chúng tôi đã thấy nhiều lần trong tuần thứ 0\n

8891
08:34:05,241 --> 08:34:07,611
Tốc độ đó nhanh hơn tìm kiếm tuyến tính\n, vốn là n.

8892
08:34:07,611 --> 08:34:13,191
Vậy n lần log n tất nhiên là\n

8893
08:34:13,190 --> 08:34:16,190
Vì vậy, nó có vẻ thấp hơn trên con nhỏ này\n

8894
08:34:16,190 --> 08:34:19,710
điều đó cho thấy nó đang chạy\n

8895
08:34:19,710 --> 08:34:22,701
Và trên thực tế, nếu chúng ta xem xét\nthời gian chạy trường hợp tốt nhất

8896
08:34:22,701 --> 08:34:27,006
hóa ra nó không tốt bằng loại bong bóng\nas với omega của n

8897
08:34:27,006 --> 08:34:29,631
nơi bạn có thể hủy bỏ\nnếu bạn nhận ra, hãy đợi một phút

8898
08:34:30,681 --> 08:34:35,210
Sắp xếp hợp nhất, bạn thực sự phải làm điều đó\n

8899
08:34:35,210 --> 08:34:40,530
Vậy thực ra nó có trong omega và\n

8900
08:34:40,530 --> 08:34:42,591
Vì vậy, một lần nữa, hãy đánh đổi\nvì nếu bạn

8901
08:34:42,591 --> 08:34:44,901
tình cờ có một tập dữ liệu\nthường được sắp xếp

8902
08:34:44,901 --> 08:34:47,026
Thành thật mà nói, bạn có thể muốn\ntiếp tục sử dụng tính năng sắp xếp bong bóng.

8903
08:34:47,026 --> 08:34:49,851
Nhưng trong trường hợp chung,\nnơi dữ liệu chưa được sắp xếp

8904
08:34:49,850 --> 08:34:53,181
n log n nghe có vẻ\ntốt hơn n bình phương.

8905
08:34:53,181 --> 08:34:55,190
Chà, thực tế thì nó trông như thế nào hoặc có cảm giác như thế nào?

8906
08:34:55,190 --> 08:34:58,591
Hãy cho tôi một chút thời gian để thay đổi\nover hình ảnh của chúng ta ở đây.

8907
08:34:58,591 --> 08:35:02,570
Và chúng ta sẽ xem trong ví dụ này\nsắp xếp hợp nhất trông như thế nào

8908
08:35:02,570 --> 08:35:04,530
được mô tả bằng các thanh dọc này.

8909
08:35:04,530 --> 08:35:07,220
Vì vậy, cùng một thuật toán, nhưng thay vào đó\nnhững con số của tôi trên kệ

8910
08:35:07,221 --> 08:35:12,331
đây là một mảng\số ngẫu nhiên đang được sắp xếp.

8911
08:35:12,330 --> 08:35:14,480
Và bạn có thể thấy nó\nđược thực hiện một nửa mỗi lần.

8912
08:35:14,480 --> 08:35:18,080
Và bạn sẽ thấy phần còn lại\ncủa các thanh trước đó.

8913
08:35:21,861 --> 08:35:26,390
Hãy để tôi thu nhỏ để bạn có thể thấy được chiều cao ở đây.

8914
08:35:26,390 --> 08:35:29,091
Hãy để tôi tiếp tục chọn ngẫu nhiên\ncái này một lần nữa và chạy sắp xếp hợp nhất.

8915
08:35:29,670 --> 08:35:34,460
Bây giờ bạn có thể thấy mảng thứ hai và\n

8916
08:35:34,460 --> 08:35:38,490
Và mặc dù cái này trông có vẻ xa lạ\n

8917
08:35:38,491 --> 08:35:40,531
nó dường như đang di chuyển nhanh hơn.

8918
08:35:40,530 --> 08:35:44,030
Và có vẻ như nó đang hợp nhất các nửa\nvới nhau, và bùm, thế là xong.

8919
08:35:44,030 --> 08:35:48,350
Vì vậy, hãy thực sự xem xét, để kết luận,\n

8920
08:35:48,350 --> 08:35:51,440
và hãy cân nhắc rằng trong tương lai\na chúng ta sẽ viết ngày càng nhiều mã hơn

8921
08:35:51,440 --> 08:35:54,710
mục tiêu, một lần nữa, không chỉ là\n

8922
08:35:54,710 --> 08:35:58,181
Và một thước đo của thiết kế thực sự sẽ là tính hiệu quả.

8923
08:35:58,181 --> 08:36:02,480
Vì vậy, cuối cùng, ở đây chúng ta có\nhình ảnh hóa của ba thuật toán--

8924
08:36:02,480 --> 08:36:05,361
sắp xếp lựa chọn, sắp xếp nổi\nvà sắp xếp hợp nhất--

8925
08:36:06,811 --> 08:36:09,980
Và hãy xem những thuật toán này là gì\n

8926
08:36:09,980 --> 08:36:12,216
Ồ, nếu chúng ta có thể làm mờ\nánh sáng để tạo hiệu ứng ấn tượng--

8927
08:36:16,521 --> 08:36:20,331
vùng chọn ở trên cùng, bong bóng ở\ndưới cùng, hợp nhất ở giữa.

8928
08:39:13,991 --> 08:39:18,011
DAVID J. Malan: Ồ, đây là CS50,\n

8929
08:39:18,011 --> 08:39:19,991
và nhớ lại rằng\ntuần trước, tuần thứ ba, chúng tôi

8930
08:39:19,991 --> 08:39:22,931
bắt đầu khám phá bên trong bộ nhớ của máy tính thêm một chút.

8931
08:39:22,932 --> 08:39:25,992
Chúng ta đã nói về mảng,\nchỉ là những khối bộ nhớ

8932
08:39:25,991 --> 08:39:28,811
quay lại quay lại thực sự đó\n

8933
08:39:28,812 --> 08:39:32,082
xuống dưới cùng và đây thực sự là một\n

8934
08:39:32,081 --> 08:39:34,121
mới làm quen với lập trình\nvà chắc chắn là mới đối với C.

8935
08:39:34,121 --> 08:39:39,131
Bạn đã thấy cách tiếp cận này chỉ bằng cách sử dụng\n

8936
08:39:40,522 --> 08:39:45,731
Ví dụ: đây là một bức ảnh được chụp\n

8937
08:39:45,731 --> 08:39:49,151
và đây là cơ hội để\khám phá chính xác điều gì sẽ xảy ra

8938
08:39:49,151 --> 08:39:52,271
nếu chúng ta bắt đầu phóng to và phóng to và\n

8939
08:39:52,272 --> 08:39:56,022
bất kỳ chương trình truyền hình nào như CSI hoặc\nbất kỳ chương trình nào hoặc bất kỳ bộ phim nào

8940
08:39:56,022 --> 08:40:01,961
khám phá thông tin pháp y có thể\n

8941
08:40:01,961 --> 08:40:05,354
trên một hình ảnh như thế này để xem\nánh mắt của ai đó lóe lên như thế nào

8942
08:40:05,354 --> 08:40:08,022
là bởi vì điều đó tiết lộ biển số\nbằng lái của một người nào đó

8943
08:40:08,917 --> 08:40:10,792
Có điều gì đó hơi\nhơn đỉnh ở đó

8944
08:40:10,792 --> 08:40:14,022
nhưng ở đây có một cơ hội để\n

8945
08:40:14,022 --> 08:40:17,022
Ví dụ: hãy phóng to\ncon mắt của con rối này và hãy

8946
08:40:17,022 --> 08:40:19,332
phóng to hơn một chút để\nxem những gì có thể được phản ánh.

8947
08:40:19,331 --> 08:40:21,941
Hãy phóng to thêm một chút\nvà thế là xong.

8948
08:40:21,941 --> 08:40:24,412
Chỉ có một lượng thông tin hữu hạn

8949
08:40:24,412 --> 08:40:26,531
nếu bạn có một hình ảnh\nđược thể hiện theo cách này.

8950
08:40:26,531 --> 08:40:29,682
Chúng tôi đang sử dụng pixel-- những dấu chấm này trên\n

8951
08:40:29,682 --> 08:40:32,141
bởi vì nếu bạn chỉ sử dụng\na lượng bộ nhớ hữu hạn

8952
08:40:32,141 --> 08:40:35,472
thì đến cuối ngày, bạn chỉ có thể\n

8953
08:40:35,472 --> 08:40:39,282
Ít nhất tôi không thực sự thấy điều này\n

8954
08:40:39,281 --> 08:40:42,011
hoặc điều gì đó tương tự như vậy bạn\n

8955
08:40:42,011 --> 08:40:45,041
Vì vậy, hôm nay chúng ta sẽ khám phá những\nloại biểu diễn này

8956
08:40:45,042 --> 08:40:47,862
về cách bạn có thể sử dụng trí nhớ\theo những cách mới và thú vị

8957
08:40:47,862 --> 08:40:51,222
để đại diện cho những điều rất\nquen thuộc, nhưng cũng

8958
08:40:51,222 --> 08:40:54,432
bắt đầu khám phá một số\n

8959
08:40:54,432 --> 08:40:58,211
Nhưng xét cho cùng thì điều này không phải vậy\n

8960
08:40:58,211 --> 08:41:00,522
nhiều pixel như một thứ gì đó\nnhư hình ảnh khác này

8961
08:41:00,522 --> 08:41:04,492
bạn có thể tưởng tượng mình đang làm gì đó\n

8962
08:41:04,491 --> 08:41:07,181
Và nếu bạn nghĩ một hình ảnh\nchỉ có hàng và cột

8963
08:41:07,182 --> 08:41:09,492
những hàng này được biết đến theo cách khác là các dòng quét\nas-- thứ gì đó

8964
08:41:09,491 --> 08:41:13,061
chúng ta sẽ khám phá vào tuần tới--\n

8965
08:41:13,062 --> 08:41:17,472
chỉ bằng cách sử dụng hai giá trị\n khác nhau, có thể là số 0 và một.

8966
08:41:17,472 --> 08:41:21,502
Hoặc màu vàng và màu tím, hoặc ngược lại,\n

8967
08:41:21,502 --> 08:41:25,691
Bây giờ, trong thực tế, hãy nhớ lại chúng ta đã nói chuyện\n

8968
08:41:25,691 --> 08:41:32,774
nhưng có thể là giá trị R, G và B--\n

8969
08:41:32,775 --> 08:41:33,942
nhưng chúng ta sẽ quay lại vấn đề đó.

8970
08:41:33,941 --> 08:41:35,649
Đó sẽ chỉ là một\nhình ảnh phức tạp hơn.

8971
08:41:35,650 --> 08:41:41,472
Nhưng để giải trí, nếu hôm nay bạn muốn giải quyết\n

8972
08:41:41,472 --> 08:41:44,891
nếu bạn truy cập URL này tại đây,\nchúng tôi đã tạo ra một cơ hội

8973
08:41:47,562 --> 08:41:51,162
Nếu bạn truy cập URL này tại đây, thì đó\n

8974
08:41:51,162 --> 08:41:53,502
Nếu hôm nay bạn mang theo máy tính xách tay\nthì điều đó sẽ

8975
08:41:53,502 --> 08:41:56,902
trông hơi giống thế này,\n

8976
08:41:56,901 --> 08:42:01,241
Vì vậy, nếu bạn muốn tiếp tục và sử dụng\n

8977
08:42:01,241 --> 08:42:04,691
tính năng tô màu trong\riêng các ô vuông đó nếu bạn muốn

8978
08:42:04,691 --> 08:42:08,111
xem liệu bạn có thể làm được điều gì đó một chút không\n

8979
08:42:08,112 --> 08:42:12,202
và chúng tôi sẽ trưng bày một số thứ tốt nhất hoặc\n

8980
08:42:12,202 --> 08:42:15,425
Vậy hãy chuyển sang thứ gì đó\n

8981
08:42:15,424 --> 08:42:17,592
Và có lẽ không phải tất cả các bạn đều đã\nsử dụng Photoshop

8982
08:42:17,592 --> 08:42:20,842
nhưng nhìn chung có lẽ bạn đã quen thuộc\n

8983
08:42:20,842 --> 08:42:23,062
và tạo hình ảnh\cũng như ảnh hoặc những thứ tương tự.

8984
08:42:23,062 --> 08:42:25,992
Và đây là ảnh chụp màn hình\ncủa bộ chọn màu của p

8985
08:42:25,991 --> 08:42:27,978
qua đó bạn có thể\nthay đổi màu sắc của mình

8986
08:42:27,978 --> 08:42:30,311
sẽ vẽ bằng sơn\ncọ hoặc bạn sẽ vẽ màu gì

8987
08:42:30,312 --> 08:42:32,292
sẽ đổ đầy thùng sơn.

8988
08:42:32,292 --> 08:42:34,391
Nó đại diện cho bất kỳ\nloại công cụ đồ họa nào.

8989
08:42:34,391 --> 08:42:36,801
Và có rất nhiều\nthông tin ở đây

8990
08:42:36,801 --> 08:42:39,281
nhưng có lẽ bây giờ có một số\nthuật ngữ quen thuộc--

8991
08:42:39,281 --> 08:42:43,151
R, G và B. Thực ra,\nbây giờ đây là cách của Photoshop

8992
08:42:43,151 --> 08:42:45,851
nói rằng bạn sắp lấp đầy\nền sau hoặc tiền cảnh của mình

8993
08:42:45,851 --> 08:42:48,041
với màu đen,\nand có vẻ như

8994
08:42:48,042 --> 08:42:51,492
được biểu thị bằng giá trị R, G và\na B bằng 0, 0, 0.

8995
08:42:51,491 --> 08:42:57,341
Hoặc cách khác, sử dụng ký hiệu\nhash và sau đó là 000000.

8996
08:42:57,342 --> 08:42:59,801
Và nếu một số bạn đã từng tạo trang web trước đây

8997
08:42:59,801 --> 08:43:01,691
và bạn biết một chút\nvề HTML và CSS

8998
08:43:01,691 --> 08:43:04,031
có lẽ bạn đã quen\nvới kiểu cú pháp này--

8999
08:43:04,031 --> 08:43:07,891
một ký hiệu băm và sau đó là sáu, hoặc\n

9000
08:43:07,891 --> 08:43:10,391
Và nếu chúng ta xem xét một vài\nmàu sắc khác nhau ở đây chẳng hạn

9001
08:43:10,391 --> 08:43:12,491
đây có thể là sự thể hiện của màu trắng.

9002
08:43:12,491 --> 08:43:18,671
Bây giờ các giá trị R, G và B\n

9003
08:43:18,671 --> 08:43:23,471
Hoặc cách khác, có vẻ như\n

9004
08:43:23,472 --> 08:43:26,950
có thể biểu diễn cùng\nmàu trắng đó với FFFFFF.

9005
08:43:26,950 --> 08:43:28,242
Và chúng ta hãy làm một vài điều khác.

9006
08:43:28,241 --> 08:43:32,981
Đây là màu đỏ, hóa ra là thế\n

9007
08:43:37,909 --> 08:43:39,702
Vì vậy có lẽ có một\nmô hình đang nổi lên ở đây.

9008
08:43:39,702 --> 08:43:43,782
Đây là màu xanh lá cây, số 0, 255, số 0, hay còn gọi là.

9009
08:43:43,781 --> 08:43:48,022
00FF00, hoặc cuối cùng, ở đây\nmàu xanh lam, không có màu đỏ

9010
08:43:48,022 --> 08:43:51,731
không có màu xanh lá cây nhưng dường như có rất nhiều\nmàu xanh lam, lại là 255, hay còn gọi là.

9011
08:43:53,831 --> 08:43:57,221
Một lần nữa, một số bạn có thể\nđã thấy ký hiệu này trước đây

9012
08:43:57,222 --> 08:44:00,432
những số không và những chữ F này và tất cả\n

9013
08:44:00,432 --> 08:44:02,205
nhưng đây là một dạng ký hiệu khác.

9014
08:44:02,205 --> 08:44:04,122
Và trên thực tế, hôm nay chúng ta sẽ khám phá\nđiều này-- thực sự

9015
08:44:04,121 --> 08:44:06,851
chỉ là điều kiện tiên quyết để\nnói về một số khái niệm khác.

9016
08:44:06,851 --> 08:44:10,002
Nhưng xét cho cùng, những ý tưởng\na thực sự không khác nhau.

9017
08:44:10,002 --> 08:44:13,182
Những gì chúng ta sắp thấy là\na hệ thống cơ sở khác--

9018
08:44:13,182 --> 08:44:15,312
không chỉ nhị phân, không chỉ\nthập phân, mà còn một cái gì đó

9019
08:44:15,312 --> 08:44:17,231
chúng ta sắp gọi hệ thập lục phân.

9020
08:44:17,231 --> 08:44:21,191
Nhưng trước tiên, hãy nhớ lại rằng với RGB\ntrước đây chúng tôi đã làm như sau.

9021
08:44:21,191 --> 08:44:23,592
Bất kỳ giá trị RGB nào-- đỏ,\nxanh lục, xanh lam-- chỉ cần kết hợp

9022
08:44:23,592 --> 08:44:26,121
một số lượng màu đỏ hoặc xanh lá cây hoặc xanh lam.

9023
08:44:26,121 --> 08:44:30,702
Vì vậy, ở đây chúng ta có 72, 73, 33, trong\n

9024
08:44:33,761 --> 08:44:36,252
Chỉ xin chào bằng dấu chấm than\nnhưng trong ngữ cảnh

9025
08:44:36,252 --> 08:44:40,481
của một chương trình giống như Photoshop,\nthay vào đó nó có thể đại diện cho

9026
08:44:40,481 --> 08:44:42,919
gọi chung là màu\nmàu vàng này chẳng hạn

9027
08:44:42,919 --> 08:44:45,502
khi bạn kết hợp nhiều màu đỏ\nnhiều màu xanh lá cây với nhiều màu xanh lam.

9028
08:44:46,812 --> 08:44:49,062
Nếu bạn có nhiều\nđỏ, không xanh lá cây, không xanh dương

9029
08:44:49,062 --> 08:44:50,652
cùng nhau điều đó sẽ cho chúng ta màu đỏ.

9030
08:44:50,651 --> 08:44:53,441
Nếu bạn không có màu đỏ,\nnhiều màu xanh lá cây, không có màu xanh lam

9031
08:44:53,441 --> 08:44:55,211
tất nhiên điều đó sẽ mang lại cho\nus màu xanh lá cây.

9032
08:44:55,211 --> 08:44:58,529
Tất nhiên là nếu bạn không có màu đỏ, không có màu xanh lá cây,\rất nhiều màu xanh lam

9033
08:44:59,572 --> 08:45:03,761
Vậy là có một mô hình đang nổi lên ở đây\n

9034
08:45:05,952 --> 08:45:12,641
Và bằng cách nào đó nó có thể tương đương với 255,\n

9035
08:45:12,641 --> 08:45:15,912
Trong khi đó, nếu chúng ta kết hợp cái cuối cùng\n

9036
08:45:16,991 --> 08:45:20,719
điều đó thực sự sẽ mang lại cho chúng ta\na một pixel màu trắng như thế này.

9037
08:45:21,761 --> 08:45:25,479
Đây là hệ nhị phân-- trong thế giới nhị phân\n

9038
08:45:25,479 --> 08:45:26,772
Có thể là bất cứ điều gì khác--

9039
08:45:26,772 --> 08:45:31,902
A hoặc B, X hoặc Y, nhưng thế giới\nchuẩn hóa những con số này

9040
08:45:32,741 --> 08:45:35,951
Trong hệ thập phân của thế giới chúng ta, của\n

9041
08:45:35,952 --> 08:45:39,461
Tuy nhiên, kể từ hôm nay, chúng ta sẽ\n

9042
08:45:39,461 --> 08:45:43,346
trong bối cảnh của hình ảnh và cả\n

9043
08:45:43,347 --> 08:45:45,195
và có một số tiện ích cho nó.

9044
08:45:45,194 --> 08:45:47,112
Bây giờ bạn đang đi đâu\nđể có thể đếm được

9045
08:45:47,112 --> 08:45:49,961
đến F trong ký hiệu gọi là thập lục phân.

9046
08:45:49,961 --> 08:45:55,031
Từ 0 đến 9 thì bạn giữ\n

9047
08:45:55,031 --> 08:45:58,002
ý tưởng là từng thứ như thế,\mặc dù nó thật kỳ lạ

9048
08:45:58,002 --> 08:46:02,141
một chữ cái trong bảng chữ cái tiếng Anh,\n

9049
08:46:02,141 --> 08:46:07,601
Nó không phải là một số 0 cho 10 hay 1 1\n

9050
08:46:07,601 --> 08:46:10,961
những chữ số này, có thể nói,\thực ra vẫn chỉ là những ký hiệu đơn lẻ

9051
08:46:10,961 --> 08:46:14,572
và đó là đặc điểm của\n

9052
08:46:14,572 --> 08:46:20,112
Vậy làm cách nào để chúng ta chuyển từ 00 và FF sang\n

9053
08:46:20,112 --> 08:46:22,121
Chà, hệ thập lục phân này, hay còn gọi là.

9054
08:46:22,121 --> 08:46:25,546
Cơ số 16, chỉ cần làm phép tính\ntừ tuần 0 và thực sự

9055
08:46:25,546 --> 08:46:27,171
trường lớp, hơi khác một chút.

9056
08:46:27,171 --> 08:46:30,341
Ví dụ: nếu bạn có một\nsố có hai chữ số

9057
08:46:30,342 --> 08:46:34,281
hoặc chữ số thập lục phân kể từ hôm nay,\n

9058
08:46:34,281 --> 08:46:37,871
Thay vì lũy thừa của hai hoặc lũy thừa của\n

9059
08:46:37,871 --> 08:46:40,631
tương ứng, đó là lũy thừa của 16.

9060
08:46:40,632 --> 08:46:43,362
Vậy nếu chúng ta chỉ làm phép tính\nout thì đó là cột đơn vị

9061
08:46:43,362 --> 08:46:46,092
đây là cột của thập niên 16, v.v.

9062
08:46:46,092 --> 08:46:49,101
Mọi thứ thực sự trở nên khá lớn\nkhá nhanh trong hệ thống này.

9063
08:46:49,101 --> 08:46:52,106
Nhưng bây giờ chúng ta hãy xem xét cách chúng ta\n

9064
08:46:52,106 --> 08:46:54,731
Nếu bạn có hai chữ số\nthập lục phân mà các giá trị băm này được dùng

9065
08:46:54,731 --> 08:46:57,792
chỉ là phần giữ chỗ, số không, số không\nis sẽ chuyển sang dạng toán học

9066
08:46:57,792 --> 08:47:00,292
tất nhiên bằng số thập phân mà bạn\nvà tôi biết, bằng 0.

9067
08:47:02,081 --> 08:47:06,401
16 nhân 0 cộng một nhân 0 là\n

9068
08:47:06,401 --> 08:47:07,881
Và chúng ta có thể đếm từ đây.

9069
08:47:07,882 --> 08:47:10,391
Đây, theo hệ thập lục phân,\nsẽ là cách một máy tính

9070
08:47:10,391 --> 08:47:12,191
đại diện cho số chúng ta biết là một.

9071
08:47:12,191 --> 08:47:14,182
Nó sẽ là số 0 trong trường hợp này.

9072
08:47:14,182 --> 08:47:19,542
Đây sẽ là hai, ba, bốn,\nnăm, sáu, bảy, tám, chín--

9073
08:47:19,542 --> 08:47:21,502
ở dạng thập phân, chúng ta sắp tiến tới 10.

9074
08:47:21,502 --> 08:47:24,572
Nhưng trong hệ thập lục phân,\nrõ ràng, điều gì sẽ xảy ra tiếp theo?

9075
08:47:24,572 --> 08:47:33,382
Vì vậy, rõ ràng là A, vậy 0A, 0B, mà\n

9076
08:47:33,382 --> 08:47:36,472
Vì vậy, sử dụng hệ thập lục phân\nthật là một cách thú vị

9077
08:47:36,472 --> 08:47:40,312
sử dụng các ký hiệu đơn\nbây giờ, từ 0 đến F

9078
08:47:40,312 --> 08:47:43,262
đếm từ 0 đến 15.

9079
08:47:43,261 --> 08:47:46,011
Và chúng ta sẽ xem tại sao lại là 15 trong một\n

9080
08:47:46,011 --> 08:47:50,181
có ai muốn phỏng đoán\nin thập lục phân, hay còn gọi là hex,

9081
08:47:50,182 --> 08:47:53,092
bây giờ chúng ta có tính lên một vị trí cao hơn không?

9082
08:47:53,092 --> 08:47:56,792
Điều gì xảy ra sau 0F trong hệ thập lục phân?

9083
08:47:56,792 --> 08:47:59,062
Vì vậy, một không-- đó\ngiống như vậy--

9084
08:47:59,062 --> 08:48:01,227
khi bạn đạt\nchữ số cao nhất có thể, F--

9085
08:48:01,226 --> 08:48:03,351
hoặc trong thế giới thập phân của chúng ta\nthì đó sẽ là chín--

9086
08:48:03,351 --> 08:48:06,471
bạn thêm một cái nữa, chín kết thúc\ngần bằng 0, hoặc trong trường hợp này

9087
08:48:08,182 --> 08:48:11,152
Bạn mang theo một cái và thì đấy--\nbây giờ chúng tôi đang đại diện

9088
08:48:11,151 --> 08:48:12,871
số mà bạn và tôi biết là 16.

9089
08:48:12,871 --> 08:48:14,811
Và chúng ta có thể tiếp tục\nmãi mãi, theo đúng nghĩa đen.

9090
08:48:14,812 --> 08:48:18,547
Đây có thể là 17, 18,\n19, 20 và số thập phân--

9091
08:48:18,546 --> 08:48:20,421
nhưng chúng ta hãy vẫy tay với nó và đếm

9092
08:48:20,421 --> 08:48:23,181
cao nhất có thể-- dot,\ndot, dot-- cao nhất

9093
08:48:23,182 --> 08:48:26,542
chúng ta có thể đếm theo hệ thập lục phân\nvới hai chữ số, một cách hợp lý

9094
08:48:26,542 --> 08:48:28,342
sẽ là gì, theo hệ thập lục phân?

9095
08:48:31,312 --> 08:48:34,892
Đúng vậy, đó là chữ số lớn nhất\n

9096
08:48:34,891 --> 08:48:38,524
Vậy bạn có thể đếm được bao nhiêu trong hệ thập lục phân\n

9097
08:48:38,524 --> 08:48:39,981
Vâng, đó vẫn là phép toán như mọi khi.

9098
08:48:41,932 --> 08:48:48,301
15, vậy đó là 16 nhân 15 cộng\n nhân F, hoặc một nhân 15--

9099
08:48:48,301 --> 08:48:52,702
nó cho ta 240 cộng 15 ở dạng thập phân,\n

9100
08:48:54,781 --> 08:48:57,871
Vậy hệ thập lục phân này-- bạn có thể\n

9101
08:48:57,871 --> 08:49:00,621
và nếu bạn chưa, chúng ta sẽ đến\n

9102
08:49:00,621 --> 08:49:03,351
hoặc chúng ta vừa thấy trong\nngữ cảnh của Photoshop-- chỉ

9103
08:49:03,351 --> 08:49:09,502
có ký hiệu viết tắt của việc đếm\n

9104
08:49:09,502 --> 08:49:13,132
Bây giờ nó ở mức cận biên, nhưng giống như vậy\n

9105
08:49:13,132 --> 08:49:16,852
bạn cần để được tính là cao\n

9106
08:49:18,682 --> 08:49:22,492
Trong hệ thập lục phân, bạn có thể đếm\nas cao chỉ bằng hai

9107
08:49:22,491 --> 08:49:25,849
và sự khác biệt đó sẽ nhận được\n

9108
08:49:25,849 --> 08:49:28,641
Hãy để tôi quy định bây giờ, bạn\n

9109
08:49:28,641 --> 08:49:31,792
xét về số lượng ký hiệu\n

9110
08:49:31,792 --> 08:49:35,242
những con số ngày càng lớn hơn thế.

9111
08:49:35,241 --> 08:49:38,661
Được rồi, hãy để tôi tạm dừng ở đây chỉ để\n

9112
08:49:38,662 --> 08:49:42,081
dựa trên cái mà chúng tôi gọi là hệ thập lục phân,\n

9113
08:49:42,081 --> 08:49:48,769
cũng như từ A đến F.\nBạn có câu hỏi hoặc nhầm lẫn nào không?

9114
08:49:48,769 --> 08:49:51,351
Và nếu có vẻ như chúng ta đang\nnán lại một chút về số học

9115
08:49:51,351 --> 08:49:54,691
chúng ta sẽ không thực sự gặp người khác\n

9116
08:49:54,691 --> 08:49:58,822
Thông thường, đây là ba điều cần thiết trong thế giới của một\nlập trình viên.

9117
08:50:01,600 --> 08:50:03,893
ĐỐI TƯỢNG: Ký hiệu\nthập lục phân có chiếm nhiều dung lượng hơn không

9118
08:50:06,612 --> 08:50:07,862
DAVID J. Malan: Câu hỏi hay.

9119
08:50:07,862 --> 08:50:11,972
Hệ thập lục phân có cần nhiều bộ nhớ hơn không\n

9120
08:50:11,972 --> 08:50:16,202
Về mặt lý thuyết là không, vì đây là\n

9121
08:50:16,202 --> 08:50:19,082
và lát nữa chúng ta sẽ thấy một\nví dụ cụ thể.

9122
08:50:19,081 --> 08:50:22,471
Nhưng bên trong máy tính, ở cuối\n

9123
08:50:22,472 --> 08:50:25,588
Và việc sử dụng hệ thập lục phân không phải là\nsử dụng nhiều hay ít bit

9124
08:50:25,588 --> 08:50:27,421
hãy nghĩ về điều này như cách\nbạn có thể viết nó ra

9125
08:50:27,421 --> 08:50:30,331
trên một tờ giấy, bạn sẽ viết bao nhiêu\nchữ số

9126
08:50:30,331 --> 08:50:33,301
hoặc trên màn hình máy tính, có bao nhiêu\n

9127
08:50:33,301 --> 08:50:36,572
nhưng nó không thay đổi cách\n

9128
08:50:36,572 --> 08:50:39,691
bởi vì tất cả những gì họ đang đại diện tại\n

9129
08:50:40,981 --> 08:50:45,211
Nếu cái này-- một lúc trước\nFF tôi đã xác nhận là 255--

9130
08:50:45,211 --> 08:50:47,252
hãy tua lại về tuần\n0 và nếu chúng ta muốn

9131
08:50:47,252 --> 08:50:51,752
đếm đến 255 ở dạng nhị phân, đó là\n

9132
08:50:52,772 --> 08:50:54,604
Và chỉ có một vài\ncon số này

9133
08:50:54,604 --> 08:50:58,441
rất hữu ích để ghi nhớ, chẳng hạn như 255 là\n

9134
08:50:58,441 --> 08:51:02,342
nếu bạn bắt đầu từ số 0, bởi vì hai đến\n

9135
08:51:04,831 --> 08:51:09,031
Vì vậy, ở dạng nhị phân, hãy nhớ lại nếu bạn có\n

9136
08:51:09,031 --> 08:51:11,351
và tôi sẽ không làm\ntoán học một cách khoa trương ở đây

9137
08:51:11,351 --> 08:51:13,726
nhưng nếu tôi làm cái này cộng\ncái này cộng cái này, chấm, chấm

9138
08:51:13,726 --> 08:51:16,752
dấu chấm-- điều đó cũng sẽ cho tôi 255.

9139
08:51:16,752 --> 08:51:19,801
Đây chính là điều thú vị\nở đây về hệ thập lục phân.

9140
08:51:19,801 --> 08:51:24,211
Hóa ra ưu điểm của việc\nlưu trữ các giá trị ở dạng thập lục phân

9141
08:51:24,211 --> 08:51:27,932
là chúng ta sẽ\nthấy chữ F đầu tiên tượng trưng

9142
08:51:27,932 --> 08:51:31,262
nửa bên trái của tất cả các bit này,\nvà F thứ hai trong trường hợp này

9143
08:51:31,261 --> 08:51:33,791
đại diện cho bốn bit ngoài cùng bên phải trong số các bit này.

9144
08:51:33,792 --> 08:51:36,422
Vì vậy, hóa ra hệ thập lục phân\nis rất hữu ích khi bạn

9145
08:51:36,421 --> 08:51:39,391
muốn xử lý dữ liệu theo đơn vị bốn.

9146
08:51:39,391 --> 08:51:42,542
Nó không hẳn là tám, mà là đơn vị của bốn, và điều đó không tệ.

9147
08:51:42,542 --> 08:51:45,632
Đó là lý do-- nếu bạn sử dụng hai\nchữ số như tôi đã sử dụng cho đến nay

9148
08:51:45,632 --> 08:51:48,422
00 hoặc FF hoặc bất cứ thứ gì ở giữa--

9149
08:51:48,421 --> 08:51:53,281
đó thực sự là một cách thuận tiện\n

9150
08:51:53,281 --> 08:51:57,451
Một chữ số thập lục phân cho bốn chữ số đầu tiên\n

9151
08:51:57,452 --> 08:52:00,152
Và một lần nữa, không có gì mới\về mặt trí tuệ ở đây cả

9152
08:52:00,151 --> 08:52:03,931
đó chỉ là một cách khác\n

9153
08:52:05,011 --> 08:52:06,851
Vậy chúng ta thấy điều này trong bối cảnh nào?

9154
08:52:06,851 --> 08:52:08,191
Ồ, tuần trước chúng ta đã nói về\nbộ nhớ và chúng ta

9155
08:52:08,191 --> 08:52:09,774
sẽ nói nhiều hơn về nó trong tuần này.

9156
08:52:09,775 --> 08:52:12,301
Nếu đây là\nRAM-- bộ nhớ truy cập ngẫu nhiên của máy tính của tôi--

9157
08:52:12,301 --> 08:52:16,471
bạn có thể lại coi mỗi byte là\n

9158
08:52:18,031 --> 08:52:22,351
Số này có thể bằng 0, số này có thể\nlà 2 tỷ, v.v. trong quá khứ

9159
08:52:22,351 --> 08:52:25,141
Tôi đã mô tả những điều này chỉ như\nnày, sử dụng số thập phân.

9160
08:52:25,141 --> 08:52:29,491
Đây là byte 0, một, hai, ba,\n

9161
08:52:29,491 --> 08:52:30,941
sẽ ở đây, vân vân.

9162
08:52:30,941 --> 08:52:35,432
Nhưng hóa ra trong thế giới ký ức,\n

9163
08:52:35,432 --> 08:52:40,051
có xu hướng đếm bộ nhớ\nbyte bằng hệ thập lục phân.

9164
08:52:40,051 --> 08:52:42,241
Một phần chỉ theo quy ước,\nnhưng cũng một phần

9165
08:52:42,241 --> 08:52:44,941
vì nó ngắn gọn hơn một chút và lặp lại, mỗi chữ số

9166
08:52:44,941 --> 08:52:48,002
thông thường đại diện cho bốn bit.

9167
08:52:48,002 --> 08:52:49,757
Vậy sau F ở đây là gì?

9168
08:52:49,757 --> 08:52:51,632
Chà, nếu tôi nghĩ về\nbộ nhớ của máy tính

9169
08:52:51,632 --> 08:52:56,672
Tôi thường có thể làm\nsau F, tức là 15, 16.

9170
08:52:56,671 --> 08:53:01,291
Nhưng thay vào đó, một không, một\không, một hai, một ba-- cái này

9171
08:53:01,292 --> 08:53:05,912
không phải là 10, 11, 12, 13, vì tôi khẳng định\n

9172
08:53:05,912 --> 08:53:07,981
Theo\ntrang trình bày trước đó, chúng tôi đã bắt đầu

9173
08:53:07,981 --> 08:53:10,801
đi từ A qua\nF nên bạn ngay lập tức

9174
08:53:10,801 --> 08:53:13,471
xem ở đây một vấn đề có thể xảy ra.

9175
08:53:13,472 --> 08:53:16,442
Tại sao bây giờ điều này lại đáng lo ngại,\nnếu đột nhiên bạn

9176
08:53:16,441 --> 08:53:22,151
nhìn thấy những con số\ncó vẻ quen thuộc như 10, 11, 12, 13?

9177
08:53:22,151 --> 08:53:24,288
Chúng tôi thực sự không gặp phải vấn đề này

9178
08:53:24,289 --> 08:53:25,871
khi tất cả đều là số không và số một trước đó.

9179
08:53:26,974 --> 08:53:28,516
ĐỐI TƯỢNG: Cố gắng làm toán [KHÔNG NGHE ĐƯỢC].

9180
08:53:30,645 --> 08:53:33,312
DAVID J. Malan: Vâng, vậy nếu bạn\nđang viết mã nào đó bằng C thì đó là

9181
08:53:33,312 --> 08:53:35,170
đang làm một số phép tính, bạn\ncó thể vô tình--

9182
08:53:35,169 --> 08:53:37,961
hoặc máy tính có thể vô tình\n

9183
08:53:37,961 --> 08:53:40,522
nếu họ nhìn trong một số bối cảnh giống nhau.

9184
08:53:40,522 --> 08:53:42,612
Bất kỳ số nào trên bảng\nkhông có chữ cái

9185
08:53:42,612 --> 08:53:46,402
ở thời điểm này là thập lục phân\cũng không phải thập phân một cách mơ hồ

9186
08:53:46,401 --> 08:53:48,111
và vậy chúng ta có thể giải quyết vấn đề này như thế nào?

9187
08:53:48,112 --> 08:53:51,072
Chà, hóa ra những gì\nmáy tính thường làm là thế này.

9188
08:53:51,072 --> 08:53:55,842
Theo quy ước, bất cứ khi nào bạn\nthấy 0x và sau đó là một số

9189
08:53:55,842 --> 08:53:58,272
đó là quy ước của con người khi nói--

9190
08:53:58,272 --> 08:54:01,731
báo hiệu cho người đọc rằng điều này\n

9191
08:54:01,731 --> 08:54:05,801
Vậy nếu là 0x10 thì đó\không phải là số 10

9192
08:54:05,801 --> 08:54:10,971
đó là số thập lục phân\n

9193
08:54:13,991 --> 08:54:16,511
Và một lần nữa, đây không phải là những thứ cần ghi nhớ

9194
08:54:16,511 --> 08:54:19,921
nó thực sự chỉ là hệ thống dành cho\n

9195
08:54:19,921 --> 08:54:22,421
Vì vậy, kể từ hôm nay, chúng ta sẽ\nbắt đầu xem hệ thập lục phân

9196
08:54:23,831 --> 08:54:26,861
Khi bạn viết mã, bạn thậm chí có thể\n

9197
08:54:26,862 --> 08:54:29,362
nhưng một lần nữa, đó chỉ là một\ncách biểu diễn số khác

9198
08:54:29,362 --> 08:54:32,621
và con người có những quy ước\nkhác nhau cho những bối cảnh khác nhau.

9199
08:54:32,621 --> 08:54:36,131
Được rồi, như đã nói, bất kỳ\n

9200
08:54:36,132 --> 08:54:41,682
Nhưng từ đây trở đi, chúng ta sẽ bắt đầu\nsử dụng nó trong một số mã thực tế.

9201
08:54:45,441 --> 08:54:49,182
Vì vậy, hãy tiếp tục và xem xét\nmột ví dụ quen thuộc.

9202
08:54:49,182 --> 08:54:52,932
Điều gì đó liên quan đến mã,\n

9203
08:54:52,932 --> 08:54:54,750
đến giá trị như 50, trong trường hợp này.

9204
08:54:54,750 --> 08:54:57,042
Và sau đó chúng ta hãy bắt đầu tìm hiểu\nnhững gì đang diễn ra

9205
08:54:57,042 --> 08:54:58,752
bên trong bộ nhớ của máy tính.

9206
08:54:58,752 --> 08:55:01,551
Trong giây lát tôi sẽ tải\nup VS Code vào máy tính của mình

9207
08:55:01,551 --> 08:55:04,871
và tôi sẽ tiếp tục và quất\n

9208
08:55:04,871 --> 08:55:08,592
một giá trị như số\n50 cho một biến có tên là n

9209
08:55:08,592 --> 08:55:14,397
nhưng hôm nay, hãy nhớ rằng\nbiến n đó và giá trị 50 đó

9210
08:55:14,397 --> 08:55:16,764
sẽ được lưu trữ ở đâu đó\trong bộ nhớ máy tính của tôi

9211
08:55:16,764 --> 08:55:19,932
và hóa ra hôm nay chúng tôi sẽ giới thiệu\n

9212
08:55:19,932 --> 08:55:22,371
xem mọi thứ đang được lưu trữ ở đâu.

9213
08:55:22,371 --> 08:55:24,072
Vì vậy, hãy để tôi nhấp vào Mã VS ở đây.

9214
08:55:24,072 --> 08:55:27,042
Tôi sẽ tạo một\nchương trình tên là address.c

9215
08:55:27,042 --> 08:55:29,532
để khám phá địa chỉ\ncủa máy tính ngay hôm nay và tôi

9216
08:55:29,531 --> 08:55:34,061
sẽ thực hiện include stdio.h,\nint main(void), như thường lệ.

9217
08:55:34,062 --> 08:55:35,802
Hiện tại không có đối số dòng lệnh.

9218
08:55:35,801 --> 08:55:38,403
Tôi sẽ khai báo rằng\nbiến n bằng 50

9219
08:55:38,403 --> 08:55:40,611
và sau đó tôi sẽ\ntiếp tục và in nó ra.

9220
08:55:40,612 --> 08:55:46,092
Vì vậy không có gì thú vị lắm nhưng tôi sẽ\n

9221
08:55:47,682 --> 08:55:50,672
Không có gì ở đây rất thú vị để biên dịch hoặc chạy

9222
08:55:50,671 --> 08:55:53,171
nhưng tôi sẽ làm điều đó chỉ để đảm bảo\ntôi không phạm sai lầm nào.

9223
08:55:53,171 --> 08:55:58,662
Có vẻ như đúng như mong đợi, nó chỉ đơn giản là\n

9224
08:55:58,662 --> 08:56:02,141
Nhưng hãy xem xét, đây là gì\n

9225
08:56:02,141 --> 08:56:04,882
khi nó thực sự chạy trên máy của bạn.

9226
08:56:04,882 --> 08:56:06,762
Vì vậy, ở đây chúng ta có lưới bộ nhớ đó.

9227
08:56:06,761 --> 08:56:10,811
Biến n đó là một int,\nand nếu bạn nghĩ lại

9228
08:56:10,812 --> 08:56:14,412
thông thường chúng ta sử dụng bao nhiêu byte\ncho một int?

9229
08:56:15,491 --> 08:56:18,050
Bốn, bốn byte, hay 32 bit.

9230
08:56:18,050 --> 08:56:21,851
Vì vậy, nếu mỗi ô vuông này đại diện cho\n

9231
08:56:21,851 --> 08:56:25,173
trong bộ nhớ của tôi, hay RAM, đang\nsử dụng bốn ô vuông này.

9232
08:56:25,173 --> 08:56:27,881
Có lẽ nó chỉ kết thúc ở đây\n

9233
08:56:27,882 --> 08:56:29,092
được sử dụng ở nơi khác chẳng hạn.

9234
08:56:29,092 --> 08:56:30,842
Mặc dù tôi không thực sự\nbiết, và thành thật mà nói, tôi

9235
08:56:30,842 --> 08:56:33,634
không thực sự quan tâm nó kết thúc ở đâu\n

9236
08:56:33,633 --> 08:56:37,300
Vậy biến-- giá trị 50 là\n

9237
08:56:37,300 --> 08:56:40,941
Mặc dù tôi đã viết nó dưới dạng\nthập phân, giống như trong mã của tôi--

9238
08:56:40,941 --> 08:56:45,544
để tôi nhắc lại rằng đây là 32\n

9239
08:56:45,544 --> 08:56:48,711
sẽ rất tẻ nhạt nếu\n

9240
08:56:48,711 --> 08:56:51,711
vì vậy tôi sẽ sử dụng hệ thập phân\ncon người thoải mái hơn.

9241
08:56:51,711 --> 08:56:54,502
Vậy đó là những gì đang diễn ra\bên trong bộ nhớ máy tính.

9242
08:56:54,502 --> 08:56:58,932
Vậy nếu tôi thực sự muốn\n

9243
08:56:58,932 --> 08:57:01,452
hoặc có thể chỉ cần biết vị trí của nó?

9244
08:57:01,452 --> 08:57:05,262
À, biến này n\thực sự có tên, n--

9245
08:57:05,261 --> 08:57:09,123
đó là một loại nhãn dành cho nó--\n

9246
08:57:09,123 --> 08:57:11,831
về mặt kỹ thuật tại một địa chỉ cụ thể,\n

9247
08:57:11,831 --> 08:57:14,861
0x123 và nó là 123\nvì tôi thực sự không biết

9248
08:57:14,862 --> 08:57:17,781
quan tâm nó là gì, tôi chỉ muốn một\n

9249
08:57:17,781 --> 08:57:24,311
Vậy có thể ở đây, ngoài màn hình\n

9250
08:57:24,312 --> 08:57:28,222
Nó ở dạng ký hiệu thập lục phân\ntheo quy ước.

9251
08:57:28,222 --> 08:57:32,052
Vậy làm cách nào tôi thực sự có thể thấy\ncác biến của tôi đang kết thúc ở đâu

9252
08:57:32,051 --> 08:57:33,702
trong bộ nhớ nếu tôi tò mò muốn làm như vậy?

9253
08:57:33,702 --> 08:57:37,182
Chà, hãy để tôi quay lại\ncode của tôi ở đây và để tôi thực sự

9254
08:57:37,182 --> 08:57:39,441
thay đổi điều này một chút.

9255
08:57:39,441 --> 08:57:44,741
Hãy để tôi tiếp tục và giới thiệu,\nví dụ: một biểu tượng khác

9256
08:57:44,741 --> 08:57:48,941
ở đây và một chủ đề khác\cuối cùng, cụ thể là con trỏ.

9257
08:57:48,941 --> 08:57:54,471
Vậy con trỏ là một biến\n

9258
08:57:54,472 --> 08:57:57,731
vị trí của một số giá trị\hay cụ thể hơn

9259
08:57:57,731 --> 08:58:01,042
byte cụ thể trong đó\ngiá trị đó được lưu trữ.

9260
08:58:01,042 --> 08:58:04,301
Vậy một lần nữa, nếu bạn nghĩ về ký ức của mình\n

9261
08:58:04,301 --> 08:58:07,061
0 ở trên cùng bên trái, 2 tỷ\hoặc bất cứ thứ gì ở dưới cùng bên phải

9262
08:58:07,062 --> 08:58:08,562
tùy thuộc vào lượng RAM bạn có--

9263
08:58:08,562 --> 08:58:10,842
mỗi thứ đó đều có vị trí hoặc địa chỉ.

9264
08:58:10,842 --> 08:58:14,932
Con trỏ chỉ là một biến\nlưu trữ một địa chỉ như vậy.

9265
08:58:14,932 --> 08:58:20,112
Vậy hóa ra trong thế giới\n

9266
08:58:20,112 --> 08:58:24,472
chúng ta có thể sử dụng nếu chúng ta muốn xem những gì\n

9267
08:58:24,472 --> 08:58:27,402
và hai toán tử đó,\nas của ngày nay, chính là những toán tử này.

9268
08:58:27,401 --> 08:58:31,191
Bạn có thể sử dụng ký hiệu và\noperator trong C theo một số cách.

9269
08:58:31,191 --> 08:58:34,121
Chúng ta đã thấy nó rất ngắn gọn\nđể thực hiện ký hiệu và ký hiệu--

9270
08:58:34,121 --> 08:58:37,631
đó là một dạng và hai\nbiểu thức Boolean cùng nhau

9271
08:58:37,632 --> 08:58:39,172
trong bối cảnh của một điều kiện.

9272
08:58:40,182 --> 08:58:43,992
Một ký hiệu duy nhất là\nđịa chỉ của nhà điều hành.

9273
08:58:43,991 --> 08:58:48,011
Vì vậy, theo nghĩa đen, trong mã của bạn, nếu bạn\n

9274
08:58:48,011 --> 08:58:53,261
và bạn viết vàn, C sẽ tính ra\n

9275
08:58:53,261 --> 08:58:55,731
biến n trong bộ nhớ máy tính.

9276
08:58:55,731 --> 08:59:01,362
Và nó sẽ cung cấp cho bạn một con số,\n

9277
08:59:01,362 --> 08:59:05,141
Nếu bạn muốn lưu trữ\nđịa chỉ đó trong một biến

9278
08:59:05,141 --> 08:59:11,202
mặc dù có, nhưng nó là một con số như\n

9279
08:59:11,202 --> 08:59:17,082
mà bạn muốn lưu trữ không phải là int\n

9280
08:59:17,081 --> 08:59:20,711
Và cú pháp để làm điều đó--\nhơi khó hiểu-- là

9281
08:59:20,711 --> 08:59:24,432
để sử dụng dấu hoa thị ở đây,\na toán tử dấu sao và bạn

9282
08:59:24,432 --> 08:59:26,231
nói điều này khi tạo biến.

9283
08:59:26,231 --> 08:59:30,731
Nếu bạn muốn p là một con trỏ, thì đó\n

9284
08:59:32,412 --> 08:59:36,551
Và ngôi sao chỉ nói với máy tính,\n

9285
08:59:36,551 --> 08:59:40,002
đây là địa chỉ của\nthứ gì đó mà đúng, là một int

9286
08:59:40,002 --> 08:59:41,761
nhưng chúng tôi chỉ đang nói chính xác hơn.

9287
08:59:41,761 --> 08:59:44,662
Vì vậy, ở phía bên phải bạn\ncó địa chỉ của nhà điều hành.

9288
08:59:44,662 --> 08:59:47,641
Như mọi khi với dấu bằng,\nbạn sao chép từ phải sang trái.

9289
08:59:47,641 --> 08:59:51,592
Bởi vì andn theo định nghĩa là địa chỉ\n

9290
08:59:51,592 --> 08:59:57,141
trong một con trỏ và cách khai báo a\n

9291
08:59:57,141 --> 09:00:01,191
bạn đang lưu trữ địa chỉ của ai, sau đó\n

9292
09:00:01,191 --> 09:00:04,701
thực sự là một con trỏ chứ không phải\nchỉ là một int cũ thông thường.

9293
09:00:04,702 --> 09:00:06,172
Vì vậy, hãy xem điều này trong thực tế.

9294
09:00:06,171 --> 09:00:09,231
Hãy để tôi quay lại mã nguồn\ncủa riêng tôi ở đây và để

9295
09:00:09,231 --> 09:00:11,241
tôi chỉ thực hiện một vài điều chỉnh.

9296
09:00:11,241 --> 09:00:13,581
Tôi sẽ để n\na một mình ở đây nhưng tôi sẽ đi

9297
09:00:13,581 --> 09:00:18,121
để tiếp tục và ban đầu chỉ cần làm điều này.

9298
09:00:18,121 --> 09:00:22,702
Hãy để tôi nói int star\np bằng ký hiệu và n

9299
09:00:22,702 --> 09:00:27,322
rồi xuống đây, tôi sẽ đi\n

9300
09:00:28,761 --> 09:00:33,531
Và dù có thì cũng chỉ là\n

9301
09:00:33,531 --> 09:00:37,671
đối với số nguyên thì thực sự có một số đặc biệt\n

9302
09:00:37,671 --> 09:00:40,881
con trỏ hoặc địa chỉ và đó là %p.

9303
09:00:40,882 --> 09:00:44,182
Vì vậy bây giờ chúng ta hãy tiếp tục và\nbiên dịch lại cái này, tạo địa chỉ--

9304
09:00:44,182 --> 09:00:49,231
cho đến nay vẫn rất tốt-- ./address,\nEnter và hơi kỳ lạ một chút

9305
09:00:49,231 --> 09:00:53,871
nhưng bây giờ có lẽ có thể hiểu được,\n

9306
09:00:53,871 --> 09:00:57,741
tại đó biến n xảy ra\n

9307
09:00:59,241 --> 09:01:01,791
Máy tính này có nhiều\nbộ nhớ hơn nên về mặt kỹ thuật

9308
09:01:01,792 --> 09:01:07,852
nó được lưu trữ tại 0x7FFCB4578E5C.

9309
09:01:07,851 --> 09:01:10,011
Bây giờ điều đó không có ý nghĩa đặc biệt\nvới tôi.

9310
09:01:10,011 --> 09:01:12,241
Nó có thể đã kết thúc\nở một nơi khác hoàn toàn

9311
09:01:12,241 --> 09:01:15,741
nhưng đây chính là nơi, trong\n của tôi

9312
09:01:15,741 --> 09:01:18,261
máy chủ mà tôi đang kết nối\nsử dụng Mã VS tại đây--

9313
09:01:18,261 --> 09:01:20,859
điều đó chỉ xảy ra ở\nnơi n kết thúc.

9314
09:01:20,859 --> 09:01:23,691
Và nói đúng ra, tôi thậm chí còn không\n

9315
09:01:23,691 --> 09:01:26,541
Tôi có thể loại bỏ p\nand tôi chỉ có thể nói

9316
09:01:26,542 --> 09:01:30,262
in không chỉ n mà cả địa chỉ\n

9317
09:01:30,261 --> 09:01:32,721
Bạn không cần phải tạm thời\nlưu trữ nó trong một biến.

9318
09:01:32,722 --> 09:01:35,702
Hãy để tôi thực hiện lại make\naddress, ./address

9319
09:01:35,702 --> 09:01:38,282
và bây giờ tôi thấy địa chỉ này ở đây.

9320
09:01:38,281 --> 09:01:41,826
Và để ý xem tôi có tiếp tục chạy\n không

9321
09:01:41,827 --> 09:01:44,452
Có lẽ có những thứ khác\nđang diễn ra bên trong máy tính.

9322
09:01:44,452 --> 09:01:47,862
Có lẽ nó thực sự đang ngẫu nhiên hóa nó nên\n

9323
09:01:47,862 --> 09:01:50,362
Đó thực sự có thể là một tính năng\nbảo mật bên dưới mui xe

9324
09:01:50,362 --> 09:01:55,882
nhưng điều này xảy ra vào lúc đó\n

9325
09:01:55,882 --> 09:01:58,852
khá giống với hình ảnh của chúng ta lúc nãy.

9326
09:01:58,851 --> 09:02:02,002
Được rồi, hãy để tôi tạm dừng\nở đây để xem bây giờ có

9327
09:02:02,002 --> 09:02:03,531
bất kỳ câu hỏi nào về việc chúng ta vừa làm.

9328
09:02:05,531 --> 09:02:07,752
ĐỐI TƯỢNG: Có\ncách nào để kiểm soát nơi

9329
09:02:07,752 --> 09:02:10,912
bạn đang lưu trữ một cái gì đó trong bộ nhớ?

9330
09:02:10,912 --> 09:02:14,106
Liệu nó có quan trọng không nếu\nit hoạt động, hay nó chỉ

9331
09:02:14,106 --> 09:02:16,632
vấn đề là bạn có thể vào\nvà xác định vị trí của thứ gì đó?

9332
09:02:16,632 --> 09:02:18,174
DAVID J. Malan: Câu hỏi thực sự hay.

9333
09:02:18,173 --> 09:02:20,741
Có cách nào để kiểm soát\nthứ gì đó ở đâu trong bộ nhớ không?

9334
09:02:20,741 --> 09:02:23,698
Câu trả lời ngắn gọn là có, và đây là\n

9335
09:02:23,699 --> 09:02:26,531
và chúng ta sẽ làm điều này hôm nay\n

9336
09:02:26,531 --> 09:02:31,601
bởi vì với khả năng đi tới hoặc\n

9337
09:02:31,601 --> 09:02:33,701
Tôi có thể tùy ý\nngay bây giờ viết mã

9338
09:02:33,702 --> 09:02:37,972
lưu trữ giá trị ở mức 2 tỷ byte,\n

9339
09:02:37,972 --> 09:02:42,132
Nhưng điều đó cũng có nghĩa là có khả năng,\ntôi có thể bắt đầu nhìn một cách đáng sợ

9340
09:02:42,132 --> 09:02:46,192
xung quanh toàn bộ bộ nhớ của máy tính,\n

9341
09:02:46,191 --> 09:02:48,731
Có thể là các chương trình khác, có thể\ncác phần khác của chương trình

9342
09:02:48,731 --> 09:02:50,981
và quả thực, đây là\nmối đe dọa bảo mật tiềm ẩn

9343
09:02:50,981 --> 09:02:53,345
nếu đột nhiên bạn có thể\nnhìn vào bất cứ đâu

9344
09:02:53,345 --> 09:02:54,762
bạn muốn trong bộ nhớ của máy tính.

9345
09:02:54,761 --> 09:02:59,381
Bây giờ tôi đang bán nó quá mức một chút\n

9346
09:02:59,382 --> 09:03:01,932
có một số vị trí phòng thủ\n trong trình biên dịch

9347
09:03:01,932 --> 09:03:05,301
và trong hệ điều hành của chúng tôi\n

9348
09:03:05,301 --> 09:03:07,752
Nhưng đây vẫn là nguồn gốc của vấn đề rất\nthường xuyên xảy ra

9349
09:03:07,752 --> 09:03:10,152
và sau ngày hôm nay chúng ta sẽ\nnói ngắn gọn về mọi thứ

9350
09:03:10,151 --> 09:03:13,011
được gọi là tràn ngăn xếp,\nkhông chỉ là một trang web

9351
09:03:13,011 --> 09:03:15,191
đó là một vấn đề mà bạn có thể gặp phải.

9352
09:03:15,191 --> 09:03:17,711
Tràn vùng heap và hơn thế nữa\nnói chung là tràn bộ đệm--

9353
09:03:17,711 --> 09:03:21,162
có rất nhiều thứ có thể\n

9354
09:03:21,162 --> 09:03:24,761
và có bạn nào gặp lỗi\na phân đoạn chưa?

9355
09:03:24,761 --> 09:03:26,681
Tôi nghĩ chúng ta đã thấy một số người làm được điều đó rồi.

9356
09:03:26,682 --> 09:03:29,262
Bạn đã chạm vào ký ức\nmà lẽ ra bạn không nên có

9357
09:03:29,261 --> 09:03:33,971
và rất có thể là bạn đã làm điều đó gần đây nhất\n

9358
09:03:33,972 --> 09:03:37,362
Đi sang bên trái hoặc phủ định trong một\n

9359
09:03:38,202 --> 09:03:42,412
Và hôm nay chúng tôi sẽ giải thích lý do tại sao bạn có thể làm được điều đó.

9360
09:03:42,412 --> 09:03:44,891
Cho đến nay, bạn có câu hỏi nào khác về\nnhững nguyên thủy này không?

9361
09:03:46,984 --> 09:03:50,109
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC] ngôi sao con trỏ p,\n

9362
09:03:51,391 --> 09:03:52,641
DAVID J. Malan: Câu hỏi hay.

9363
09:03:53,932 --> 09:03:56,422
Hãy để tôi tua lại thời gian về\nphiên bản trước của mã này

9364
09:03:56,421 --> 09:03:58,701
nơi tôi thực sự có\na biến được gọi là p.

9365
09:03:58,702 --> 09:04:02,512
Giống như các khai báo biến\n trước đây

9366
09:04:02,511 --> 09:04:07,981
một khi bạn đã khai báo một biến cho\n

9367
09:04:07,981 --> 09:04:11,121
ngôi sao, hay còn gọi là con trỏ,\nsau đó bạn không làm như vậy

9368
09:04:11,121 --> 09:04:14,031
tiếp tục sử dụng từ\nint hoặc bây giờ, ngôi sao.

9369
09:04:14,031 --> 09:04:15,831
Khai báo xong thì thế là xong.

9370
09:04:15,831 --> 09:04:17,281
Bạn chỉ đề cập đến nó bằng tên.

9371
09:04:17,281 --> 09:04:21,471
Và vì vậy, những gì tôi đã làm ở đây là rất có chủ ý

9372
09:04:21,472 --> 09:04:24,022
nói rằng kiểu ở đây là int star--

9373
09:04:24,022 --> 09:04:26,031
đó là một con trỏ tới int--

9374
09:04:26,031 --> 09:04:28,971
nhưng ở đây tôi chỉ nói tên\ncủa biến, như mọi khi.

9375
09:04:28,972 --> 09:04:31,672
Tôi đã không lặp lại int và\nTôi cũng không lặp lại star.

9376
09:04:31,671 --> 09:04:34,551
Nhưng có nguy cơ khiến tâm trí của ai bị bẻ cong một chút ở đó

9377
09:04:34,551 --> 09:04:40,801
thật không may là một cách sử dụng khác cho\n

9378
09:04:40,801 --> 09:04:44,542
Nếu bạn muốn in ra không\nđịa chỉ của thứ gì đó

9379
09:04:44,542 --> 09:04:49,622
nhưng tại một địa chỉ\n cụ thể, bạn thực sự có thể làm điều này.

9380
09:04:49,621 --> 09:04:54,981
Nếu tôi muốn in ra số nguyên\n

9381
09:04:54,981 --> 09:04:59,421
Tôi thực sự có thể sử dụng ngôi sao ở đây\n

9382
09:04:59,421 --> 09:05:02,521
đã nói nhưng ở đây nó có một\nchức năng khác-- một mục đích khác.

9383
09:05:02,522 --> 09:05:04,922
Vì vậy, hãy để tôi tiếp tục và thực hiện việc này theo hai cách khác nhau.

9384
09:05:04,921 --> 09:05:06,726
Tôi sẽ giữ nguyên\ndòng mã này

9385
09:05:06,726 --> 09:05:08,601
nhưng bây giờ tôi sẽ thêm\nanother dòng mã

9386
09:05:08,601 --> 09:05:12,561
in ra những gì dường như\nsẽ là một số nguyên trong giây lát.

9387
09:05:12,562 --> 09:05:16,485
Vậy nên %i gạch chéo ngược n, và tôi có thể\n

9388
09:05:16,485 --> 09:05:18,652
Vì vậy thực sự không có gì\nđặc biệt xảy ra bây giờ, tôi

9389
09:05:18,651 --> 09:05:20,661
chỉ cần thêm một kiểu\nin ấn vô tư của n.

9390
09:05:20,662 --> 09:05:23,402
Vì vậy, hãy tạo địa chỉ, ./address--

9391
09:05:23,401 --> 09:05:26,961
có địa chỉ hiện tại của\nn và có giá trị của n.

9392
09:05:26,961 --> 09:05:29,932
Nhưng C ở đây cũng có gì thú vị\n

9393
09:05:29,932 --> 09:05:34,222
là nếu bạn biết rằng một giá trị\na ở một địa chỉ cụ thể như p

9394
09:05:34,222 --> 09:05:37,952
có một cách sử dụng khác cho toán tử\nstar này, dấu hoa thị.

9395
09:05:37,952 --> 09:05:41,582
Bạn có thể sử dụng nó như\ncái gọi là toán tử quy định

9396
09:05:41,581 --> 09:05:44,431
có nghĩa là đi đến địa chỉ đó.

9397
09:05:44,432 --> 09:05:50,062
Và đây là những gì chúng ta thực sự có\nis một ví dụ về con trỏ p

9398
09:05:50,062 --> 09:05:54,992
đó là một địa chỉ như\n0x123 hoặc 0x7FF, v.v.

9399
09:05:54,991 --> 09:05:58,551
Nhưng nếu bây giờ bạn nói star p thì bạn\nkhông khai báo lại biến

9400
09:05:58,551 --> 09:05:59,991
bởi vì tôi đã không đề cập đến int--

9401
09:05:59,991 --> 09:06:02,751
bạn sẽ đến địa chỉ đó ở p.

9402
09:06:02,752 --> 09:06:04,432
Vì vậy, hãy để tôi biên dịch lại cái này ngay bây giờ.

9403
09:06:04,432 --> 09:06:10,552
Tạo địa chỉ, ./address,\nand cho rõ ràng--

9404
09:06:12,082 --> 09:06:15,592
Đầu tiên tôi sẽ xem chính con trỏ\n, 0x gì đó.

9405
09:06:15,591 --> 09:06:18,456
Dòng đầu ra thứ hai\nCó lẽ tôi nên xem bây giờ là gì?

9406
09:06:22,951 --> 09:06:27,271
Vậy là tôi đang nghe 50 và điều đó đúng\n

9407
09:06:27,271 --> 09:06:33,511
của n và in nó ở dòng thứ bảy, nhưng\n

9408
09:06:33,512 --> 09:06:36,692
thực sự nó sẽ chỉ cho bạn thấy số n--

9409
09:06:39,482 --> 09:06:42,389
Được rồi, bây giờ có bất kỳ câu hỏi nào\n

9410
09:06:42,389 --> 09:06:44,222
Tôi nghĩ điều này thật khó hiểu--\nthực tế là chúng tôi

9411
09:06:44,222 --> 09:06:46,412
thực tế là sử dụng dấu sao để\nphép nhân

9412
09:06:46,411 --> 09:06:48,721
rằng chúng ta sử dụng dấu sao\nđể khai báo một con trỏ

9413
09:06:48,722 --> 09:06:51,961
nhưng sau đó chúng tôi sử dụng dấu sao theo cách\nthứ ba để hủy đăng ký con trỏ

9414
09:06:53,012 --> 09:06:56,612
Thành thật mà nói thì nó quá khó hiểu,\n

9415
09:07:07,862 --> 09:07:09,112
DAVID J. Malan: Câu hỏi hay.

9416
09:07:09,112 --> 09:07:12,682
Bạn có-- khi bạn đang sử dụng\ntoán tử dấu và

9417
09:07:12,682 --> 09:07:14,631
để có được địa chỉ của\nthứ gì đó, trách nhiệm

9418
09:07:14,631 --> 09:07:18,771
bạn cần biết vào lúc này\n

9419
09:07:22,042 --> 09:07:25,402
Tôi đã viết mã này để tôi\nbiết ở dòng thứ sáu rằng tôi

9420
09:07:25,402 --> 09:07:28,491
cố gắng lấy địa chỉ\ncủa số nguyên là gì.

9421
09:07:28,491 --> 09:07:30,631
ĐỐI TƯỢNG: Còn dòng thứ tám thì sao?

9422
09:07:30,631 --> 09:07:34,351
DAVID J. Malan: Trong dòng\ntight bạn không có

9423
09:07:34,351 --> 09:07:36,182
phải lo lắng về điều đó-- câu hỏi hay.

9424
09:07:36,182 --> 09:07:40,211
Thông báo ở dòng thứ tám, tôi đã không nói\n

9425
09:07:40,211 --> 09:07:44,911
tôi sẽ đến địa chỉ nào\n

9426
09:07:44,911 --> 09:07:47,941
Tôi đã nói với trình biên dịch\nrằng p, bây giờ và mãi mãi

9427
09:07:47,942 --> 09:07:50,402
sẽ là địa chỉ của một int.

9428
09:07:50,402 --> 09:07:55,322
Thông tin trước như vậy là đủ rồi\n

9429
09:07:55,322 --> 09:07:59,311
vẫn biết ở dòng thứ tám\nrằng p là một con trỏ tới int

9430
09:07:59,311 --> 09:08:02,731
và bằng cách đó nó sẽ in ra\ntất cả bốn byte tại địa chỉ đó

9431
09:08:02,732 --> 09:08:06,649
không chỉ là một phần của nó, và không\nnhiều hơn bốn byte đó.

9432
09:08:09,161 --> 09:08:10,661
ĐỐI TƯỢNG: Con trỏ có con trỏ không?

9433
09:08:10,661 --> 09:08:11,961
DAVID J. Malan:\nCon trỏ có con trỏ không?

9434
09:08:12,461 --> 09:08:16,091
Hôm nay chúng ta sẽ không làm điều này bằng cách\ncó con trỏ tới con trỏ

9435
09:08:16,091 --> 09:08:19,781
nhưng vâng, bạn có thể sử dụng star\nstar, và sau đó mọi thứ sẽ--

9436
09:08:21,671 --> 09:08:23,862
Hôm nay chúng tôi sẽ không làm điều đó và\nchúng tôi sẽ không làm điều đó thường xuyên.

9437
09:08:23,862 --> 09:08:26,412
Trên thực tế, Python, một ngôn ngữ khác,\nchỉ một vài tuần

9438
09:08:31,692 --> 09:08:33,552
Đó là-- nhiều phản hồi bằng lời nói hơn như thế

9439
09:08:33,552 --> 09:08:36,232
rất hữu ích khi chúng tôi tiến sâu vào\nnhững thứ phức tạp hơn.

9440
09:08:38,269 --> 09:08:40,145
ĐỐI TƯỢNG:\nđiểm của [KHÔNG NGHE ĐƯỢC] là gì??

9441
09:08:43,432 --> 09:08:46,521
DAVID J. Malan: Mục đích của việc in địa chỉ là gì?

9442
09:08:46,521 --> 09:08:49,811
ĐỐI TƯỢNG: Giống như, sử dụng\nđịa chỉ để [KHÔNG NGHE ĐƯỢC]..

9443
09:08:50,741 --> 09:08:51,881
Mục đích của việc này là gì?

9444
09:08:51,881 --> 09:08:54,131
Nếu bạn không phiền, hãy để tôi--\nchúng ta hãy đến đó trong giây lát.

9445
09:08:54,131 --> 09:08:56,831
Đây không phải là trường hợp sử dụng thông thường,\nchỉ cần in ra địa chỉ--

9446
09:08:58,182 --> 09:09:00,762
Hiện tại chúng tôi chỉ quan tâm\nvì mục đích thảo luận.

9447
09:09:00,762 --> 09:09:02,814
Chúng tôi sắp bắt đầu\nsử dụng những địa chỉ này.

9448
09:09:02,813 --> 09:09:05,021
Vậy nên hãy cố gắng một chút\ncho cái đó nữa

9449
09:09:05,021 --> 09:09:08,981
nhưng nó sẽ sớm giải quyết được một số\nvấn đề cho chúng ta.

9450
09:09:08,982 --> 09:09:12,672
Vì vậy bây giờ chúng ta hãy mô tả những gì\n

9451
09:09:15,052 --> 09:09:19,332
Vậy nếu tôi chuyển lại đây, hãy\ntôi vẽ lại bộ nhớ máy tính của tôi

9452
09:09:19,332 --> 09:09:22,781
bây giờ hãy để tôi thả mình vào ký ức n,\n

9453
09:09:23,832 --> 09:09:25,992
p ở đâu trong bộ nhớ máy tính của tôi?

9454
09:09:25,991 --> 09:09:29,051
Cụ thể là tôi không biết và\n

9455
09:09:29,052 --> 09:09:31,102
chạy chương trình vì\nđể thảo luận

9456
09:09:31,101 --> 09:09:36,072
hãy đề xuất rằng nếu 50 kết thúc\n

9457
09:09:36,072 --> 09:09:38,832
p kết thúc ở đây, tại địa chỉ--

9458
09:09:38,832 --> 09:09:42,022
rất tiếc-- tại bất kỳ\nđịa chỉ nào ở đây.

9459
09:09:42,021 --> 09:09:44,471
Nhưng bây giờ hãy chú ý đến một vài điều tò mò.

9460
09:09:44,472 --> 09:09:47,982
Nếu p là một con trỏ thì đó\nlà địa chỉ của thứ gì đó.

9461
09:09:47,982 --> 09:09:53,322
Vì vậy giá trị trong p phải là một địa chỉ,\n

9462
09:09:53,322 --> 09:09:57,432
0x123 và về mặt kỹ thuật thì không có\n

9463
09:09:57,432 --> 09:09:59,832
thậm chí còn không có 123\nở đó-- có

9464
09:09:59,832 --> 09:10:03,372
một mẫu bit\nđại diện cho địa chỉ 0x123.

9465
09:10:03,372 --> 09:10:07,042
Nhưng một lần nữa, đó là số 0 yếu--\n

9466
09:10:07,042 --> 09:10:13,122
Vậy nếu đây là p, và điều này tôi đã khẳng định\n

9467
09:10:13,122 --> 09:10:15,592
Ai đó có thể phỏng đoán ở đây?

9468
09:10:15,591 --> 09:10:20,421
Bởi vì hóa ra n\nis là int hay char hay bool

9469
09:10:20,421 --> 09:10:23,061
có nhiều loại\nkhác nhau-- chết tiệt, thậm chí là một loại dài--

9470
09:10:23,061 --> 09:10:27,231
hóa ra p luôn luôn đi\n

9471
09:10:36,868 --> 09:10:40,812
ĐỐI TƯỢNG: Có lẽ nó\phân bổ tám byte

9472
09:10:40,811 --> 09:10:44,319
nhưng nó không biết loại\ncủa dữ liệu [KHÔNG NGHE ĐƯỢC]..

9473
09:10:45,362 --> 09:10:47,552
Có lẽ nó đang phân bổ 8 byte\n

9474
09:10:47,552 --> 09:10:50,072
Hóa ra điều đó không sao cả vì địa chỉ\nan là một địa chỉ.

9475
09:10:50,072 --> 09:10:53,641
Việc đó thực sự tùy thuộc vào người lập trình\n

9476
09:10:55,741 --> 09:11:00,803
ĐỐI TƯỢNG: Có thể là bốn cái đầu tiên cho\n

9477
09:11:00,803 --> 09:11:06,393
có một số giá trị rỗng [KHÔNG NGHE ĐƯỢC]\nnơi con trỏ kết thúc.

9478
09:11:06,394 --> 09:11:07,601
DAVID J. Malan: Được rồi, có thể.

9479
09:11:07,601 --> 09:11:10,572
Có thể là con trỏ có\n

9480
09:11:10,572 --> 09:11:13,451
hoặc điều gì đó tò mò như thế,\n

9481
09:11:13,451 --> 09:11:15,112
Hóa ra không phải vậy.

9482
09:11:15,112 --> 09:11:18,641
Hóa ra con trỏ\ngày nay thường là như vậy, nhưng không

9483
09:11:18,641 --> 09:11:21,281
luôn là tám byte, hay còn gọi là

9484
09:11:21,281 --> 09:11:24,461
64 bit, bởi vì bạn và\nI-- máy Mac của chúng tôi, PC của chúng tôi

9485
09:11:24,461 --> 09:11:28,271
chết tiệt-- ngay cả điện thoại của chúng ta cũng có rất nhiều\n

9486
09:11:28,271 --> 09:11:30,161
Trước đây, một\ncon trỏ có thể chỉ có

9487
09:11:30,161 --> 09:11:34,061
trước đây là 32 bit, hoặc thậm chí chỉ có\night bit.

9488
09:11:34,061 --> 09:11:36,911
Nó được coi là 32 bit, bởi vì\n

9489
09:11:36,911 --> 09:11:40,451
Bạn có thể đếm được bao nhiêu\nđại khái nếu bạn có 32 bit?

9490
09:11:40,451 --> 09:11:43,261
Con số mà chúng ta tiếp tục lảng vảng là gì?

9491
09:11:43,262 --> 09:11:48,422
32 bit xấp xỉ bằng 2 mũ 32, vậy nó là 4 tỷ

9492
09:11:48,421 --> 09:11:52,631
và tôi cứ nói là 2 tỷ nếu bạn\n

9493
09:11:52,631 --> 09:11:55,891
có lý do mà tôi cứ nói\n2 tỷ byte, hai gigabyte

9494
09:11:55,891 --> 09:11:58,951
bởi vì trong một thời gian rất dài\n

9495
09:12:00,482 --> 09:12:02,852
Bởi vì các con trỏ\nmáy tính đang sử dụng

9496
09:12:02,851 --> 09:12:04,891
chẳng hạn, chỉ có 32 bit.

9497
09:12:04,891 --> 09:12:07,951
Và với 32 bit, tùy thuộc vào việc\n

9498
09:12:07,951 --> 09:12:10,981
bạn có thể đếm tới 2 tỷ\nđại khái hoặc có thể là 4 tỷ

9499
09:12:10,982 --> 09:12:13,322
nhưng bạn biết không--\nMac, PC, điện thoại của bạn

9500
09:12:13,322 --> 09:12:17,802
không thể có năm gigabyte\n

9501
09:12:17,802 --> 09:12:20,552
Bạn chắc chắn không thể có\n

9502
09:12:20,552 --> 09:12:22,532
có thể là 8 gigabyte bộ nhớ--

9503
09:12:24,572 --> 09:12:28,862
Bởi vì với 4 byte hoặc 32\nbit, theo nghĩa đen, về mặt vật lý, bạn

9504
09:12:28,862 --> 09:12:32,972
không thể đếm cao đến thế, có nghĩa là nếu tôi\n

9505
09:12:32,972 --> 09:12:36,662
sẽ hết số để mô tả\n

9506
09:12:37,991 --> 09:12:41,131
Vì vậy, con trỏ ngày nay có\n64 bit hoặc 8 byte.

9507
09:12:41,881 --> 09:12:43,798
Tôi thậm chí còn không thể phát âm\ncon số đó lớn đến mức nào

9508
09:12:43,798 --> 09:12:46,411
nhưng nó sẽ đủ cho nhiều năm\ntiếp theo, và thế là

9509
09:12:46,411 --> 09:12:48,241
chúng tôi đã vẽ nó\ntrên bảng ở đây.

9510
09:12:48,241 --> 09:12:49,862
Bây giờ chúng ta hãy tóm tắt điều này đi.

9511
09:12:49,862 --> 09:12:51,569
Hãy loại bỏ tất cả\ncác byte khác

9512
09:12:51,569 --> 09:12:54,271
đang lưu trữ thứ gì đó hoặc\nkhông có gì khác và bây giờ chúng ta hãy

9513
09:12:54,271 --> 09:12:57,601
bắt đầu trừu tượng hóa sự phức tạp\nnày bởi vì thực tế là

9514
09:12:59,491 --> 09:13:01,801
điều này có ích gì, hoặc\nchúng ta-- chúng ta thực sự làm gì

9515
09:13:04,322 --> 09:13:06,421
Chúng tôi đang làm điều này để\nbạn thấy không có phép thuật nào cả.

9516
09:13:06,421 --> 09:13:09,311
Chúng ta chỉ di chuyển mọi thứ xung quanh\nvà lục lọi trong trí nhớ.

9517
09:13:09,311 --> 09:13:12,151
Nhưng điều mà một người thường\nlàm khi nói về con trỏ

9518
09:13:12,152 --> 09:13:14,762
nghĩa đen là\nchỉ vào một cái gì đó.

9519
09:13:14,762 --> 09:13:17,312
Tôi thực sự không quan tâm\nn ở địa chỉ nào

9520
09:13:17,311 --> 09:13:20,491
vậy là đủ khi nói chung, khi\n

9521
09:13:20,491 --> 09:13:22,381
đang thảo luận\nvới một lập trình viên khác

9522
09:13:22,381 --> 09:13:26,701
bạn chỉ cần vẽ một mũi tên từ\n

9523
09:13:26,701 --> 09:13:31,830
bởi vì có lẽ cả bạn và tôi đều không quan tâm\n

9524
09:13:31,830 --> 09:13:35,173
Con trỏ của bạn đây-- theo nghĩa đen\n

9525
09:13:35,173 --> 09:13:37,381
Vì vậy hóa ra những\ncon trỏ này, những địa chỉ này

9526
09:13:37,381 --> 09:13:41,191
không khác với những gì\nchúng ta đã làm trong hàng trăm năm

9527
09:13:41,192 --> 09:13:43,742
dưới hình thức một hệ thống bưu chính.

9528
09:13:43,741 --> 09:13:45,481
Ví dụ, đây là một bưu điện--

9529
09:13:45,482 --> 09:13:48,092
đây, không-- đây là\nhộp thư, và giả sử

9530
09:13:48,091 --> 09:13:50,791
rằng đây là hộp thư có nhãn p.

9531
09:13:50,792 --> 09:13:53,552
Đó là một con trỏ và giả sử\ncó một hộp thư khác

9532
09:13:53,552 --> 09:13:57,402
ở đằng kia, chỉ là\n

9533
09:13:57,402 --> 09:13:59,192
Chúng ta thực sự đang nói về cái gì vậy?

9534
09:13:59,192 --> 09:14:03,242
Vâng, bạn lưu trữ trong máy tính\n

9535
09:14:03,241 --> 09:14:07,201
hoặc từ "xin chào" bên trong\n của bạn

9536
09:14:07,201 --> 09:14:11,281
Nhưng ngày nay chúng ta cũng có thể sử dụng\ncác vị trí bộ nhớ tương tự

9537
09:14:11,281 --> 09:14:12,911
để lưu trữ địa chỉ của sự vật.

9538
09:14:12,911 --> 09:14:16,711
Ví dụ, nếu tôi\nmở cái này lên đây và tôi

9539
09:14:16,711 --> 09:14:20,432
xem được rồi, giá trị bên trong này\n

9540
09:14:21,722 --> 09:14:26,222
0x123-- nó giống như một\ncon trỏ, một đường dẫn dẫn đường

9541
09:14:26,222 --> 09:14:28,022
từ vị trí này sang vị trí khác trong bộ nhớ.

9542
09:14:28,021 --> 09:14:30,521
Và trên thực tế, liệu ai đó ngồi gần đó ở đằng kia--

9543
09:14:30,521 --> 09:14:33,121
bạn có phiền khi nhận thư ở đó không?

9544
09:14:33,122 --> 09:14:35,942
Có tình nguyện viên nào tham gia phần này không?

9545
09:14:35,942 --> 09:14:38,292
Chỉ cần bạn truy cập\nhộp thư trước khi tôi làm vậy.

9546
09:14:40,832 --> 09:14:46,287
Ai có cử chỉ dữ dội nhất\nđi xuống.

9547
09:14:58,561 --> 09:15:01,441
Được rồi, hãy tới rìa của\n

9548
09:15:01,442 --> 09:15:05,162
nếu đây là p, nghĩa là\n, nhưng để làm rõ

9549
09:15:05,161 --> 09:15:07,981
điều chúng ta đang nói đến khi\nchúng ta đang lưu trữ 0x bất kỳ giá trị nào--

9550
09:15:07,982 --> 09:15:11,132
như 0x123, về cơ bản nó\ntương đương với

9551
09:15:11,131 --> 09:15:13,862
có thể lấy ra thứ gì đó\nnhư thế này và chỉ

9552
09:15:13,862 --> 09:15:16,412
chỉ vào đó một cách trừu tượng\nhộp thư của bạn

9553
09:15:16,411 --> 09:15:20,671
hoặc nếu bạn thích,\nchỉ vào hộp thư--

9554
09:15:28,021 --> 09:15:30,182
Điều này giống như tôi\nchỉ vào hộp thư của bạn

9555
09:15:30,182 --> 09:15:32,224
và nếu bạn muốn tiếp tục\nmở hộp thư của mình

9556
09:15:32,224 --> 09:15:38,562
và tiết lộ cho đám đông biết\bên trong hộp thư của bạn có nhãn n là gì.

9557
09:15:43,961 --> 09:15:46,582
Chúng tôi có một chút căng thẳng về CS50 để giải quyết rắc rối của bạn.

9558
09:15:47,913 --> 09:15:50,621
Vì vậy, đó chỉ là để hiển thị hình ảnh\n

9559
09:15:50,622 --> 09:15:53,532
bởi vì nó có thể rất trừu tượng,\n

9560
09:15:53,531 --> 09:15:56,752
nói về địa chỉ và bộ nhớ và\n

9561
09:15:56,752 --> 09:15:59,669
Nhưng nếu bạn nghĩ đến việc chỉ đi bộ\n

9562
09:15:59,669 --> 09:16:02,622
phức tạp có rất nhiều\nhộp thư, những hộp thư đó

9563
09:16:02,622 --> 09:16:05,592
về cơ bản là một\nbộ nhớ lớn và mỗi

9564
09:16:05,591 --> 09:16:07,451
trong số những hộp thư đó có địa chỉ--

9565
09:16:07,451 --> 09:16:10,182
đây là căn hộ một, hai,\nba-- căn hộ 2 tỷ.

9566
09:16:10,182 --> 09:16:13,451
Và bên trong\nhộp thư đó có thể chứa bất cứ thứ gì

9567
09:16:13,451 --> 09:16:15,621
có thể được biểu diễn dưới dạng thông tin.

9568
09:16:15,622 --> 09:16:18,702
Nó có thể là một số\nnhư n, hoặc 50, hoặc nếu bạn

9569
09:16:18,701 --> 09:16:21,101
thích nó có thể là một\nsố đại diện

9570
09:16:21,101 --> 09:16:22,991
địa chỉ của hộp thư khác.

9571
09:16:22,991 --> 09:16:26,171
Và điều này thực sự giống như\nnếu bạn đã từng có một căn hộ hoặc bạn

9572
09:16:26,171 --> 09:16:28,991
và bố mẹ bạn đã chuyển đi\nđể có địa chỉ chuyển tiếp.

9573
09:16:28,991 --> 09:16:31,362
Giống như có\nBưu điện ở Mỹ

9574
09:16:31,362 --> 09:16:34,842
đặt một loại giấy nào đó\vào hộp thư cũ của bạn nói rằng

9575
09:16:34,841 --> 09:16:37,271
thực sự chuyển tiếp nó\nđến hộp thư khác đó.

9576
09:16:37,271 --> 09:16:39,641
Đó thực sự là tất cả những gì một con trỏ đang làm.

9577
09:16:39,641 --> 09:16:41,351
Suy cho cùng,\nit chỉ là một con số

9578
09:16:41,351 --> 09:16:43,691
nhưng đó là một con số\nđược sử dụng theo một cách khác

9579
09:16:43,692 --> 09:16:45,822
và đó là cú pháp\nmà chúng tôi đã giới thiệu

9580
09:16:45,822 --> 09:16:49,631
không chỉ int mà còn int star,\nđiều đó cho máy tính biết cách thực hiện

9581
09:16:49,631 --> 09:16:54,101
để xử lý con số đó theo\ncách hơi khác một chút.

9582
09:16:54,101 --> 09:16:57,201
Vậy có câu hỏi nào về điều này không?

9583
09:16:59,322 --> 09:17:01,739
ĐỐI TƯỢNG: Nếu bạn có một biến,\nnhư int c, [KHÔNG NGHE ĐƯỢC]..

9584
09:17:06,072 --> 09:17:08,052
DAVID J. Malan: Nếu tôi làm int c và--

9585
09:17:12,372 --> 09:17:14,502
Bằng n, vậy hãy để tôi\thực sự gõ nó ra.

9586
09:17:14,502 --> 09:17:16,631
Nếu tôi tự đặt cho mình\ndòng mã khác, hãy cho tôi biết

9587
09:17:16,631 --> 09:17:22,612
gõ lần cuối cùng cái gì.\nint bằng n, như thế này à?

9588
09:17:22,612 --> 09:17:27,311
Thế này được rồi, nhưng tôi không thể vẽ nó\n

9589
09:17:27,311 --> 09:17:31,542
nhưng điều này sẽ giống như tạo một cái khác\n

9590
09:17:31,542 --> 09:17:35,592
ở dưới đây, lưu trữ bản sao giống hệt 50

9591
09:17:35,591 --> 09:17:38,741
bởi vì toán tử gán\n

9592
09:17:39,561 --> 09:17:43,031
Như vậy sẽ chỉ cần thêm một\nhình chữ nhật nữa có kích thước bốn

9593
09:17:45,752 --> 09:17:47,732
Nếu tôi trả lời\ncâu hỏi của bạn như dự định.

9594
09:17:47,732 --> 09:17:52,592
Được rồi, đó là cách sử dụng phong cách\n trong tuần đầu tiên

9595
09:17:52,591 --> 09:17:55,411
Tuy nhiên, tôi có thể bắt đầu sao chép\ncon trỏ nhưng một lần nữa, chúng ta sẽ

9596
09:17:55,411 --> 09:17:57,241
quay trở lại với một số sự phức tạp đó.

9597
09:17:58,781 --> 09:18:00,281
KHÁN GIẢ: Đó là một câu hỏi hay.

9598
09:18:02,201 --> 09:18:05,444
con trỏ đó có trỏ\nvào bản sao mới không?

9599
09:18:05,444 --> 09:18:06,862
DAVID J. Malan: À, câu hỏi hay.

9600
09:18:07,766 --> 09:18:12,461
Và để lặp lại trước camera, nếu tôi\n

9601
09:18:12,461 --> 09:18:16,631
int c bằng n, và tôi khẳng định không có\n

9602
09:18:16,631 --> 09:18:20,551
rằng điều này mang lại cho tôi một hình chữ nhật khác,\n

9603
09:18:22,042 --> 09:18:24,402
Và đây là điều quan trọng\nvà thực sự đặc trưng

9604
09:18:24,402 --> 09:18:28,362
của C. Không có gì xảy ra\ntự động với bạn.

9605
09:18:28,362 --> 09:18:31,942
p sẽ không được cập nhật\trừ khi bạn cập nhật p theo cách nào đó

9606
09:18:31,942 --> 09:18:34,482
vì vậy việc tạo một biến\nthứ ba được gọi là c-- thậm chí

9607
09:18:34,482 --> 09:18:36,882
nếu bạn đang sao chép giá trị\n của nó từ phải sang trái

9608
09:18:36,881 --> 09:18:40,061
điều đó không ảnh hưởng đến\nbất cứ điều gì khác trong chương trình.

9609
09:18:41,391 --> 09:18:47,561
Vậy có lẽ chúng ta đã thấy gì\n

9610
09:18:47,561 --> 09:18:51,581
À, nhớ lại là chúng ta đã nói chuyện khá nhiều\n

9611
09:18:51,582 --> 09:18:57,461
để tóm tắt lại theo cách nói của người bình thường,\n là gì

9612
09:18:57,461 --> 09:18:59,551
Vì vậy, nói-- à, hãy để tôi\nxác nhận một cách cụ thể ở đây.

9613
09:19:02,286 --> 09:19:03,661
ĐỐI TƯỢNG: Một mảng các ký tự.

9614
09:19:06,332 --> 09:19:09,122
Một loạt các ký tự, và chúng tôi--

9615
09:19:09,122 --> 09:19:12,242
Tôi đã xác nhận-- hoặc đã tiết lộ vào tuần trước\nchuỗi đó không đúng về mặt kỹ thuật

9616
09:19:12,241 --> 09:19:15,511
một tính năng được tích hợp trong C. Đây\nkhông phải là kiểu dữ liệu chính thức

9617
09:19:15,512 --> 09:19:17,762
nhưng mọi lập trình viên\n hầu hết mọi ngôn ngữ

9618
09:19:17,762 --> 09:19:21,002
đề cập đến chuỗi\nký tự-- từ, chữ cái

9619
09:19:22,811 --> 09:19:26,131
Vì vậy, ngôn ngữ bản địa tồn tại nhưng\nkiểu dữ liệu thường không

9620
09:19:26,131 --> 09:19:29,471
tồn tại tự nó trong C. Vậy\nchúng ta sắp làm gì, nếu bạn muốn

9621
09:19:29,472 --> 09:19:32,311
để có hiệu ứng ấn tượng, hôm nay chúng tôi sẽ tháo một số bánh xe phụ.

9622
09:19:32,311 --> 09:19:36,811
Thư viện CS50 được triển khai trong\n

9623
09:19:36,811 --> 09:19:38,941
chúng tôi khẳng định đã có rất nhiều thứ trong đó.

9624
09:19:38,942 --> 09:19:42,122
Nguyên mẫu cho GetString,\nnguyên mẫu cho GetInt

9625
09:19:42,122 --> 09:19:44,641
và tất cả những\nchức năng khác, nhưng hóa ra

9626
09:19:44,641 --> 09:19:48,841
nó cũng là cái định nghĩa "chuỗi"\nword theo cách như vậy

9627
09:19:48,841 --> 09:19:51,341
rằng tất cả các bạn đều có thể sử dụng nó\ntrong vài tuần qua.

9628
09:19:51,341 --> 09:19:54,002
Vì vậy chúng ta hãy xem một\nví dụ về một chuỗi đang được sử dụng.

9629
09:19:54,002 --> 09:19:56,042
Ví dụ ở đây\nmột đoạn mã nhỏ

9630
09:19:56,042 --> 09:20:00,781
sử dụng từ "chuỗi,"\ntạo một biến có tên là s

9631
09:20:00,781 --> 09:20:03,443
và sau đó lưu trữ trích dẫn\nunquote, xin chào, dấu chấm than.

9632
09:20:03,444 --> 09:20:06,152
Hãy xem xét nó trông như thế nào\n

9633
09:20:06,152 --> 09:20:08,902
Tôi không quan tâm đến tất cả những thứ khác\n

9634
09:20:08,902 --> 09:20:11,912
và cái này của tuần trước là\ncách lưu trữ "xin chào".

9635
09:20:11,911 --> 09:20:14,671
h-i dấu chấm than và sau đó\không còn nữa, như ai đó đã có

9636
09:20:14,671 --> 09:20:18,511
được quan sát thấy, giá trị trọng điểm đó--\nký tự null đó

9637
09:20:18,512 --> 09:20:21,919
chỉ có nghĩa là tám bit 0 để\nphân định phần cuối của chuỗi đó

9638
09:20:21,919 --> 09:20:24,002
đề phòng trường hợp có\nthứ gì đó ở bên phải nó

9639
09:20:24,002 --> 09:20:27,162
bây giờ máy tính có thể phân biệt được\n chuỗi này với chuỗi khác.

9640
09:20:27,161 --> 09:20:30,364
Vì vậy, tuần trước chúng tôi đã giới thiệu\ncú pháp mới này.

9641
09:20:30,364 --> 09:20:32,281
Vâng, nếu chuỗi\nchỉ là mảng ký tự

9642
09:20:32,281 --> 09:20:35,192
khi đó bạn có thể khéo léo sử dụng\nký hiệu dấu ngoặc vuông đó

9643
09:20:35,192 --> 09:20:39,992
và đi đến vị trí số 0 hoặc một\hoặc hai, giống như địa chỉ

9644
09:20:39,991 --> 09:20:41,792
nhưng chúng liên quan đến chuỗi.

9645
09:20:41,792 --> 09:20:46,741
Giá trị này có thể là 0x123 hoặc 0x456,\nnhưng với ký hiệu khung này

9646
09:20:46,741 --> 09:20:49,741
số 0 luôn là phần đầu\n của chuỗi, số 1 là số tiếp theo

9647
09:20:49,741 --> 09:20:51,161
hai là tiếp theo, v.v.

9648
09:20:51,161 --> 09:20:55,921
Đó là cú pháp mảng\nđể lập chỉ mục cho một mảng.

9649
09:20:55,921 --> 09:20:58,832
Nhưng về mặt kỹ thuật, hôm nay chúng ta\ncó thể đi sâu hơn một chút--

9650
09:20:58,832 --> 09:21:05,101
về mặt kỹ thuật mà nói, nếu xin chào\n

9651
09:21:05,101 --> 09:21:11,072
có lý do là tôi đang ở\n

9652
09:21:14,072 --> 09:21:18,692
Bây giờ, tôi không quan tâm đến 123 mỗi giây,\n

9653
09:21:19,951 --> 09:21:23,461
Ngay cả ở dạng hex, nếu bạn chỉ thêm\none khi bạn bắt đầu ở 0x123

9654
09:21:23,461 --> 09:21:25,817
số tiếp theo là bốn,\nnăm, sáu ở cuối.

9655
09:21:25,817 --> 09:21:27,692
Tôi không phải lo lắng\nvề A, B và C

9656
09:21:27,692 --> 09:21:30,702
bởi vì tôi không tính\ncao như vậy trong ví dụ này.

9657
09:21:30,701 --> 09:21:34,891
Vì vậy, nếu đúng như vậy, và\nmáy tính của tôi thực sự

9658
09:21:34,891 --> 09:21:42,631
đặt từ xin chào vào bộ nhớ\n

9659
09:21:42,631 --> 09:21:45,362
Chính xác thì s if\na là gì vào cuối ngày

9660
09:21:45,362 --> 09:21:51,391
H-I dấu chấm than rỗng đang được lưu trữ--\n

9661
09:21:52,366 --> 09:21:54,241
Bây giờ tôi đã tháo\nbánh xe phụ đó ra

9662
09:21:54,241 --> 09:21:57,841
và cho bạn thấy H-I\điểm chấm than null thực sự ở đâu

9663
09:21:59,582 --> 09:22:03,572
Vâng, như mọi khi,\thực tế là một biến.

9664
09:22:03,572 --> 09:22:05,612
Ngay cả trong đoạn mã tôi\nđã đề xuất cách đây một lát

9665
09:22:05,612 --> 09:22:08,912
s rõ ràng là một kiểu dữ liệu\nđúng vậy, không đi kèm với C

9666
09:22:08,911 --> 09:22:11,461
nhưng thư viện của CS50 khiến nó tồn tại.

9667
09:22:11,461 --> 09:22:16,832
s là một biến kiểu chuỗi,\nvậy s ở đâu trong hình này?

9668
09:22:16,832 --> 09:22:20,792
Chà, hóa ra\ns có thể ở trên đây.

9669
09:22:20,792 --> 09:22:24,332
Một lần nữa, tôi chỉ vẽ nó ở bất cứ đâu\nđể thảo luận

9670
09:22:24,332 --> 09:22:28,502
nhưng s là một biến\ntheo dòng mã đó.

9671
09:22:28,502 --> 09:22:32,338
Tôi khẳng định những gì đang lưu trữ là 0x123.

9672
09:22:32,338 --> 09:22:35,671
Thực ra tôi không thực sự quan tâm đến những thứ này\n

9673
09:22:35,671 --> 09:22:40,951
s rõ ràng là, kể từ bây giờ, hôm nay,\n

9674
09:22:42,122 --> 09:22:44,672
Cụ thể, ký tự đầu tiên trong s.

9675
09:22:44,671 --> 09:22:46,771
Và đây là mảnh\ncuối cùng của câu đố.

9676
09:22:46,771 --> 09:22:50,341
Tuần trước chúng tôi đã có cách thông minh này\n

9677
09:22:50,341 --> 09:22:55,261
Chà, hóa ra những chuỗi đó là\n

9678
09:22:55,262 --> 09:22:59,222
dưới dạng một biến là một\ncon trỏ, bên trong nó

9679
09:22:59,222 --> 09:23:02,262
là địa chỉ của ký tự\nđầu tiên trong chuỗi.

9680
09:23:02,262 --> 09:23:05,312
Vì vậy, nếu s trỏ vào\nký tự đầu tiên và bạn

9681
09:23:05,311 --> 09:23:07,862
có thể tin tưởng vào dấu gạch chéo ngược zero\nis ở cuối chuỗi

9682
09:23:07,862 --> 09:23:13,451
đó thực sự là tất cả những gì bạn cần tìm\n

9683
09:23:14,891 --> 09:23:16,502
Vâng, hãy cụ thể hơn một chút.

9684
09:23:16,502 --> 09:23:20,162
Xét về bức tranh này, nếu tôi\n

9685
09:23:20,161 --> 09:23:25,322
hóa ra là suốt từ đó đến giờ\n

9686
09:23:25,322 --> 09:23:32,232
bán bí mật là bí danh của char star.

9687
09:23:34,752 --> 09:23:36,201
Vậy tại sao điều này lại có ý nghĩa?

9688
09:23:36,201 --> 09:23:39,441
Điều này vẫn hơi kỳ lạ,\nnhưng nếu trong ví dụ trước của chúng ta

9689
09:23:39,442 --> 09:23:43,031
chúng tôi đã có thể lưu trữ địa chỉ của\n

9690
09:23:45,192 --> 09:23:48,042
à, nếu bây giờ chuỗi\nang chỉ là địa chỉ

9691
09:23:48,042 --> 09:23:53,472
của ký tự đầu tiên trong một chuỗi, sau đó\n

9692
09:23:53,472 --> 09:23:57,222
bởi vì điều đó có nghĩa s là\nđịa chỉ của một ký tự, chính

9693
09:23:57,222 --> 09:23:58,822
ký tự đầu tiên trong chuỗi.

9694
09:23:58,822 --> 09:24:02,802
Bây giờ, chuỗi có thể có ba chữ cái\n

9695
09:24:02,802 --> 09:24:04,932
nếu đó là một đoạn văn dài\nnhưng không sao

9696
09:24:04,932 --> 09:24:06,849
bởi vì bạn có thể tin tưởng\nrằng sẽ có

9697
09:24:06,849 --> 09:24:08,542
ký tự null đó ở cuối.

9698
09:24:08,542 --> 09:24:12,281
Vì vậy đây là mục đích chung\ncách biểu diễn chuỗi

9699
09:24:12,281 --> 09:24:15,402
sử dụng cơ chế mới này trong C.

9700
09:24:15,402 --> 09:24:18,582
Vì vậy, trên thực tế, hãy để tôi tiếp tục\nở đây và giới thiệu có lẽ

9701
09:24:18,582 --> 09:24:20,421
một vài thao tác này.

9702
09:24:20,421 --> 09:24:24,191
Hãy để tôi quay lại mã của tôi ở đây, và\n

9703
09:24:24,192 --> 09:24:27,742
và bây giờ chúng ta hãy\nlàm ví dụ như thế này.

9704
09:24:27,741 --> 09:24:32,743
Hãy để tôi thêm vào thư viện CS50,\nvì vậy bây giờ chúng tôi sẽ bao gồm CS50.H.

9705
09:24:32,743 --> 09:24:34,451
Tôi sẽ tiếp tục\nvà vào bên trong phần chính

9706
09:24:34,451 --> 09:24:37,331
tạo cho mình một chuỗi s\nequals hi dấu chấm than.

9707
09:24:37,332 --> 09:24:38,982
Tôi không gõ dấu gạch chéo ngược bằng 0.

9708
09:24:38,982 --> 09:24:43,589
C tự động thực hiện điều đó cho tôi bằng cách\n

9709
09:24:43,588 --> 09:24:45,171
Bây giờ hãy để tôi tiếp tục và in nó.

9710
09:24:45,171 --> 09:24:48,341
Vậy đây lại là nội dung phong cách của tuần 1\n

9711
09:24:49,972 --> 09:24:55,122
Vậy hãy để tôi tạo địa chỉ, Enter,\n

9712
09:24:56,752 --> 09:25:00,701
Nhưng hãy bắt đầu bóc lại\nmột số lớp này ở đây.

9713
09:25:00,701 --> 09:25:04,721
Trước hết hãy để tôi thoát khỏi\nthư viện CS50 trong giây lát

9714
09:25:04,722 --> 09:25:09,012
và để tôi đổi chuỗi thành char star.

9715
09:25:09,012 --> 09:25:11,262
Và điều đó hơi kỳ lạ\nnhưng đúng vậy, quy ước

9716
09:25:11,262 --> 09:25:15,260
là nói char, một khoảng trắng, sau đó là\n

9717
09:25:16,302 --> 09:25:19,052
Tuy nhiên, nói đúng ra, bạn có thể\n

9718
09:25:19,052 --> 09:25:22,032
làm như thế này hoặc như thế này\nnhưng theo cách chuẩn

9719
09:25:22,031 --> 09:25:23,811
thường làm như vậy.

9720
09:25:23,811 --> 09:25:26,671
Vậy là bây giờ không còn thư viện CS50 nữa, không\n

9721
09:25:26,671 --> 09:25:29,182
Tôi chỉ đang xử lý các chuỗi\n về bản chất thực sự của chúng.

9722
09:25:29,182 --> 09:25:32,381
Hãy để tôi tiếp tục và\ntạo địa chỉ, Enter--

9723
09:25:32,381 --> 09:25:34,542
cho đến nay rất tốt-- ./address--

9724
09:25:36,012 --> 09:25:40,211
Vậy %s là thứ đi kèm với printf\n

9725
09:25:40,211 --> 09:25:44,262
thuật ngữ nhưng nói đúng ra\n

9726
09:25:44,262 --> 09:25:48,582
Nó luôn luôn là ngôi sao char,\nvậy điều này có nghĩa là bây giờ tôi

9727
09:25:48,582 --> 09:25:52,122
có thể bắt đầu thấy vui\nvới những ý tưởng cơ bản này

9728
09:25:52,122 --> 09:25:55,252
mặc dù điều này không có mục đích\n

9729
09:25:55,252 --> 09:25:59,262
Nhưng nếu là thế này-- hãy để tôi quay lại\n

9730
09:25:59,262 --> 09:26:01,752
Hãy đặt những bánh xe tập luyện đó\ntrở lại trong giây lát

9731
09:26:01,752 --> 09:26:04,582
để tôi có thể thực hiện\nthao tác một lần.

9732
09:26:04,582 --> 09:26:07,492
Đây là chuỗi s của tôi, như trước đây.

9733
09:26:07,491 --> 09:26:10,542
Vâng, hãy để tôi tiếp tục và\nkhai báo một char có tên là c

9734
09:26:10,542 --> 09:26:15,582
và để tôi lưu ký tự đầu tiên\n

9735
09:26:15,582 --> 09:26:18,252
s ngoặc bằng 0 và\nđiều đó sẽ cho tôi h.

9736
09:26:18,252 --> 09:26:21,311
Và sau đó để bắt đầu, hãy\ntôi tiếp tục và làm char star--

9737
09:26:21,311 --> 09:26:28,421
rất tiếc-- để tôi tiếp tục và làm\nchar sao p bằng ký hiệu và c

9738
09:26:28,421 --> 09:26:30,851
và xem cái này thực sự in ra cái gì cho tôi.

9739
09:26:30,851 --> 09:26:34,222
Hãy để tôi tiếp tục và\nin ra p ở đây là gì.

9740
09:26:34,222 --> 09:26:35,452
Vì thế chúng tôi chỉ chơi đùa thôi.

9741
09:26:35,451 --> 09:26:39,041
Vì vậy hãy tạo địa chỉ-- cho đến nay\nrất tốt-- ./address.

9742
09:26:39,042 --> 09:26:41,381
Được rồi, vậy tôi vừa làm gì thế?

9743
09:26:41,381 --> 09:26:46,511
Tôi vừa tạo một ký tự c và\nlưu trong đó chữ H, ký tự này

9744
09:26:46,512 --> 09:26:50,891
giống với dấu ngoặc I, thì\n

9745
09:26:50,891 --> 09:26:53,752
và đó rõ ràng là 0x7FF.

9746
09:26:55,002 --> 09:26:57,201
Nhưng về mặt kỹ thuật, tôi không phải làm điều đó.

9747
09:26:57,201 --> 09:26:59,002
Bây giờ hãy để tôi tiếp tục và làm hai việc.

9748
09:26:59,002 --> 09:27:07,362
Thay vì chỉ in p, hãy để tôi đi\n

9749
09:27:07,362 --> 09:27:09,822
Hãy để tôi tiếp tục và\ntạo địa chỉ, Enter--

9750
09:27:09,822 --> 09:27:12,972
cho đến nay rất tốt-- ./address và--

9751
09:27:12,972 --> 09:27:15,732
chết tiệt, tôi đã làm gì sai.

9752
09:27:15,732 --> 09:27:17,562
Ôi chết tiệt, tôi không hề muốn làm điều đó.

9753
09:27:17,561 --> 09:27:21,141
Ôi, tôi thực sự đã làm hỏng chuyện này.

9754
09:27:23,921 --> 09:27:27,191
Điều đó lẽ ra phải ấn tượng\nnhưng thực tế lại ngược lại.

9755
09:27:30,682 --> 09:27:34,542
Vậy nếu tôi định làm điều này,\ntại sao dòng 9 và 10 lại

9756
09:27:36,822 --> 09:27:40,002
Tôi thực sự không có ý định đến đây,\nnhưng hãy để tôi cố gắng lưu lại điều này.

9757
09:27:40,002 --> 09:27:47,351
Tại sao chúng ta lại thấy các địa chỉ khác nhau,\n

9758
09:27:55,482 --> 09:27:57,932
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC]\nis ký tự c là

9759
09:27:57,932 --> 09:28:02,832
loại vị trí riêng của nó\ncủa [KHÔNG NGHE ĐƯỢC]

9760
09:28:02,832 --> 09:28:04,874
và nó chỉ lấy đi\ncác giá trị [KHÔNG NGHE ĐƯỢC]..

9761
09:28:05,874 --> 09:28:08,045
Vì vậy nếu tôi thực sự muốn\ntìm cách thoát khỏi chuyện này

9762
09:28:08,044 --> 09:28:10,711
đây là câu trả lời tuyệt vời cho\ncâu hỏi trước đó về

9763
09:28:10,711 --> 09:28:15,451
nếu tôi giới thiệu một biến khác thì sao,\n

9764
09:28:15,451 --> 09:28:18,151
và trong trường hợp này không phải là một\nint mà là một char thực sự.

9765
09:28:18,152 --> 09:28:23,641
Ở đây, tôi đã biến c thành một bản sao của\n

9766
09:28:24,741 --> 09:28:26,491
Vì vậy, nếu tôi vẽ\nit trên màn hình

9767
09:28:26,491 --> 09:28:30,631
sẽ cho tôi một\nhình chữ nhật khác trong đó bản sao của h

9768
09:28:32,042 --> 09:28:33,991
Vì vậy tôi không có ý định\nlàm điều này, nhưng bạn đang làm gì

9769
09:28:33,991 --> 09:28:35,978
đúng vậy, địa chỉ của s--

9770
09:28:35,978 --> 09:28:38,311
và rõ ràng đó là một\nđịa chỉ khá thấp theo mặc định

9771
09:28:38,311 --> 09:28:40,322
ở đây-- thì bạn\nthấy địa chỉ của c.

9772
09:28:40,322 --> 09:28:43,201
Nhưng mặc dù mỗi cái đều là h, tôi khẳng định

9773
09:28:43,201 --> 09:28:45,163
một cái ở một địa chỉ khác trong bộ nhớ.

9774
09:28:45,163 --> 09:28:46,621
Và điều này đã luôn xảy ra.

9775
09:28:46,622 --> 09:28:49,352
Bất cứ khi nào bạn tạo một biến\n

9776
09:28:49,351 --> 09:28:51,269
hoặc ở đây, hoặc ở đây, hoặc\nnơi nào khác trong bộ nhớ.

9777
09:28:51,269 --> 09:28:54,271
Bây giờ là lần đầu tiên tất cả chúng ta\n

9778
09:28:54,271 --> 09:28:57,731
bộ nhớ của máy tính để\nxem những gì thực sự ở đó.

9779
09:28:57,732 --> 09:29:01,382
Vậy hãy để tôi thực sự quay lại\nđiều này một chút

9780
09:29:01,381 --> 09:29:04,752
và làm những gì tôi định làm ở đây,\n

9781
09:29:04,752 --> 09:29:08,912
Vì vậy, nếu chuỗi s bằng quote\nunquote, xin chào, hãy tiếp tục

9782
09:29:08,911 --> 09:29:18,411
và tự cho mình một con trỏ, được gọi là\n

9783
09:29:18,411 --> 09:29:22,251
Được rồi, bây giờ hãy để tôi tiếp tục và\n

9784
09:29:24,394 --> 09:29:26,311
Vì vậy, chúng ta sẽ\nlàm từng việc một.

9785
09:29:26,311 --> 09:29:29,121
Vì vậy hãy tạo địa chỉ, Enter, ./address.

9786
09:29:29,122 --> 09:29:34,222
Ở đó, vào lúc này, là\n

9787
09:29:34,222 --> 09:29:36,141
Điều tôi định làm bây giờ là thế này.

9788
09:29:36,141 --> 09:29:39,082
Nếu tôi muốn in ra\nhai thứ lần này

9789
09:29:39,082 --> 09:29:44,752
để tôi in ra không chỉ p là gì,\n

9790
09:29:44,752 --> 09:29:48,771
Bởi vì nếu tôi khẳng định rằng mọi người từ\n

9791
09:29:48,771 --> 09:29:51,741
dấu ngoặc s bằng 0 chỉ đại diện\nký tự đầu tiên trong s

9792
09:29:51,741 --> 09:29:54,981
theo định nghĩa chuỗi\nlà mảng ký tự.

9793
09:29:54,982 --> 09:30:01,232
Vậy thì s, tính đến hôm nay, chính nó\nlà địa chỉ của một ký tự

9794
09:30:02,122 --> 09:30:06,082
Vì vậy, nếu bây giờ tôi thực hiện make\naddress và thực hiện ./address

9795
09:30:06,082 --> 09:30:08,842
lần này tôi thấy những điều tương tự.

9796
09:30:13,588 --> 09:30:16,171
Đây thực sự là điều tồi tệ nhất đáng được hoan nghênh

9797
09:30:16,171 --> 09:30:21,932
nhưng điều chúng tôi đang trình bày ở đây là\n

9798
09:30:21,932 --> 09:30:23,622
của ký tự đầu tiên trong c.

9799
09:30:23,622 --> 09:30:26,292
Vì vậy, nếu chúng ta mượn một số mô hình\ntinh thần của chúng ta từ tuần trước--

9800
09:30:26,292 --> 09:30:31,171
à, nếu dấu ngoặc số 0 là số đầu tiên\n

9801
09:30:31,171 --> 09:30:33,711
biểu thức đó phải giống như s.

9802
09:30:33,711 --> 09:30:36,211
Điều này không có nghĩa là chúng ta\nsẽ vượt qua những vòng này

9803
09:30:36,211 --> 09:30:40,411
lúc nào cũng có nhiều cú pháp thế này,\n

9804
09:30:40,411 --> 09:30:46,531
thực tế là như vậy, như tôi đã nói trong giây lát\n

9805
09:30:46,531 --> 09:30:50,012
Thậm chí không có nhiều ký tự, đó là\n

9806
09:30:50,012 --> 09:30:53,942
nhưng điều quan trọng là địa chỉ\n

9807
09:30:53,942 --> 09:30:57,182
và mỗi tuần trước chúng tôi\ntin rằng C sẽ hoạt động

9808
09:30:57,182 --> 09:31:00,241
để tìm ký tự null\n đó ở cuối cùng

9809
09:31:00,241 --> 09:31:04,081
để chắc chắn rằng nó biết\nchuỗi thực sự kết thúc ở đâu.

9810
09:31:04,082 --> 09:31:07,677
Được rồi, có một câu hỏi được đặt ra ở đây.

9811
09:31:21,942 --> 09:31:25,542
Tóm lại, trên dòng\neight, khi tôi đang sử dụng %p--

9812
09:31:25,542 --> 09:31:28,542
điều đó chỉ có nghĩa là in một con trỏ\ngiá trị, vậy 0x gì đó--

9813
09:31:30,942 --> 09:31:36,641
Trước đây, khi chúng ta sử dụng %s, printf đã biết\n

9814
09:31:36,641 --> 09:31:40,841
của s, nhưng h, i, dấu chấm than và\n

9815
09:31:41,982 --> 09:31:47,202
p thì khác. %p yêu cầu\nmáy tính đi tới địa chỉ đó--

9816
09:31:47,201 --> 09:31:52,072
xin lỗi, yêu cầu máy tính\nin địa chỉ đó lên màn hình.

9817
09:31:52,072 --> 09:31:55,122
Vì vậy, đây là lúc %s all\nlần này phát huy tác dụng mạnh mẽ.

9818
09:31:55,122 --> 09:31:59,322
Lý do printf hoạt động\ntuần 1, 2 và 3

9819
09:31:59,322 --> 09:32:02,622
là bởi vì printf đã được thiết kế\nbởi con người cách đây vài năm

9820
09:32:02,622 --> 09:32:05,652
để đi tới địa chỉ\nđang được chuyển vào-- chẳng hạn

9821
09:32:05,652 --> 09:32:07,991
s-- và in ra\nký tự nối tiếp ký tự khác

9822
09:32:07,991 --> 09:32:11,652
sau ký tự cho đến khi nó nhìn thấy dấu gạch chéo ngược của ký tự\nnull bằng 0

9823
09:32:13,252 --> 09:32:16,841
Vậy đó là-- bạn đang nhận được rất nhiều\n

9824
09:32:16,841 --> 09:32:19,271
Hôm nay chúng ta đang sử dụng\nthứ gì đó đơn giản hơn nhiều, %p

9825
09:32:19,271 --> 09:32:22,572
mà chỉ in theo nghĩa đen s là gì.

9826
09:32:22,572 --> 09:32:24,311
Và lý do chúng ta\nkhông làm điều này trong tuần 1

9827
09:32:24,311 --> 09:32:26,381
chỉ là vì điều này\nis thích quá nhiều

9828
09:32:26,381 --> 09:32:28,381
sẽ rất thú vị khi\ntất cả những gì bạn muốn in ra

9829
09:32:28,381 --> 09:32:29,901
là xin chào hoặc xin chào, thế giới, hoặc tương tự.

9830
09:32:29,902 --> 09:32:31,872
Nhưng bây giờ điều chúng tôi\nthực sự đang làm là tiết lộ

9831
09:32:31,872 --> 09:32:34,302
chuyện gì đã xảy ra suốt thời gian qua.

9832
09:32:34,302 --> 09:32:36,039
Và hãy để tôi làm một ví dụ khác ở đây.

9833
09:32:36,038 --> 09:32:37,871
Hãy để tôi tiếp tục và loại bỏ biến này

9834
09:32:37,872 --> 09:32:41,262
đây và để tôi in ra\n

9835
09:32:41,262 --> 09:32:45,492
Tôi sẽ in ra không chỉ s\n

9836
09:32:46,542 --> 09:32:48,432
địa chỉ của mỗi ký tự trong s.

9837
09:32:48,432 --> 09:32:52,713
Vì vậy, hãy lấy chữ cái đầu tiên\nin s và lấy địa chỉ của nó

9838
09:32:52,713 --> 09:32:54,671
và tôi sẽ sao chép\ndán cho có thời gian

9839
09:32:54,671 --> 09:32:57,881
nhưng không phải là điều tôi sẽ làm thường xuyên.

9840
09:32:57,881 --> 09:33:01,394
Vậy để tôi in ra địa chỉ của\n

9841
09:33:01,394 --> 09:33:03,311
cái thứ ba, và thậm chí cả cái thứ tư, mà

9842
09:33:03,311 --> 09:33:06,682
là dấu gạch chéo ngược bằng 0, bằng cách thực hiện điều này.

9843
09:33:06,682 --> 09:33:11,292
Vì thế khi tôi biên soạn chương trình này--\ntạo địa chỉ, ./address--

9844
09:33:11,292 --> 09:33:14,802
Tôi sẽ thấy hai giá trị\ngiống hệt nhau và sau đó

9845
09:33:14,802 --> 09:33:17,292
các giá trị bổ sung\ncách đó một byte.

9846
09:33:17,292 --> 09:33:22,932
Trong sơ đồ của tôi lúc trước, địa chỉ của tôi\n

9847
09:33:22,932 --> 09:33:29,201
Bây giờ, tình cờ, nó bắt đầu tại\n0x402004, tức là s.

9848
09:33:29,201 --> 09:33:32,741
0x402004 cũng giống như vậy\na vì tôi chỉ

9849
09:33:32,741 --> 09:33:35,351
nói hãy đi đến ký tự đầu tiên\nvà sau đó lấy địa chỉ của nó.

9850
09:33:35,351 --> 09:33:36,851
Đó là một trong những điều tương tự bây giờ.

9851
09:33:36,851 --> 09:33:42,762
Và sau đó\nis 0x402005, 006, 007

9852
09:33:42,762 --> 09:33:44,542
vì nó giống như sơ đồ

9853
09:33:44,542 --> 09:33:48,342
Đi tới chữ i, đến dấu chấm than\n

9854
09:33:48,341 --> 09:33:51,252
Vì vậy, tất cả những gì tôi đang làm bây giờ là sử dụng sự hiểu biết\nmới tìm thấy của mình về những gì

9855
09:33:51,252 --> 09:33:54,612
dấu và làm gì và ngôi sao\n

9856
09:33:54,612 --> 09:33:57,510
Tôi đang tìm kiếm\nbộ nhớ của máy tính.

9857
09:33:57,510 --> 09:33:59,052
Chỉ để chứng minh rằng không có phép thuật nào cả.

9858
09:33:59,052 --> 09:34:02,022
Tất cả đều có chủ ý\nbởi vì tôi hoặc printf hoặc ai đó

9859
09:34:11,254 --> 09:34:12,921
DAVID J. Malan: Khả năng quan sát thực sự tốt.

9860
09:34:12,921 --> 09:34:16,432
Vậy ra đúng là như vậy\nxin chào, không giống như 50

9861
09:34:16,432 --> 09:34:21,652
đang kết thúc ở một địa chỉ rất thấp,\n

9862
09:34:21,652 --> 09:34:24,622
Đó thực sự là bởi vì,\nnói tóm lại, các chuỗi

9863
09:34:24,622 --> 09:34:27,592
thường được lưu trữ ở một phần\nkhác của bộ nhớ máy tính--

9864
09:34:27,591 --> 09:34:29,691
sẽ nói thêm về điều đó sau\nhôm nay-- để đạt hiệu quả.

9865
09:34:29,692 --> 09:34:32,902
Thực ra sẽ chỉ có một\n

9866
09:34:32,902 --> 09:34:36,182
điểm và máy tính sẽ\n

9867
09:34:36,182 --> 09:34:39,112
nhưng các giá trị khác như\nints và float và

9868
09:34:39,112 --> 09:34:41,752
giống như-- chúng có dung lượng bộ nhớ\nin thấp hơn theo quy ước.

9869
09:34:41,752 --> 09:34:45,002
Nhưng đây là một quan sát tốt vì\nđiều đó nhất quán ở đây.

9870
09:34:45,002 --> 09:34:48,472
Được rồi, vậy một vài chi tiết cuối cùng\n

9871
09:34:48,472 --> 09:34:54,052
Hãy để tôi tiếp tục và khẳng định rằng\nchúng tôi đã triển khai char star--

9872
09:34:54,052 --> 09:34:56,752
hay đúng hơn là xâu chuỗi dưới dạng ngôi sao\nchar như sau.

9873
09:34:56,752 --> 09:34:59,091
Tính đến tuần trước, chúng tôi đã viết mã này.

9874
09:34:59,091 --> 09:35:03,322
Kể từ tuần này, chúng ta có thể bắt đầu\n

9875
09:35:03,322 --> 09:35:06,902
cụ thể là chúng tôi đã phát minh ra thư viện CS50.

9876
09:35:06,902 --> 09:35:10,252
Nhưng hóa ra bạn đã nhìn thấy một con đường\n

9877
09:35:11,991 --> 09:35:16,222
Lần trước chúng tôi đã chơi đùa với dữ liệu\n

9878
09:35:16,222 --> 09:35:20,002
và tóm tắt từ khóa typedef,\nxác định loại cho bạn.

9879
09:35:20,002 --> 09:35:22,012
Và nếu tôi nhấn mạnh\nđiều thú vị ở đây

9880
09:35:22,012 --> 09:35:25,702
theo cách chúng tôi đã phát minh ra kiểu dữ liệu\nngười lần trước

9881
09:35:25,701 --> 09:35:28,761
là để xác định một người có\nhai biến bên trong nó--

9882
09:35:28,762 --> 09:35:33,959
một cấu trúc bao bọc một\ntên và bao bọc một số.

9883
09:35:33,959 --> 09:35:37,042
Bây giờ mặc dù cú pháp hơi khó hiểu\n

9884
09:35:37,042 --> 09:35:43,131
điều này, hãy lưu ý rằng đây có thể là một\n

9885
09:35:43,131 --> 09:35:47,421
Nếu tôi muốn tạo một loại có tên\n

9886
09:35:47,421 --> 09:35:51,591
sau đó tôi sử dụng typedef để tạo\nit được xác định là char star.

9887
09:35:51,591 --> 09:35:55,311
Vì vậy, đây thực sự là tất cả\nnhững gì từng có trong CS50.h

9888
09:35:55,311 --> 09:35:58,131
ngoài những nguyên mẫu\ncủa chức năng mà chúng ta đã nói đến.

9889
09:35:58,131 --> 09:36:01,191
typedef char star string\nis là mã một dòng

9890
09:36:01,192 --> 09:36:05,919
điều đó làm cho chuỗi từ\nas trở thành một kiểu dữ liệu

9891
09:36:05,919 --> 09:36:07,502
và đó là tất cả những gì đã từng có ở đó.

9892
09:36:07,502 --> 09:36:10,641
Nhưng ngôi sao, ngôi sao char,\nis lại quá nhiều trong tuần 1.

9893
09:36:10,641 --> 09:36:14,031
Chúng ta đợi đến thời điểm này\nđể bóc lớp đó ra.

9894
09:36:14,031 --> 09:36:16,521
vậy có câu hỏi nào không,\không chuỗi là gì?

9895
09:36:16,521 --> 09:36:19,101
Ngôi sao hoặc ký hiệu đang làm gì?

9896
09:36:26,432 --> 09:36:30,031
Nếu đó là-- đó có phải là lý do tại sao khi bạn\n

9897
09:36:30,031 --> 09:36:34,031
đã hoặc gần như đã xảy ra vấn đề.

9898
09:36:34,031 --> 09:36:36,332
Và trên thực tế là có,\ntuần trước chúng tôi sử dụng str so sánh--

9899
09:36:36,332 --> 09:36:40,711
STRCMP-- rất có chủ ý\n

9900
09:36:40,711 --> 09:36:45,301
vô tình đã so sánh hai\n

9901
09:36:50,574 --> 09:36:53,531
Được rồi, trước khi chúng ta đưa ra\n

9902
09:36:53,531 --> 09:36:54,762
chúng tôi có rất nhiều mảnh giấy

9903
09:36:54,762 --> 09:36:57,552
Nếu có ai muốn lên và\n

9904
09:36:57,552 --> 09:36:59,562
nếu bạn muốn tự tạo\ntám lưới thứ gì đó

9905
09:36:59,561 --> 09:37:02,621
để chia sẻ với cả lớp nếu bạn\n

9906
09:37:02,622 --> 09:37:05,352
Nếu không, hãy dành 10 phút\nvà sẽ quay lại sau 10 phút.

9907
09:37:05,351 --> 09:37:10,271
Được rồi, hãy quay lại\ncâu hỏi này về cách

9908
09:37:10,271 --> 09:37:13,241
chúng ta có thể bắt đầu sử dụng những con trỏ này\n

9909
09:37:14,332 --> 09:37:16,572
Mục tiêu cuối cùng\nvào tuần tới sẽ là

9910
09:37:16,572 --> 09:37:20,292
sử dụng những địa chỉ này để thực sự\n

9911
09:37:20,292 --> 09:37:23,622
cấu trúc chứ không chỉ là con người,\nnhư tuần trước hoặc ứng cử viên

9912
09:37:23,622 --> 09:37:25,422
trong bối cảnh của một\thuật toán bầu cử

9913
09:37:25,421 --> 09:37:28,991
nếu bạn muốn và thực sự sử dụng\n

9914
09:37:28,991 --> 09:37:32,051
để thể hiện không chỉ\nhình ảnh mà còn có thể cả video

9915
09:37:32,052 --> 09:37:34,552
và các cấu trúc hai chiều\nkhác.

9916
09:37:34,552 --> 09:37:36,942
Nhưng bây giờ, hãy quay lại\nví dụ về địa chỉ này

9917
09:37:36,942 --> 09:37:41,922
ban đầu giảm xuống chỉ còn một lời chào,\n

9918
09:37:42,822 --> 09:37:45,762
Vì vậy, hãy để tôi thêm lại thư viện\nCS50 để chúng ta

9919
09:37:45,762 --> 09:37:49,391
hãy sử dụng từ đồng nghĩa của chúng tôi trong giây lát,\nđó là chuỗi từ

9920
09:37:49,391 --> 09:37:51,521
và tôi sẽ định nghĩa lại s dưới dạng một chuỗi.

9921
09:37:51,521 --> 09:37:54,191
Và điều tôi chưa đề cập trước đây\nis là những dấu ngoặc kép này

9922
09:37:54,192 --> 09:37:57,042
mà bạn đã sử dụng được một thời gian\n

9923
09:37:57,042 --> 09:38:00,281
Dấu ngoặc kép\na là đầu mối cho trình biên dịch

9924
09:38:00,281 --> 09:38:04,671
rằng cái ở giữa chúng\nthực tế là một chuỗi như chúng ta biết bây giờ

9925
09:38:04,671 --> 09:38:07,932
có nghĩa là trình biên dịch sẽ\nlàm tất cả công việc tìm ra

9926
09:38:07,932 --> 09:38:10,692
đặt h, the\ni, dấu chấm than ở đâu

9927
09:38:10,692 --> 09:38:13,722
và thậm chí còn tự động thêm cho bạn một dấu gạch chéo ngược bằng 0.

9928
09:38:13,722 --> 09:38:15,942
Và trình biên dịch\ncũng sẽ làm gì cho bạn

9929
09:38:15,942 --> 09:38:18,822
là tìm ra địa chỉ\nall của bốn ký tự đó

9930
09:38:18,822 --> 09:38:22,692
đã kết thúc và lưu trữ nó\ncho bạn trong biến s.

9931
09:38:22,692 --> 09:38:26,891
Vậy đó là lý do tại sao điều đó chỉ xảy ra với\n

9932
09:38:26,891 --> 09:38:31,271
hoặc thậm chí là ngôi sao một cách rõ ràng, nhưng ngôi sao\n

9933
09:38:31,271 --> 09:38:33,761
chuỗi chỉ đồng nghĩa\nbây giờ với char star.

9934
09:38:33,762 --> 09:38:37,732
Nó không thực sự dễ đọc,\nnhưng giờ đây nó có cùng ý tưởng.

9935
09:38:37,732 --> 09:38:40,272
Vì vậy tôi sẽ để lại chuỗi\nchỉ để làm việc gì đó trong tuần

9936
09:38:40,271 --> 09:38:43,941
1 phong cách ở đây một lát rồi bắt đầu\n

9937
09:38:43,942 --> 09:38:49,391
Vì vậy lần này tôi sẽ sử dụng %c, và\n

9938
09:38:49,391 --> 09:38:54,521
và sau đó tôi sẽ in ra\ns ngoặc một và s ngoặc hai

9939
09:38:54,521 --> 09:38:58,451
theo đúng nghĩa đen là thực hiện tuần thứ ba\ntheo phong cách từ tuần trước--

9940
09:38:58,451 --> 09:39:03,281
việc in mọi ký tự\nin s như thể nó là một mảng.

9941
09:39:03,281 --> 09:39:06,582
Vì vậy, ./address sẽ cho\ntôi dấu chấm than.

9942
09:39:06,582 --> 09:39:09,822
Và nếu tôi thực sự muốn\ntò mò, về mặt kỹ thuật mà nói

9943
09:39:09,822 --> 09:39:14,052
Tôi có thể in ra thêm một vị trí,\n

9944
09:39:14,052 --> 09:39:19,572
tạo địa chỉ ./address và có,\n

9945
09:39:19,572 --> 09:39:25,002
Tôi không nhìn thấy số 0 vì tôi đã không nhìn thấy\n

9946
09:39:25,002 --> 09:39:28,692
nghĩa đen là tám bit 0\n

9947
09:39:28,692 --> 09:39:30,322
nếu bạn muốn, hãy nói chuyện trong printf.

9948
09:39:30,322 --> 09:39:32,711
Và những gì tôi thấy ở đây\nis giống như một biểu tượng trống.

9949
09:39:32,711 --> 09:39:34,902
Điều đó chỉ có nghĩa là có\nthứ gì đó khác ở đó--

9950
09:39:34,902 --> 09:39:39,162
rõ ràng là tất cả đều có tám\n0 bit, nhưng chúng ở đó

9951
09:39:39,161 --> 09:39:41,931
mặc dù hiện tại chúng tôi không nhìn thấy chúng theo đúng nghĩa đen.

9952
09:39:41,932 --> 09:39:44,572
Nào, hãy tiếp tục và\nbóc lại một trong các lớp này

9953
09:39:44,572 --> 09:39:48,491
và để tôi tiếp tục và thoát khỏi\n

9954
09:39:48,491 --> 09:39:51,911
do đó, chuỗi từ vì\n

9955
09:39:53,262 --> 09:39:56,141
Bây giờ tôi sẽ thực hiện\ntạo địa chỉ, ./address

9956
09:39:56,141 --> 09:39:57,612
và đó chính xác là điều tương tự.

9957
09:39:57,612 --> 09:40:00,982
Và bây giờ, chúng ta hãy tập trung vào hi\n

9958
09:40:00,982 --> 09:40:05,772
Vì vậy tôi sẽ biên dịch lại lần cuối\n

9959
09:40:05,771 --> 09:40:10,361
Chà, hóa ra là ký hiệu\narray mà chúng ta đã sử dụng tuần trước

9960
09:40:10,362 --> 09:40:12,972
về mặt kỹ thuật là một số\nđường cú pháp này.

9961
09:40:12,972 --> 09:40:16,182
Một cách gọn gàng để sử dụng\nsyntax một cách hữu ích

9962
09:40:16,182 --> 09:40:21,792
nhưng hôm nay chúng ta có thể thấy rõ ràng hơn\n

9963
09:40:23,421 --> 09:40:25,161
Hãy để tôi tiếp tục và làm điều này.

9964
09:40:25,161 --> 09:40:30,401
Hãy để tôi mạo hiểm nói rằng tôi\nmuốn in ra dấu ngoặc not s

9965
09:40:30,402 --> 09:40:36,192
không, nhưng tôi muốn in ra\n

9966
09:40:36,192 --> 09:40:38,442
Vì vậy, để rõ ràng, bây giờ s là gì?

9967
09:40:38,442 --> 09:40:39,792
Đó là địa chỉ của một chuỗi.

9968
09:40:41,292 --> 09:40:44,802
s là địa chỉ của\nchar đầu tiên trong chuỗi

9969
09:40:44,802 --> 09:40:47,802
và một lần nữa, thế là đủ cho\n

9970
09:40:47,802 --> 09:40:50,722
máy tính sẽ thấy rằng có\n

9971
09:40:50,722 --> 09:40:56,601
Vậy cụ thể s là địa chỉ\n

9972
09:40:56,601 --> 09:40:59,652
Điều đó có nghĩa là, sử dụng cú pháp\nmới của tôi, nếu tôi muốn

9973
09:40:59,652 --> 09:41:02,944
để in ra\nký tự đầu tiên tôi có thể in ra dấu sao

9974
09:41:02,944 --> 09:41:06,834
s, bởi vì hãy nhớ rằng ngôi sao đó là\n

9975
09:41:06,834 --> 09:41:09,042
lặp lại từ char, bạn\nkhông lặp lại từ int--

9976
09:41:10,661 --> 09:41:13,181
Có nghĩa là đi đến địa chỉ đó.

9977
09:41:13,182 --> 09:41:18,012
Tương tự, nếu tôi, với kiến thức\nmới tìm thấy về cách hoạt động của chuỗi

9978
09:41:18,012 --> 09:41:21,641
biết rằng chữ h đứng trước,\nsau đó là chữ i

9979
09:41:21,641 --> 09:41:25,512
sau đó là dấu chấm than, sau đó\n

9980
09:41:25,512 --> 09:41:29,292
cách nhau một byte, tôi có thể\nbắt đầu thực hiện một số phép tính.

9981
09:41:29,292 --> 09:41:34,932
Tôi có thể đi đến s cộng 1 byte và\nin ra ký tự thứ hai

9982
09:41:34,932 --> 09:41:38,682
và tôi có thể in ra\nbất cứ thứ gì ở s cộng 2--

9983
09:41:38,682 --> 09:41:41,951
trên thực tế, đang thực hiện những gì thường được gọi là số học con trỏ.

9984
09:41:41,951 --> 09:41:44,951
Theo nghĩa đen, xử lý các con trỏ\nas các con số--

9985
09:41:44,951 --> 09:41:48,191
thập lục phân hoặc thập phân, thực sự không phải vậy\n

9986
09:41:48,192 --> 09:41:51,022
Và tiếp tục thêm\none byte hoặc hai byte

9987
09:41:51,021 --> 09:41:53,511
để họ bắt đầu ở\nđầu một chuỗi

9988
09:41:53,512 --> 09:41:56,192
và chỉ cần chọc từ trái sang phải.

9989
09:41:56,192 --> 09:42:00,262
Vì vậy, điều này bây giờ tương đương với những gì chúng ta\n

9990
09:42:00,262 --> 09:42:05,031
ký hiệu, nhưng bây giờ tôi đang triển khai lại\n

9991
09:42:05,031 --> 09:42:09,182
hệ thống ống nước, hiểu ký hiệu\n

9992
09:42:09,182 --> 09:42:11,961
vì vậy nếu tôi làm lại\nchương trình này và thực hiện ./address

9993
09:42:11,961 --> 09:42:14,489
Tôi vẫn thấy\nh-i dấu chấm than.

9994
09:42:14,489 --> 09:42:16,822
Nhưng điều tôi thực sự đang làm\nchỉ là thể hiện

9995
09:42:16,822 --> 09:42:20,211
hy vọng là sự hiểu biết của tôi\no về điều gì thực sự

9996
09:42:20,211 --> 09:42:22,072
đang diễn ra trong bộ nhớ của máy tính.

9997
09:42:22,072 --> 09:42:24,591
Bây giờ, những lập trình viên\ncó lẽ đang cố gắng thể hiện

9998
09:42:24,591 --> 09:42:25,971
thực sự có thể viết cú pháp này.

9999
09:42:25,972 --> 09:42:28,597
Tôi nghĩ cú pháp phổ biến hơn\nsẽ là những gì chúng ta đã làm tuần trước--

10000
09:42:28,597 --> 09:42:30,332
s ngoặc 0, s ngoặc 1.

10001
09:42:30,832 --> 09:42:32,707
Nó chỉ dễ đọc hơn một chút và chúng tôi thì không

10002
09:42:32,707 --> 09:42:36,891
cần phải khoe khoang hoặc quan tâm đến\nsự thể hiện cơ bản này.

10003
09:42:36,891 --> 09:42:39,771
Dấu ngoặc vuông tuần trước\nchúng tôi là một sự trừu tượng, nếu bạn muốn

10004
09:42:39,771 --> 09:42:42,081
bên cạnh môn toán cấp độ thấp hơn là gì.

10005
09:42:42,082 --> 09:42:44,722
Nhưng đó là tất cả những gì đang diễn ra\non bên dưới mui xe.

10006
09:42:44,722 --> 09:42:48,171
Chúng tôi đang tìm kiếm từ\nbyte này sang byte khác.

10007
09:42:48,171 --> 09:42:53,582
Được rồi, hãy để tôi tạm dừng ở đây, xem liệu\n

10008
09:42:56,292 --> 09:42:59,012
Hãy làm thêm một lần nữa,\nđể chứng minh rằng đây không phải là

10009
09:43:00,531 --> 09:43:02,521
Hãy để tôi tiếp tục và\ngloại bỏ tất cả những điều này

10010
09:43:02,521 --> 09:43:06,901
và để tôi tự cho mình một dãy số như tôi đã làm tuần trước.

10011
09:43:06,902 --> 09:43:09,182
Vậy nếu tôi định\nkhai báo tất cả các con số

10012
09:43:09,182 --> 09:43:11,881
cùng một lúc bằng cách sử dụng ký hiệu dấu ngoặc nhọn\ncurly ngộ nghĩnh này

10013
09:43:11,881 --> 09:43:15,331
Tôi có thể làm như 4, 6, 8, 2, 7, 5, 0.

10014
09:43:15,332 --> 09:43:19,412
Vậy là có bảy số khác nhau bên trong\n

10015
09:43:20,432 --> 09:43:22,491
Nói đúng ra thì tôi không cần phải nói là bảy.

10016
09:43:22,491 --> 09:43:24,241
Trình biên dịch thông minh\đủ để tìm ra

10017
09:43:24,241 --> 09:43:26,612
tôi đặt bao nhiêu số\nvới dấu phẩy giữa chúng

10018
09:43:26,612 --> 09:43:31,112
và điều đó chỉ cho tôi một mảng\nchứa 4, 6, 8, 2, 7, 5, 0.

10019
09:43:31,112 --> 09:43:34,561
Vậy hóa ra tôi có thể in từng cái\n

10020
09:43:34,561 --> 09:43:40,381
Tôi có thể in ra %i dấu gạch chéo ngược n,\n

10021
09:43:40,381 --> 09:43:44,401
và để tôi thực hiện vài thao tác sao chép/dán nhanh\n

10022
09:43:44,402 --> 09:43:49,241
Về mặt lý thuyết, nó sẽ in ra 4, 6, 8, v.v.

10023
09:43:49,241 --> 09:43:52,381
Nhưng tôi có thể thực hiện cùng một cách hiểu\n cách thao tác

10024
09:43:52,381 --> 09:43:55,292
con trỏ bây giờ là gì,\nsử dụng số học con trỏ.

10025
09:43:55,292 --> 09:43:59,101
Vậy hãy để tôi thực sự giải quyết vấn đề này\nvà quay lại một bản in

10026
09:43:59,101 --> 09:44:02,551
và thay vì in dấu ngoặc số\n

10027
09:44:02,552 --> 09:44:06,722
để tôi đi và in ra\nbất cứ thứ gì ở địa chỉ đó--

10028
09:44:08,792 --> 09:44:11,222
Để tôi in ra\nchữ số thứ hai, đó là

10029
09:44:11,222 --> 09:44:16,412
sẽ là bất cứ thứ gì ở số\n

10030
09:44:16,411 --> 09:44:20,381
và làm bất cứ điều gì ở số cộng 2,\n

10031
09:44:20,381 --> 09:44:22,621
hãy để tôi làm điều đó thêm bốn lần\nlần nữa và làm những gì

10032
09:44:22,622 --> 09:44:27,242
ở vị trí ba, bốn, năm và sáu.

10033
09:44:27,241 --> 09:44:30,991
Và đó là tổng cộng bảy con số\n

10034
09:44:30,991 --> 09:44:32,561
Vậy hãy để tôi chạy nhanh cái này.

10035
09:44:35,012 --> 09:44:37,742
Có bảy\nchữ số đang được in.

10036
09:44:37,741 --> 09:44:41,761
Nhưng có điều gì đó\ntinh tế nhưng cũng hữu ích ở đây.

10037
09:44:45,752 --> 09:44:47,891
Bởi vì tôi đã tạo ra một mảng số nguyên.

10038
09:44:47,891 --> 09:44:52,542
Nhưng hãy nghĩ lại-- chúng ta đã khẳng định một số nguyên\nđiển hình lớn đến mức nào?

10039
09:44:52,542 --> 09:44:58,182
Bốn byte, hay 32 bit, vì vậy cần lưu ý rằng tôi thực sự không

10040
09:44:58,182 --> 09:45:00,201
cần phải lo lắng về chi tiết đó.

10041
09:45:00,201 --> 09:45:05,479
Lưu ý rằng tôi đã không làm cộng 4,\n

10042
09:45:05,480 --> 09:45:07,272
Tôi, lập trình viên,\nnói đúng ra, không

10043
09:45:07,271 --> 09:45:09,551
cần phải lo lắng về\nloại dữ liệu lớn đến mức nào.

10044
09:45:09,552 --> 09:45:11,652
Đây là sức mạnh của số học con trỏ.

10045
09:45:11,652 --> 09:45:17,292
Trình biên dịch đủ thông minh để biết\n

10046
09:45:17,292 --> 09:45:21,802
điều đó cũng giống như nói\nggo thêm một phần dữ liệu--

10047
09:45:22,841 --> 09:45:24,611
vì vậy nếu đó là số nguyên, hãy di chuyển bốn.

10048
09:45:24,612 --> 09:45:26,232
Nếu đó là số nguyên thứ hai, hãy di chuyển số tám.

10049
09:45:26,232 --> 09:45:27,962
Nếu đó là số nguyên thứ ba, hãy di chuyển 12.

10050
09:45:27,961 --> 09:45:31,182
Số học con trỏ xử lý số học khó chịu đó cho bạn

10051
09:45:31,182 --> 09:45:33,822
nên bạn có thể nghĩ về điều này\là một số tiếp theo một số

10052
09:45:33,822 --> 09:45:37,182
sau một số quay lại\n

10053
09:45:38,531 --> 09:45:42,561
Đó chỉ là cộng 1, cộng 2,\n

10054
09:45:43,061 --> 09:45:48,481
Bởi vì trình biên dịch biết điều gì\n

10055
09:45:48,482 --> 09:45:51,872
Bây giờ, có một\nchi tiết khác tôi nên tiết lộ ở đây

10056
09:45:51,872 --> 09:45:54,032
mà tôi đã coi là đương nhiên.

10057
09:45:54,031 --> 09:45:57,002
Trước đây tôi đã sử dụng double\nquotes để biểu thị các chuỗi

10058
09:45:57,002 --> 09:45:59,732
và tôi khẳng định rằng trình biên dịch\nđủ thông minh để nhận ra điều đó

10059
09:45:59,732 --> 09:46:04,272
nếu tôi có trích dẫn kép xin chào, điều đó có nghĩa là\n

10060
09:46:04,271 --> 09:46:05,791
và sau đó là dấu gạch chéo ngược bằng 0.

10061
09:46:08,161 --> 09:46:13,921
Hóa ra là bạn thực sự có thể điều trị\n

10062
09:46:13,921 --> 09:46:16,141
bản thân nó là một con trỏ,\nvà đây thực sự là

10063
09:46:16,141 --> 09:46:18,512
sẽ là thứ gì đó\có ích trong các vấn đề sắp tới

10064
09:46:18,512 --> 09:46:22,082
khi chúng ta muốn truyền các mảng\xung quanh trong bộ nhớ của máy tính.

10065
09:46:22,082 --> 09:46:25,824
Lưu ý rằng nói đúng trên mạng\n

10066
09:46:25,824 --> 09:46:27,781
Không có ngôi sao,\nkhông có ký hiệu-- có

10067
09:46:27,781 --> 09:46:31,021
không có gì mới ở đó, nhưng\nngay lập tức ở dòng thứ bảy

10068
09:46:31,021 --> 09:46:35,851
Tôi đang giả vờ rằng đó là\nđịa chỉ và điều này thực sự ổn.

10069
09:46:35,851 --> 09:46:39,752
Hóa ra một mảng\nthực sự có thể được xử lý

10070
09:46:39,752 --> 09:46:43,241
làm địa chỉ của phần tử\đầu tiên trong mảng đó.

10071
09:46:43,241 --> 09:46:47,439
Sự khác biệt là không có\n

10072
09:46:47,440 --> 09:46:49,232
Đây chỉ là một phần\nsố điện thoại ở đây

10073
09:46:49,232 --> 09:46:52,052
phần kết thúc bằng số 0-- đó không\ngiống như dấu gạch chéo ngược số 0 đặc biệt.

10074
09:46:52,052 --> 09:46:55,082
Vì vậy đây là điều chúng tôi sắp làm\n

10075
09:46:55,082 --> 09:46:58,802
Có mối quan hệ qua lại\ngiữa địa chỉ và mảng

10076
09:46:58,802 --> 09:47:03,482
điều đó thường cho phép bạn\n

10077
09:47:03,482 --> 09:47:05,882
nhưng toán học được chăm sóc cho bạn.

10078
09:47:05,881 --> 09:47:10,322
Có câu hỏi nào về vấn đề này trước không\n

10079
09:47:19,144 --> 09:47:20,311
DAVID J. Malan: Có khả năng.

10080
09:47:20,311 --> 09:47:24,271
Nếu bạn vượt quá phần cuối của một mảng,\n

10081
09:47:24,271 --> 09:47:27,541
Vấn đề là triệu chứng đó đôi khi không xác định được

10082
09:47:27,542 --> 09:47:30,542
điều đó có nghĩa là đôi khi điều đó\nsẽ xảy ra, đôi khi không.

10083
09:47:30,542 --> 09:47:34,502
Nó thường phụ thuộc vào khoảng cách\n

10084
09:47:34,502 --> 09:47:36,991
Bạn thường sẽ không gây ra\nlỗi phân đoạn

10085
09:47:36,991 --> 09:47:39,781
nếu bạn chỉ chọc quá xa\n một chút, nhưng nếu bạn đi quá xa

10086
09:47:41,192 --> 09:47:44,522
Nhưng hôm nay chúng tôi sẽ cung cấp cho bạn một công cụ\n

10087
09:47:44,521 --> 09:47:46,541
chính xác là loại tình huống đó.

10088
09:47:46,542 --> 09:47:49,452
Vậy bây giờ chúng ta hãy tiếp tục và làm\n

10089
09:47:49,451 --> 09:47:51,961
nhưng điều đó thực ra lại xuất hiện\nvới spoiler trước đó.

10090
09:47:51,961 --> 09:47:56,832
Hãy để tôi tiếp tục và tạo một chương trình\n

10091
09:47:56,832 --> 09:48:00,002
Tôi sẽ tiếp tục và\ncho phép mình sử dụng thư viện CS50

10092
09:48:00,002 --> 09:48:03,482
không quá nhiều cho chuỗi nhưng vì thế\n

10093
09:48:03,482 --> 09:48:07,801
cách này dễ dàng hơn nhiều so với cách chúng ta sẽ làm\n

10094
09:48:07,800 --> 09:48:10,832
Hãy để tôi tự đặt cho mình stdio.h,\nlàm một int main(void)

10095
09:48:10,832 --> 09:48:13,742
không phải lo lắng về dòng lệnh\n

10096
09:48:13,741 --> 09:48:18,061
và nhận một int tôi sử dụng get int, và\n

10097
09:48:18,061 --> 09:48:23,822
vậy để tôi cho mình một int j, hỏi\n

10098
09:48:23,822 --> 09:48:27,991
rồi để tôi tiếp tục và đại loại như vậy\n

10099
09:48:27,991 --> 09:48:31,411
nếu tôi bằng j,\nthì chúng ta tiếp tục nhé

10100
09:48:31,411 --> 09:48:36,481
và in ra nội dung như "giống nhau"\n

10101
09:48:36,482 --> 09:48:40,152
và in ra "khác" nếu\ntrên thực tế, chúng không giống nhau.

10102
09:48:40,152 --> 09:48:44,312
Vậy đó có vẻ là một chương trình\n

10103
09:48:44,311 --> 09:48:46,621
Được rồi, hãy tiếp tục và thực hiện so sánh--

10104
09:48:48,811 --> 09:48:52,351
Được rồi, tôi sẽ 50, j sẽ 50--

10105
09:48:54,582 --> 09:48:57,599
tôi sẽ 50, j sẽ 42.

10106
09:48:58,391 --> 09:49:02,701
Cho đến nay, phiên bản so sánh đầu tiên này rất tốt.

10107
09:49:02,701 --> 09:49:05,771
Nhưng như bạn có thể thấy\ntôi sẽ đi đâu với điều này

10108
09:49:05,771 --> 09:49:09,511
hãy tránh xa số nguyên và hãy\n

10109
09:49:10,661 --> 09:49:13,261
Vậy tôi có thể thực hiện string s ở đây--

10110
09:49:15,841 --> 09:49:22,711
Sau đó tôi có thể làm chuỗi t ở đây\nở đây và GetString ở đây

10111
09:49:22,711 --> 09:49:25,442
yêu cầu người dùng lần này, tại đây.

10112
09:49:25,442 --> 09:49:26,972
Và sau đó tôi có thể so sánh cả hai.

10113
09:49:28,819 --> 09:49:30,152
và đây là một quy ước chung.

10114
09:49:30,152 --> 09:49:33,182
Nếu bạn đã sử dụng s cho chuỗi rồi thì bạn\n

10115
09:49:33,182 --> 09:49:34,802
cho những cuộc biểu tình đơn giản như thế này.

10116
09:49:34,802 --> 09:49:37,927
Tôi sẽ so sánh cả hai, giống như\n

10117
09:49:37,927 --> 09:49:41,882
Hãy so sánh-- cho đến nay\nso tốt-- ./address--

10118
09:49:44,582 --> 09:49:47,792
Hãy để tôi tiếp tục và\nnhập nội dung nào đó như

10119
09:49:47,792 --> 09:49:52,762
xin chào, dấu chấm than và tạm biệt,\n

10120
09:49:52,762 --> 09:49:54,662
chắc chắn phải khác.

10121
09:49:54,661 --> 09:50:00,481
Để tôi chạy lại với câu chào, dấu chấm than\n

10122
09:50:00,482 --> 09:50:02,432
Khác-- có lẽ tôi đã nhầm lẫn.

10123
09:50:02,432 --> 09:50:05,542
Hãy viết chữ thường,\ncó thể điều đó sẽ khắc phục được.

10124
09:50:05,542 --> 09:50:07,862
Nhưng không, hai thứ đó khác nhau.

10125
09:50:07,862 --> 09:50:11,842
Vì vậy, để quay lại với những gì tôi đã mô tả\na là phần tiết lộ trước đó, điều gì

10126
09:50:11,841 --> 09:50:16,019
vấn đề cơ bản ở đây, phải rõ ràng?

10127
09:50:16,019 --> 09:50:18,061
Tại sao lại nói khác\mặc dù tôi xinh đẹp

10128
09:50:18,061 --> 09:50:19,478
chắc chắn tôi đã gõ điều tương tự hai lần.

10129
09:50:21,542 --> 09:50:24,961
Vâng, đây là nơi\ncó ích khi biết chuỗi đó đã ở đó

10130
09:50:24,961 --> 09:50:28,423
một sự trừu tượng-- một bánh xe huấn luyện, nếu\n

10131
09:50:28,423 --> 09:50:30,631
vẫn sử dụng GetString vì\nđiều đó vẫn thuận tiện--

10132
09:50:30,631 --> 09:50:33,421
nhưng nếu tôi thay đổi chuỗi\nthành char star, thì đó là

10133
09:50:33,421 --> 09:50:39,661
rõ ràng hơn một chút về những gì s và\n

10134
09:50:39,661 --> 09:50:42,121
đó là địa chỉ của\na char. t là một con trỏ

10135
09:50:42,122 --> 09:50:44,282
tới một ký tự, đó là\nđịa chỉ của một ký tự.

10136
09:50:44,281 --> 09:50:47,432
Cụ thể, ký tự đầu tiên\nin s và ký tự đầu tiên

10137
09:50:49,211 --> 09:50:51,436
Vì vậy, nếu tôi so sánh\nhai cái này thì nó sẽ đứng vững

10138
09:50:51,436 --> 09:50:53,311
để lý giải rằng chúng\nsẽ khác nhau.

10139
09:50:53,811 --> 09:50:57,421
Bởi vì s có thể kết thúc ở đây trong bộ nhớ\n

10140
09:50:57,421 --> 09:51:00,542
Mỗi lần tôi gọi GetString, nó là\n

10141
09:51:00,542 --> 09:51:02,531
để biết điều đó, hãy đợi một chút--\nbạn đã gõ nội dung tương tự.

10142
09:51:02,531 --> 09:51:04,051
Tôi sẽ trao lại cho bạn địa chỉ đó.

10143
09:51:04,052 --> 09:51:06,872
Điều đó không xảy ra bởi vì chúng ta\n

10144
09:51:06,872 --> 09:51:10,502
Mỗi lần tôi gọi GetString,\nit dường như đều trả về

10145
09:51:10,502 --> 09:51:13,262
một bản sao khác của chuỗi\n đã được nhập vào.

10146
09:51:13,262 --> 09:51:15,572
Xin chào ở đây và xin chào ở đây.

10147
09:51:15,572 --> 09:51:18,152
Chúng có thể trông giống với\ncon người nhưng với máy tính

10148
09:51:18,152 --> 09:51:22,052
chúng là những phần bộ nhớ khác nhau,\n

10149
09:51:22,052 --> 09:51:25,542
Và ở đây, chúng tôi cũng có thể tiết lộ\nGetString sẽ trả về cái gì?

10150
09:51:25,542 --> 09:51:29,522
Chà, có thể nói như vậy cho đến hôm nay, nó vẫn\ntrả về một chuỗi.

10151
09:51:31,021 --> 09:51:33,361
Về mặt kỹ thuật,\nGetString luôn là vậy

10152
09:51:33,362 --> 09:51:38,732
việc làm là trả về địa chỉ\ncủa ký tự đầu tiên trong chuỗi

10153
09:51:38,732 --> 09:51:42,542
và tin tưởng rằng chúng tôi đã đặt dấu gạch chéo ngược\n

10154
09:51:42,542 --> 09:51:46,772
đã nhập vào và thế là đủ\ncho printf, cho strlen, cho bạn

10155
09:51:46,771 --> 09:51:49,322
biết chuỗi bắt đầu và kết thúc ở đâu.

10156
09:51:49,322 --> 09:51:53,072
Vì vậy, GetString thực sự luôn trả về một con trỏ.

10157
09:51:53,072 --> 09:51:56,461
Nó chưa trả về một chuỗi quote\nunquote nào

10158
09:51:56,461 --> 09:51:59,762
nhưng có những hàm có thể\ngiải quyết sự so sánh này cho chúng ta.

10159
09:51:59,762 --> 09:52:02,862
Hãy nhớ rằng tôi có thể làm\nđiều gì đó như thế này.

10160
09:52:02,862 --> 09:52:05,792
Thực ra tôi có thể tới đây và tôi có thể--

10161
09:52:07,002 --> 09:52:14,341
Vì vậy, nếu tôi bao gồm str so sánh ở đây và\n

10162
09:52:14,341 --> 09:52:18,061
bây giờ chúng ta hãy xem điều gì xảy ra\nkhi tôi so sánh.

10163
09:52:18,061 --> 09:52:21,572
Khai báo ngầm thư viện\n

10164
09:52:22,682 --> 09:52:26,162
Vậy có thể bạn đã từng thấy lỗi này trước đây\n

10165
09:52:26,161 --> 09:52:30,641
nhưng có một số bằng chứng về\ncác ngôi sao hoặc con trỏ đang diễn ra ở đây.

10166
09:52:30,641 --> 09:52:33,131
Có vẻ như tôi đã không thêm\ntệp tiêu đề string.h

10167
09:52:34,322 --> 09:52:38,911
Bao gồm string.h, mặc dù nó\n

10168
09:52:38,911 --> 09:52:41,791
được gọi là chuỗi, nó chỉ có\ncác hàm liên quan đến chuỗi trong đó

10169
09:52:46,591 --> 09:52:50,371
Bây giờ hãy gõ xin chào, dấu chấm than\n

10170
09:52:50,372 --> 09:52:54,002
Bây giờ đây-- ồ, tôi đã sử dụng sai.

10171
09:52:55,724 --> 09:52:58,141
Điều đó được cho là\n ấn tượng, nhưng thực tế lại ngược lại.

10172
09:53:07,618 --> 09:53:09,951
DAVID J. Malan: Vâng, nó\ntrả về ba giá trị khác nhau.

10173
09:53:09,951 --> 09:53:13,731
Bằng 0 nếu chúng giống nhau, số dương\n1 sẽ đứng trước số kia

10174
09:53:13,732 --> 09:53:15,422
tiêu cực nếu điều ngược lại là đúng.

10175
09:53:15,421 --> 09:53:18,621
Tôi vừa quên mất điều đó, nên\ntôi đã làm đúng như vậy vào tuần trước

10176
09:53:18,622 --> 09:53:22,102
nếu tôi muốn so sánh chúng với\nequality trên trang hướng dẫn

10177
09:53:22,101 --> 09:53:24,781
Tôi nên kiểm tra\nzero làm giá trị trả về.

10178
09:53:24,781 --> 09:53:27,951
Bây giờ hãy so sánh, ./compare, Enter.

10179
09:53:27,951 --> 09:53:30,621
Hãy thử lần cuối-- xin chào và xin chào.

10180
09:53:30,622 --> 09:53:32,182
Được rồi, thực tế chúng giống nhau.

10181
09:53:37,232 --> 09:53:40,112
Và thực sự, không phải lúc nào nó cũng trở lại như vậy.

10182
09:53:40,112 --> 09:53:42,332
Nếu tôi gõ xin chào và\nrồi tạm biệt, thì thực sự là vậy

10183
09:53:42,332 --> 09:53:44,622
cũng nhận thấy sự khác biệt đó.

10184
09:53:44,622 --> 09:53:48,612
Thôi, hãy để tôi tiếp tục và\nlàm một việc khác ở đây.

10185
09:53:50,862 --> 09:53:54,362
Hãy để tôi tiếp tục và tiết lộ\n

10186
09:53:54,362 --> 09:53:57,692
Hãy loại bỏ việc so sánh chuỗi\n

10187
09:53:57,692 --> 09:54:01,472
Cách đơn giản để in cái này ra sẽ\n

10188
09:54:02,521 --> 09:54:05,701
lấy một địa chỉ và bắt đầu\nở đó, in từng ký tự lên

10189
09:54:05,701 --> 09:54:09,101
cho đến dấu gạch chéo ngược n, vậy\nhãy giao nó s và làm điều đó.

10190
09:54:09,101 --> 09:54:12,271
Và sau đó hãy làm thêm một lần nữa, %s,t.

10191
09:54:12,271 --> 09:54:17,111
Một lần nữa, đây là sự kết hợp của tuần 1 và tuần này

10192
09:54:17,112 --> 09:54:18,932
bởi vì tôi đã loại bỏ chuỗi từ.

10193
09:54:18,932 --> 09:54:24,072
Tôi đang sử dụng char star, nhưng tôi vẫn\n

10194
09:54:24,072 --> 09:54:27,692
Hãy để tôi tiếp tục và chạy so sánh\nbây giờ, và nếu tôi gõ xin chào và xin chào

10195
09:54:27,692 --> 09:54:29,652
Tôi nên nhìn thấy điều tương tự hai lần.

10196
09:54:29,652 --> 09:54:33,272
Vì vậy, chúng trông giống nhau, nhưng ở đây\nbây giờ chúng ta có cú pháp ngày hôm nay

10197
09:54:33,271 --> 09:54:35,651
để in ra địa chỉ thực tế của những thứ này.

10198
09:54:35,652 --> 09:54:40,082
Vậy hãy để tôi đổi s thành p,\n

10199
09:54:40,082 --> 09:54:44,012
và in nó ra, điều đó có nghĩa là\nchỉ in địa chỉ dưới dạng một con trỏ.

10200
09:54:44,012 --> 09:54:48,781
Vì vậy hãy so sánh, ./compare, và bây giờ\n

10201
09:54:48,781 --> 09:54:53,192
và quả thực tôi sẽ thấy hai địa chỉ\nhơi khác nhau được cung cấp

10202
09:54:54,002 --> 09:54:56,311
Người này có điểm B ở cuối,\không có người có điểm F ở cuối

10203
09:54:56,311 --> 09:54:58,841
và chúng thực sự cách nhau vài byte.

10204
09:54:58,841 --> 09:55:02,066
Vậy đây chỉ là xác nhận những gì\n

10205
09:55:02,067 --> 09:55:04,442
Vậy điều này có nghĩa là gì, có lẽ\ntrong bộ nhớ của máy tính?

10206
09:55:05,942 --> 09:55:09,872
Tôi đã thu nhỏ nên có một chút\n

10207
09:55:09,872 --> 09:55:16,262
Đây có thể là s trong bộ nhớ khi tôi làm vậy\n

10208
09:55:16,262 --> 09:55:19,742
Tôi nhận được một biến có kích thước\n

10209
09:55:19,741 --> 09:55:23,311
đã tuyên bố trước đó rằng trên các hệ thống hiện đại,\n

10210
09:55:23,311 --> 09:55:25,621
ngày nay để họ có thể đếm cao hơn nữa.

10211
09:55:25,622 --> 09:55:28,607
Và bên trong bộ nhớ\ncủa máy tính cũng có thể có hi.

10212
09:55:28,607 --> 09:55:31,232
Và tôi không biết nó kết thúc ở đâu\nvì vậy để thảo luận

10213
09:55:32,161 --> 09:55:35,121
Đó là những gì miễn phí\nkhi tôi chạy chương trình.

10214
09:55:35,122 --> 09:55:36,961
h-i dấu chấm than, dấu gạch chéo ngược bằng 0.

10215
09:55:36,961 --> 09:55:42,122
Có lẽ nó đã kết thúc, vì\n

10216
09:55:42,122 --> 09:55:47,162
Vì vậy, để làm rõ, những gì đang được lưu trữ sau khi thực hiện nhiệm vụ

10217
09:55:47,161 --> 09:55:50,072
toán tử sao chép từ phải sang trái?

10218
09:55:50,072 --> 09:55:54,692
Những gì đang được lưu trữ nếu tôi\nchuyển thêm một trang trình bày nữa?

10219
09:55:56,811 --> 09:56:00,621
0x123, giả định\nlà nếu một chuỗi là

10220
09:56:00,622 --> 09:56:04,597
được xác định bởi địa chỉ đầu tiên\n

10221
09:56:04,597 --> 09:56:09,052
là 0x123, thì đó thực sự\nlà giá trị cần có trong biến s.

10222
09:56:09,052 --> 09:56:12,112
Và về mặt kỹ thuật, đó chính là\n

10223
09:56:13,612 --> 09:56:16,762
GetString thực sự trả về\na chuỗi, có thể nói như vậy

10224
09:56:16,762 --> 09:56:20,601
nhưng đúng hơn thì nó trả về\nđịa chỉ của một ký tự.

10225
09:56:20,601 --> 09:56:24,082
Sau đó những gì đã được sao chép từ phải sang\n

10226
09:56:24,082 --> 09:56:26,961
tất cả những tuần này thực sự là địa chỉ đó.

10227
09:56:26,961 --> 09:56:31,461
Về mặt kỹ thuật, chúng tôi không thực sự cần\n

10228
09:56:31,461 --> 09:56:34,311
Chỉ cần nghĩ về\nchúng một cách tham khảo là đủ, nhưng chúng ta hãy

10229
09:56:34,311 --> 09:56:38,151
đầu tiên hãy xem xét t có thể ở đâu.\n

10230
09:56:38,152 --> 09:56:39,802
được tạo trên dòng mã thứ hai của tôi.

10231
09:56:39,802 --> 09:56:41,422
Có thể nó kết thúc ở đó,\ncó thể ở một nơi nào khác.

10232
09:56:41,421 --> 09:56:43,713
Để thảo luận\nTôi sẽ vẽ nó sang trái và phải.

10233
09:56:43,713 --> 09:56:47,131
Từ thứ hai\nên tôi gõ vào ở đâu?

10234
09:56:47,131 --> 09:56:53,031
Chà, giả sử bản sao thứ hai của\nhi có số 0x456457458459.

10235
09:56:54,322 --> 09:56:55,911
Tôi sẽ tự mình gỡ cái này ra.

10236
09:56:57,982 --> 09:57:01,432
Và bây giờ đây là hình ảnh\ntrình bày tại sao

10237
09:57:01,432 --> 09:57:03,112
và hãy trừu tượng hóa mọi thứ khác.

10238
09:57:03,112 --> 09:57:08,421
Khi tôi so sánh s với t bằng cách sử dụng\n

10239
09:57:08,421 --> 09:57:09,951
rõ ràng là chúng không giống nhau.

10240
09:57:09,951 --> 09:57:12,112
Một cái ở đây, một cái ở đây.

10241
09:57:12,112 --> 09:57:16,641
Và cách đây một lúc, một cái là\n0x123, cái còn lại là 0x456.

10242
09:57:16,641 --> 09:57:19,851
Đúng, về mặt kỹ thuật thì họ đang trỏ\n vào thứ gì đó giống nhau

10243
09:57:19,851 --> 09:57:23,332
nhưng điều đó chỉ tiết lộ\ncách hoạt động của str so sánh.

10244
09:57:23,332 --> 09:57:26,002
str so sánh rõ ràng là\na chức năng đó

10245
09:57:26,002 --> 09:57:29,241
lấy địa chỉ của chuỗi\na làm đối số của nó

10246
09:57:29,241 --> 09:57:31,761
và địa chỉ của chuỗi\nkhác làm đối số của nó

10247
09:57:31,762 --> 09:57:36,682
nó đi tới ký tự đầu tiên trong\n

10248
09:57:36,682 --> 09:57:38,872
và có thể có vòng lặp for\nloop hoặc while

10249
09:57:38,872 --> 09:57:41,782
và chỉ đi từ trái sang\nphải, so sánh, tìm kiếm

10250
09:57:41,781 --> 09:57:45,502
cho cùng một ký tự trái và phải, và\n

10251
09:57:47,482 --> 09:57:51,842
Nếu nó nhận thấy sự khác biệt thì nó\n

10252
09:57:51,841 --> 09:57:55,681
Và điều đó rất giống, hãy nhớ lại, với cách\n

10253
09:57:56,182 --> 09:57:59,092
Tôi đã sử dụng vòng lặp for, tôi\nđang tìm kiếm dấu gạch chéo ngược bằng 0.

10254
09:57:59,091 --> 09:58:04,881
str so sánh có lẽ hơi giống\n

10255
09:58:04,881 --> 09:58:08,362
nhưng so sánh, lần này\nkhông chỉ đếm.

10256
09:58:08,362 --> 09:58:11,092
Có câu hỏi nào không,\không so sánh chuỗi

10257
09:58:11,091 --> 09:58:14,181
và tại sao chúng ta lại sử dụng str\ncompare mà không bằng?

10258
09:58:15,374 --> 09:58:17,610
ĐỐI TƯỢNG: Con trỏ có địa chỉ không?

10259
09:58:17,610 --> 09:58:19,402
DAVID J. Malan:\nCon trỏ có địa chỉ không?

10260
09:58:19,902 --> 09:58:24,652
Vì vậy hôm nay chúng ta sẽ không làm điều đó, nhưng tôi có thể\n

10261
09:58:26,182 --> 09:58:29,781
Điều đó sẽ mang lại cho tôi\tương đương với một ngôi sao char star

10262
09:58:29,781 --> 09:58:31,966
bản thân nó có thể được\nlưu trữ ở nơi khác trong bộ nhớ.

10263
09:58:32,841 --> 09:58:35,031
Chúng tôi không làm điều đó một cách đệ quy mãi mãi.

10264
09:58:35,031 --> 09:58:37,972
Có ngôi sao và có ngôi sao\nsao, nhưng vâng, đó là một thứ

10265
09:58:37,972 --> 09:58:41,272
và nó thường rất hữu ích trong\n

10266
09:58:41,271 --> 09:58:44,541
điều mà chúng ta chưa thực sự nói tới,\n

10267
09:58:47,582 --> 09:58:50,632
Được rồi, vậy bây giờ chúng ta\nlàm gì để nâng mọi thứ lên một tầm cao mới?

10268
09:58:50,631 --> 09:58:53,151
Nào, hãy tiếp tục và triển khai\na chương trình khác tại đây

10269
09:58:53,152 --> 09:58:56,702
có thể cố gắng sao chép một số\ngiá trị, chỉ để chứng minh điều này.

10270
09:58:56,701 --> 09:59:00,441
Để tôi mở một tập tin\ncó tên, copy.c thì sao

10271
09:59:00,442 --> 09:59:02,872
và tôi sẽ bắt đầu\nvới một vài nội dung.

10272
09:59:02,872 --> 09:59:06,652
Vì vậy, hãy thêm thư viện CS50\n

10273
09:59:06,652 --> 09:59:11,302
Hãy bao gồm-- còn stdio\nas thì sao, hãy ưu tiên trước

10274
09:59:11,302 --> 09:59:14,072
bao gồm string.h và có thể\none khác trong giây lát.

10275
09:59:14,072 --> 09:59:17,072
Hãy làm int main(void) như trước.

10276
09:59:17,072 --> 09:59:20,601
Và sau đó ở đây, hãy lấy một\nchuỗi từ người dùng và chỉ cần

10277
09:59:23,031 --> 09:59:26,722
Và chết tiệt, chúng ta thực sự có thể\ngọi ngôi sao char này nếu muốn

10278
09:59:26,722 --> 09:59:28,834
hoặc chuỗi vì chúng ta đang\nsử dụng thư viện RS50.

10279
09:59:28,834 --> 09:59:30,002
Nhưng chúng ta sẽ quay lại vấn đề đó.

10280
09:59:30,002 --> 09:59:33,591
Bây giờ chúng ta hãy tạo một bản sao\nof s và thực hiện s bằng t

10281
09:59:33,591 --> 09:59:38,252
sử dụng một toán tử gán duy nhất và\n

10282
09:59:38,252 --> 09:59:43,192
Hãy đi vào ký tự đầu tiên\ncủa t, là dấu ngoặc vuông bằng 0

10283
09:59:43,192 --> 09:59:45,592
và sau đó hãy viết hoa\nit bằng hàm đó

10284
09:59:45,591 --> 09:59:50,931
mà chúng tôi đã sử dụng trước đây\n

10285
09:59:50,932 --> 09:59:52,592
Và thực ra, tôi nên quay lại đây.

10286
09:59:52,591 --> 09:59:56,828
Nếu tôi đang sử dụng toupper hoặc nếu bạn sử dụng\n

10287
09:59:56,828 --> 09:59:59,661
Có thể tôi không nhớ trực tiếp điều này,\n

10288
10:00:01,521 --> 10:00:04,651
Thư viện đó cũng có rất nhiều chức năng\n hữu ích.

10289
10:00:04,652 --> 10:00:09,457
Bây giờ ở dòng cuối cùng của chương trình\n

10290
10:00:09,457 --> 10:00:16,882
chỉ bằng cách in ra %s cho mỗi\n

10291
10:00:16,881 --> 10:00:20,042
tất nhiên rồi, và hãy\nxem điều gì sẽ xảy ra ở đây.

10292
10:00:21,832 --> 10:00:23,242
trời ơi nhiều lỗi quá.

10293
10:00:26,661 --> 10:00:30,211
Chuỗi t bằng s, xin lỗi, vậy\ntôi đang tạo hai biến

10294
10:00:30,211 --> 10:00:33,141
s và t tương ứng,\nvà tôi đang sao chép s vào t.

10295
10:00:34,822 --> 10:00:40,012
Thế đấy. ./copy và hãy\nnhập vào chẳng hạn

10296
10:00:40,012 --> 10:00:43,882
thế còn xin chào dấu chấm than\n lần này toàn chữ thường

10297
10:00:47,451 --> 10:00:51,561
Có thể nói, tôi không nghĩ đó là điều tôi dự định ở đây.

10298
10:00:51,561 --> 10:00:55,381
Bởi vì hãy lưu ý rằng tôi đã nhận được s từ\nngười dùng nên hãy kiểm tra.

10299
10:00:55,381 --> 10:00:59,063
Sau đó tôi đã sao chép t vào\ns, có vẻ đúng.

10300
10:00:59,063 --> 10:01:00,771
Đó là mục đích mà chúng tôi luôn\nsử dụng để thực hiện nhiệm vụ này.

10301
10:01:00,771 --> 10:01:04,551
Sau đó tôi viết hoa chữ cái\nđầu tiên trong t, nhưng không viết hoa s--

10302
10:01:05,692 --> 10:01:09,412
sau đó tôi in s và t rồi\nnhận thấy, hình như cả hai s

10303
10:01:13,281 --> 10:01:15,881
Vì vậy, nếu bạn bắt đầu cảm thấy\nthoải mái hơn một chút với những gì

10304
10:01:15,881 --> 10:01:19,781
đang diễn ra bên dưới mui xe,\n

10305
10:01:19,781 --> 10:01:23,584
Tại sao cả hai đều được viết hoa?

10306
10:01:23,584 --> 10:01:24,792
Tại sao cả hai đều được viết hoa?

10307
10:01:25,482 --> 10:01:27,962
ĐỐI TƯỢNG: Có thể họ đang\ntham chiếu đến cùng một địa chỉ?

10308
10:01:27,961 --> 10:01:29,372
DAVID J. Malan: Vâng, họ\nđang đại diện cho cùng một địa chỉ.

10309
10:01:31,232 --> 10:01:34,622
Nếu bạn tạo một biến khác có tên\n

10310
10:01:34,622 --> 10:01:37,232
bạn thực sự đang gán\nit giá trị trong s

10311
10:01:37,232 --> 10:01:40,122
đó là 0x123 hoặc đại loại như thế.

10312
10:01:40,122 --> 10:01:43,742
Và tại thời điểm đó trong câu chuyện, có lẽ cả s và t đều

10313
10:01:43,741 --> 10:01:47,311
có giá trị 0x123,\ncó nghĩa là về mặt kỹ thuật chúng

10314
10:01:47,311 --> 10:01:51,421
trỏ tới cùng một dấu chấm than h-i\trong bộ nhớ.

10315
10:01:51,421 --> 10:01:56,252
Tôi đâu có bảo máy tính đưa\n

10316
10:01:56,252 --> 10:01:59,491
theo nghĩa đen, tôi đã nói chỉ cần sao chép s.

10317
10:01:59,491 --> 10:02:03,752
Vì vậy, đây là nơi hiểu biết về những gì\n

10318
10:02:03,752 --> 10:02:06,122
Tôi chỉ sao chép các con trỏ.

10319
10:02:06,122 --> 10:02:07,961
Vậy điều gì thực sự đã diễn ra trong ký ức?

10320
10:02:07,961 --> 10:02:09,601
Chúng ta hãy nhìn vào lưới này.

10321
10:02:09,601 --> 10:02:12,451
Nếu tôi tạo s ban đầu,\ncó thể nó sẽ kết thúc ở đây.

10322
10:02:12,451 --> 10:02:15,961
Và tôi đã tạo lời chào bằng chữ thường\nvà nó kết thúc ở đây.

10323
10:02:15,961 --> 10:02:22,112
Sau đó, địa chỉ lại là như\n

10324
10:02:22,112 --> 10:02:24,811
Nếu sau đó tôi tạo một biến\nthứ hai có tên là t

10325
10:02:24,811 --> 10:02:29,042
và tôi gọi nó là một chuỗi, hay còn gọi là char\n

10326
10:02:29,042 --> 10:02:34,622
Nhưng khi tôi sao chép s vào t bằng\nlàm t bằng s dấu chấm phẩy

10327
10:02:34,622 --> 10:02:40,227
nghĩa đen là chỉ sao chép s vào\n

10328
10:02:40,226 --> 10:02:43,351
Vì vậy nếu bây giờ chúng ta loại bỏ tất cả những thứ này\n

10329
10:02:43,351 --> 10:02:47,731
bằng các mũi tên, thứ chúng ta đã vẽ trong\nbộ nhớ của máy tính là cái này.

10330
10:02:47,732 --> 10:02:52,232
Hai con trỏ khác nhau nhưng lưu trữ\ncùng một địa chỉ, có nghĩa là

10331
10:02:52,232 --> 10:02:55,122
các mẩu bánh mì dẫn đến cùng một nơi.

10332
10:02:55,122 --> 10:02:58,202
Và vì vậy nếu bạn làm theo t breadcrumb\n

10333
10:02:58,201 --> 10:03:02,191
về mặt chức năng\ngiống như việc sao chép--

10334
10:03:02,192 --> 10:03:07,832
cũng thay đổi chữ cái đầu tiên\trong phiên bản s.

10335
10:03:07,832 --> 10:03:12,671
Vậy giải pháp\ncho loại vấn đề này là gì?

10336
10:03:12,671 --> 10:03:14,741
Ngay cả khi bạn không biết\ncách thực hiện điều đó bằng mã

10337
10:03:14,741 --> 10:03:17,307
ý chính của điều tôi\nthực sự dự định là gì, đó là

10338
10:03:17,307 --> 10:03:21,461
Tôi muốn một bản sao chính hãng của s, được gọi là t.

10339
10:03:21,461 --> 10:03:25,574
Tôi muốn một dấu chấm than mới\ndấu gạch chéo ngược bằng 0.

10340
10:03:25,574 --> 10:03:27,281
Tôi cần làm gì\nđể điều đó xảy ra?

10341
10:03:28,249 --> 10:03:30,992
ĐỐI TƯỢNG: Tôi nghĩ có\na chức năng gọi là str copy.

10342
10:03:30,991 --> 10:03:34,322
DAVID J. Malan: Vậy là có một\nhàm được gọi là str copy, strcpy

10343
10:03:34,322 --> 10:03:36,872
đó là câu trả lời\ncó thể có cho câu hỏi này.

10344
10:03:36,872 --> 10:03:41,042
Điều đáng chú ý với bản sao khuấy là bạn\n

10345
10:03:41,042 --> 10:03:43,592
chuỗi nguồn là gì--\nchuỗi bạn muốn sao chép--

10346
10:03:43,591 --> 10:03:46,322
bạn cũng cần chuyển vào\nđịa chỉ của một đoạn bộ nhớ

10347
10:03:46,322 --> 10:03:50,911
nơi bạn có thể sao chép chuỗi vào đó, và\n

10348
10:03:50,911 --> 10:03:53,311
và hôm nay chúng tôi cần thêm một\nkhu nhà nữa, nếu bạn muốn.

10349
10:03:53,311 --> 10:03:57,722
Chúng tôi chưa tìm ra cách\ntạo ra các khối bộ nhớ mới

10350
10:03:57,722 --> 10:04:00,641
rồi để một số\nchức năng khác sao chép vào chúng.

10351
10:04:00,641 --> 10:04:04,021
Và để làm điều này, chúng tôi sẽ giới thiệu\n

10352
10:04:04,932 --> 10:04:07,652
Và có lẽ đây là tính năng cuối cùng và\nmạnh mẽ nhất hiện nay

10353
10:04:07,652 --> 10:04:11,612
theo đó chúng tôi sẽ giới thiệu hai\n

10354
10:04:11,612 --> 10:04:14,851
malloc có nghĩa là cấp phát bộ nhớ,\nthực chất chỉ làm được điều đó.

10355
10:04:14,851 --> 10:04:18,002
Đó là một hàm nhận vào một số\n

10356
10:04:18,002 --> 10:04:21,394
bạn có muốn hệ điều hành\n

10357
10:04:21,394 --> 10:04:23,311
Nó sẽ tìm thấy nó\nvà nó sẽ quay trở lại

10358
10:04:23,311 --> 10:04:26,915
gửi cho bạn địa chỉ của byte đầu tiên của\n

10359
10:04:26,915 --> 10:04:29,582
và sau đó bạn có thể làm bất cứ điều gì bạn muốn với đoạn bộ nhớ đó.

10360
10:04:29,582 --> 10:04:31,112
miễn phí sẽ làm điều ngược lại.

10361
10:04:31,112 --> 10:04:33,932
Khi bạn sử dụng xong một đoạn\n

10362
10:04:33,932 --> 10:04:37,561
bạn có thể nói giải phóng nó và điều đó có nghĩa là bạn\n

10363
10:04:37,561 --> 10:04:40,781
và sau đó hệ điều hành có thể\n

10364
10:04:40,781 --> 10:04:44,222
Vì vậy, đây thực sự là bằng chứng về một vấn đề thường gặp trong lập trình.

10365
10:04:44,222 --> 10:04:48,671
Nếu máy Mac của bạn thì PC của bạn đã từng ở trong\n

10366
10:04:48,671 --> 10:04:53,281
rất chậm hoặc đang chậm đến mức\n

10367
10:04:53,281 --> 10:04:56,281
một trong những lời giải thích có thể có thể là

10368
10:04:56,281 --> 10:04:59,161
rằng chương trình bạn\nđang chạy của Apple hoặc Microsoft

10369
10:04:59,161 --> 10:05:02,401
hoặc bất cứ ai, có thể họ đang sử dụng\nmalloc hoặc một số tương đương

10370
10:05:02,402 --> 10:05:03,707
hỏi hệ điều hành--

10371
10:05:03,707 --> 10:05:05,582
Mac OS hoặc Windows-- để,\cung cấp cho tôi thêm bộ nhớ.

10372
10:05:06,362 --> 10:05:07,741
Người dùng đang tạo ra nhiều hình ảnh hơn.

10373
10:05:07,741 --> 10:05:09,182
Người dùng đang gõ một bài luận dài hơn.

10374
10:05:09,182 --> 10:05:10,802
Cho tôi thêm ký ức, thêm ký ức.

10375
10:05:10,802 --> 10:05:15,362
Nếu chương trình có lỗi và không bao giờ\n

10376
10:05:15,362 --> 10:05:18,061
máy tính của bạn có thể sẽ sử dụng\ntất cả bộ nhớ khả dụng

10377
10:05:18,061 --> 10:05:21,932
và thành thật mà nói, con người không tốt lắm\n

10378
10:05:21,932 --> 10:05:24,811
Rất thường xuyên các chương trình, máy tính\nbị treo tại thời điểm đó

10379
10:05:24,811 --> 10:05:28,951
hoặc thực sự rất chậm vì\n

10380
10:05:28,951 --> 10:05:31,112
khi không còn đủ bộ nhớ.

10381
10:05:31,112 --> 10:05:33,722
Vậy một trong những lý do khiến\nmáy tính thực sự chạy chậm

10382
10:05:33,722 --> 10:05:37,995
có thể đang gọi malloc rất nhiều, hoặc\n

10383
10:05:37,995 --> 10:05:40,412
Có nghĩa là bạn nên\luôn luôn sử dụng hai chức năng này

10384
10:05:40,411 --> 10:05:43,991
trong buổi hòa nhạc và giải phóng bộ nhớ\nmột khi bạn đã làm xong việc đó.

10385
10:05:43,991 --> 10:05:48,121
Vậy hãy để tôi tiếp tục và thực hiện việc này trong\n

10386
10:05:48,122 --> 10:05:50,162
Hãy để tôi tiếp tục và làm điều này.

10387
10:05:50,161 --> 10:05:53,851
Trước khi tôi sao chép s vào t bằng\nthứ gì đó như str copy

10388
10:05:53,851 --> 10:05:56,487
Trước tiên tôi cần lấy một loạt\nbộ nhớ từ máy tính.

10389
10:05:56,487 --> 10:05:59,612
Vì vậy, để làm được điều đó, hãy làm điều tuyệt vời này\n

10390
10:05:59,612 --> 10:06:03,182
vì vậy tôi sẽ thay đổi chuỗi của mình\n

10391
10:06:03,182 --> 10:06:05,641
và về mặt kỹ thuật\nam tôi sẽ lưu trữ những gì trong t

10392
10:06:05,641 --> 10:06:09,692
là địa chỉ của một đoạn bộ nhớ\ncó sẵn.

10393
10:06:09,692 --> 10:06:13,891
Để làm điều đó, tôi có thể yêu cầu máy tính\ncấp phát bộ nhớ cho tôi

10394
10:06:15,302 --> 10:06:18,542
Nếu tôi muốn tạo một bản sao\nof h-i dấu chấm than

10395
10:06:22,991 --> 10:06:27,252
Bởi vì tôi cần h, i, the\n

10396
10:06:28,362 --> 10:06:30,522
Việc hiểu\nđiều đó và yêu cầu điều đó là tùy thuộc vào tôi.

10397
10:06:30,521 --> 10:06:32,051
Nó sẽ không xảy ra một cách kỳ diệu.

10398
10:06:32,052 --> 10:06:35,962
Không có gì trong C. Vì vậy tôi có thể\nchỉ cần gõ số bốn vào đó một cách ngây thơ

10399
10:06:35,961 --> 10:06:38,862
và điều đó sẽ đúng\nnếu tôi gõ dấu chấm than h-i

10400
10:06:38,862 --> 10:06:42,792
điểm hoặc bất kỳ từ có ba chữ cái nào khác\n

10401
10:06:42,792 --> 10:06:46,122
Có lẽ tôi nên làm\nđiều gì đó như strlen của s

10402
10:06:46,122 --> 10:06:49,692
cộng thêm 1 cho ký tự\nnull bổ sung.

10403
10:06:49,692 --> 10:06:52,182
Hãy nhớ lại độ dài chuỗi\ntheo nghĩa tiếng Anh--

10404
10:06:52,182 --> 10:06:56,351
nó trả về độ dài của chuỗi\n

10405
10:06:56,351 --> 10:06:58,601
thực tế là tôi sẽ\n cần dấu gạch chéo ngược đó n.

10406
10:06:58,601 --> 10:07:00,972
Bây giờ hãy để tôi làm theo kiểu cũ\ntrường học này trước.

10407
10:07:00,972 --> 10:07:05,711
Để tôi tiếp tục và\nsao chép chuỗi s vào t trước theo cách thủ công.

10408
10:07:05,711 --> 10:07:13,572
Vậy với int i bằng 0 thì i nhỏ hơn\n

10409
10:07:13,572 --> 10:07:18,521
Sau đó, trong vòng lặp for của tôi, tôi sẽ đi\n

10410
10:07:18,521 --> 10:07:22,572
tôi, nhưng thực ra tôi cũng muốn\nký tự rỗng

10411
10:07:22,572 --> 10:07:25,362
vì vậy tôi muốn tính độ dài\ncủa chuỗi cộng thêm 1 nữa

10412
10:07:25,362 --> 10:07:28,031
và chết tiệt, tôi nghĩ lần trước tôi đã học được\nan tối ưu hóa.

10413
10:07:28,031 --> 10:07:30,491
Nếu tôi làm điều này lần nữa\n lần nữa, tôi thực sự có thể

10414
10:07:30,491 --> 10:07:36,222
do n bằng strlen của s cộng 1\nvà do i nhỏ hơn n

10415
10:07:36,222 --> 10:07:38,722
giống như một sự tối ưu hóa thiết kế đẹp mắt.

10416
10:07:38,722 --> 10:07:41,891
Tôi nghĩ vòng lặp for này thực sự sẽ xử lý quá trình này, sau đó

10417
10:07:41,891 --> 10:07:48,701
sao chép mọi ký tự từ s vào\n

10418
10:07:48,701 --> 10:07:52,031
Hoặc tôi có thể loại bỏ tất cả những thứ đó\n

10419
10:07:52,031 --> 10:07:56,201
là sử dụng str copy, việc này diễn ra như\n

10420
10:07:56,201 --> 10:07:58,661
và đối số thứ hai của nó là nguồn.

10421
10:07:58,661 --> 10:08:03,641
Vì vậy hãy sao chép từ phải sang trái trong trường hợp này,\n

10422
10:08:03,641 --> 10:08:06,591
cũng tự động dành cho tôi.

10423
10:08:08,781 --> 10:08:10,762
Bây giờ tôi có thể tận dụng vốn một cách an toàn.

10424
10:08:10,762 --> 10:08:14,802
Ký tự đầu tiên trong t,\n

10425
10:08:14,802 --> 10:08:18,802
hơn s và sau đó tôi có thể in cả hai\n

10426
10:08:19,811 --> 10:08:22,691
Vậy hãy sao chép-- được rồi,\ntôi đã làm gì sai?

10427
10:08:22,692 --> 10:08:25,781
Khai báo ngầm thư viện\nfunction malloc dot, dot, dot.

10428
10:08:25,781 --> 10:08:28,421
Vì vậy, chúng tôi đã từng thấy loại lỗi này trước đây.

10429
10:08:28,421 --> 10:08:31,511
Cái gì-- ngay cả khi bạn không biết rõ cách giải quyết nó

10430
10:08:31,512 --> 10:08:33,042
bản chất của giải pháp là gì?

10431
10:08:33,042 --> 10:08:36,072
Tôi cần làm gì để khắc phục điều này\n

10432
10:08:36,072 --> 10:08:38,631
khai báo một chức năng thư viện?

10433
10:08:41,572 --> 10:08:42,921
Tôi cần bao gồm thư viện.

10434
10:08:42,921 --> 10:08:46,911
Và tôi có thể tra cứu điều này trong sổ tay,\n

10435
10:08:47,722 --> 10:08:49,822
Có một thư viện khác\nthỉnh thoảng chúng tôi sẽ

10436
10:08:49,822 --> 10:08:51,921
bây giờ cần gọi là lib tiêu chuẩn--

10437
10:08:51,921 --> 10:08:56,031
thư viện chuẩn-- chứa\nmalloc và các nguyên mẫu miễn phí

10438
10:08:57,381 --> 10:09:00,421
Được rồi, để tôi giải quyết chuyện này\n

10439
10:09:00,421 --> 10:09:06,322
Bây giờ tôi ổn rồi. ./copy, Enter, Được rồi.\n

10440
10:09:06,322 --> 10:09:10,131
t và s bây giờ trở lại như dự định.

10441
10:09:10,131 --> 10:09:15,322
Có vẻ như s không bị ảnh hưởng,\nnhưng t hiện được viết hoa.

10442
10:09:15,322 --> 10:09:18,711
Vậy có câu hỏi nào về\nnhững gì chúng ta vừa làm trong mã không?

10443
10:09:20,533 --> 10:09:23,942
ĐỐI TƯỢNG: Bạn đã nói rằng\nmalloc và free đi cùng nhau.

10444
10:09:28,411 --> 10:09:30,453
Có một vài cải tiến\nTôi muốn thực hiện, vì vậy hãy

10445
10:09:30,453 --> 10:09:32,011
tôi thực sự làm những việc đó ngay bây giờ.

10446
10:09:32,012 --> 10:09:35,042
Về mặt kỹ thuật thì tôi nên luyện tập những gì\n

10447
10:09:35,042 --> 10:09:37,459
khi tôi làm xong t, t sẽ rảnh.

10448
10:09:37,459 --> 10:09:39,542
May mắn thay, tôi không phải lo lắng về việc t

10449
10:09:39,542 --> 10:09:43,052
là-- máy tính nhớ bao nhiêu\n

10450
10:09:43,052 --> 10:09:44,732
tất cả trong số họ, không chỉ là người đầu tiên.

10451
10:09:46,442 --> 10:09:49,112
Tôi không cần phải làm free\ns và tôi không nên

10452
10:09:49,112 --> 10:09:52,052
vì việc đó được thư viện CS50 xử lý\ntự động.

10453
10:09:52,052 --> 10:09:54,452
s, nhớ lại, đến từ\nGetString, và chúng tôi thực sự

10454
10:09:54,451 --> 10:09:56,829
có sẵn một số mã ưa thích\nđể đảm bảo

10455
10:09:56,830 --> 10:09:58,622
khi kết thúc quá trình thực thi\nchương trình của bạn

10456
10:09:58,622 --> 10:10:01,682
chúng tôi giải phóng mọi bộ nhớ mà chúng tôi\đã phân bổ nên thực tế chúng tôi không

10457
10:10:01,682 --> 10:10:03,616
lãng phí bộ nhớ như tôi đã mô tả trước đó.

10458
10:10:03,616 --> 10:10:05,491
Nhưng thực ra có một vài thứ khác

10459
10:10:05,491 --> 10:10:07,991
nếu tôi thực sự muốn trở nên\npedantic thì tôi nên đưa vào đây.

10460
10:10:07,991 --> 10:10:11,432
Hoá ra\nđôi khi malloc có thể bị lỗi

10461
10:10:11,432 --> 10:10:14,169
và đôi khi malloc không có đủ bộ nhớ

10462
10:10:14,169 --> 10:10:15,961
bởi vì có thể\nmáy tính của bạn đang làm quá nhiều việc

10463
10:10:15,961 --> 10:10:18,061
thứ không còn\nthêm RAM nữa.

10464
10:10:18,061 --> 10:10:20,341
Vì vậy, về mặt kỹ thuật, tôi nên\nlàm điều gì đó như thế này--

10465
10:10:20,341 --> 10:10:24,901
nếu t bằng null,\nvới hai chữ L hôm nay

10466
10:10:24,902 --> 10:10:28,112
thì tôi chỉ nên trả về 1 hay gì đó\n

10467
10:10:28,112 --> 10:10:29,987
Có lẽ tôi cũng nên in thông báo lỗi\nan

10468
10:10:29,987 --> 10:10:31,662
nhưng bây giờ tôi sẽ giữ nó đơn giản.

10469
10:10:31,661 --> 10:10:33,886
Có lẽ tôi cũng nên kiểm tra điều này.

10470
10:10:33,887 --> 10:10:36,211
Đây là một chút rủi ro của tôi.

10471
10:10:36,211 --> 10:10:40,872
Nếu tôi đang viết t ngoặc 0 thì đây là\n

10472
10:10:40,872 --> 10:10:43,592
Nhưng điều gì sẽ xảy ra nếu con người chỉ\nhấn Enter tại dấu nhắc

10473
10:10:43,591 --> 10:10:46,752
và thậm chí còn không gõ h, chứ đừng nói đến dấu chấm than h-i?

10474
10:10:46,752 --> 10:10:48,991
Nếu không có dấu ngoặc số 0 thì sao?

10475
10:10:48,991 --> 10:10:54,542
Về mặt kỹ thuật, điều tôi có lẽ nên làm\n

10476
10:10:54,542 --> 10:11:00,482
ít nhất phải lớn hơn 0,\n

10477
10:11:01,802 --> 10:11:04,092
Và cuối cùng nếu mọi việc suôn sẻ

10478
10:11:04,091 --> 10:11:08,201
Tôi có thể trả về số 0, do đó biểu thị\n

10479
10:11:08,201 --> 10:11:12,072
Đúng vậy, hai hàm này, malloc\n

10480
10:11:12,072 --> 10:11:17,012
Và vì vậy nếu bạn gọi malloc thì cuối cùng bạn\nnên gọi miễn phí.

10481
10:11:17,012 --> 10:11:22,617
Nhưng bạn đã không gọi malloc cho s,\n

10482
10:11:23,491 --> 10:11:24,658
KHÁN GIẢ: Đây là một câu hỏi.

10483
10:11:24,658 --> 10:11:26,940
Tại sao chúng ta làm malloc plus 1?

10484
10:11:26,940 --> 10:11:28,732
DAVID J. Malan: Tại sao\ndid tôi làm malloc cộng 1?

10485
10:11:28,732 --> 10:11:31,642
Vì vậy malloc-- xin lỗi, malloc\nof độ dài chuỗi là s

10486
10:11:31,641 --> 10:11:35,264
cộng 1-- độ dài chuỗi là\n

10487
10:11:35,264 --> 10:11:36,472
sẽ cảm nhận được nó bằng tiếng Anh.

10488
10:11:36,472 --> 10:11:39,472
Vậy xin chào\nđiểm-- strlen cho tôi 3

10489
10:11:39,472 --> 10:11:43,162
nhưng bây giờ tôi biết kể từ tuần trước và\n

10490
10:11:43,161 --> 10:11:45,111
và một chuỗi luôn có thêm một byte.

10491
10:11:45,112 --> 10:11:47,662
Trách nhiệm của tôi là\nhiểu và áp dụng

10492
10:11:47,661 --> 10:11:52,371
bài học đó đã học được nên tôi thực sự\n

10493
10:11:53,991 --> 10:11:59,661
Và đây chỉ là một điều khó chịu khi\n

10494
10:11:59,661 --> 10:12:03,711
tuần, hóa ra\nN-U-L-L cũng có ý tưởng tương tự.

10495
10:12:03,711 --> 10:12:06,891
Nó cũng bằng 0, nhưng nó bằng 0\trong ngữ cảnh của con trỏ.

10496
10:12:06,891 --> 10:12:11,122
Câu chuyện dài quá, bạn không bao giờ\n

10497
10:12:11,122 --> 10:12:12,412
và chúng tôi đã thấy nó trên màn hình.

10498
10:12:12,411 --> 10:12:17,991
Bạn sẽ bắt đầu viết N-U-L-L khi bạn\n

10499
10:12:19,042 --> 10:12:20,452
Và ý tôi muốn nói là thế này.

10500
10:12:20,451 --> 10:12:23,331
Nếu malloc bị lỗi và\nkhông còn đủ bộ nhớ bên trong

10501
10:12:23,332 --> 10:12:26,632
của máy tính dành cho bạn, nó\không trả về một giá trị đặc biệt

10502
10:12:26,631 --> 10:12:30,561
và giá trị đặc biệt đó là\nN-U-L-L viết hoa toàn bộ.

10503
10:12:30,561 --> 10:12:32,182
Điều đó báo hiệu có điều gì đó không ổn.

10504
10:12:32,182 --> 10:12:37,131
Đừng tin rằng tôi đang mang lại cho bạn một giá trị hữu ích.

10505
10:12:37,131 --> 10:12:40,752
Các câu hỏi khác về\ncác bản sao này cho đến nay?

10506
10:12:46,841 --> 10:12:48,091
DAVID J. Malan: Câu hỏi hay.

10507
10:12:48,091 --> 10:12:49,981
Bản sao str sẽ không hoạt động nếu không có malloc?

10508
10:12:49,982 --> 10:12:53,252
Bạn cần cả hai trong\ntrường hợp này vì str copy

10509
10:12:53,252 --> 10:12:56,641
theo định nghĩa-- nếu tôi kéo nó lên\n

10510
10:12:56,641 --> 10:12:58,622
để đặt các ký tự được sao chép.

10511
10:12:58,622 --> 10:13:01,682
Chỉ nói char star t dấu chấm phẩy là chưa đủ.

10512
10:13:01,682 --> 10:13:03,122
Điều đó chỉ cung cấp cho bạn một con trỏ.

10513
10:13:03,122 --> 10:13:06,062
Nhưng tôi cần một\nbộ nhớ khác

10514
10:13:06,061 --> 10:13:10,171
chỉ lớn bằng h-i dấu chấm than\nđiểm gạch chéo ngược số 0

10515
10:13:10,171 --> 10:13:12,631
vì vậy malloc mang lại cho tôi cả\nbộ nhớ

10516
10:13:12,631 --> 10:13:16,921
và sau đó str copy điền vào nó bằng h-i\n

10517
10:13:16,921 --> 10:13:19,381
Một lần nữa, đó là lý do tại sao chúng ta\nđi xuống cấp độ thấp hơn này

10518
10:13:19,381 --> 10:13:21,423
bởi vì một khi bạn hiểu\nđiều gì cần phải làm

10519
10:13:21,423 --> 10:13:23,292
bây giờ bạn có các chức năng để làm điều đó.

10520
10:13:23,292 --> 10:13:25,332
Vì vậy, hãy thực sự xem xét\nđiều chúng ta vừa giải quyết.

10521
10:13:25,332 --> 10:13:29,192
Vì vậy trong phiên bản tiếp theo của chương trình\n

10522
10:13:29,192 --> 10:13:32,702
t đã được khởi tạo cho giá trị\ntrả về của malloc

10523
10:13:32,701 --> 10:13:34,741
và có lẽ ký ức\ntôi quay lại đã ở đây--

10524
10:13:38,341 --> 10:13:40,651
Tôi đã để trống\ban đầu vì không có gì

10525
10:13:40,652 --> 10:13:42,362
được malloc đặt tự động ở đó.

10526
10:13:42,362 --> 10:13:46,472
Tôi chỉ nhận được một đoạn ký ức\n

10527
10:13:46,472 --> 10:13:51,391
Sau đó tôi gán t cho giá trị trả về đó,\n

10528
10:13:51,391 --> 10:13:53,222
Lưu ý không có dấu gạch chéo ngược bằng 0.

10529
10:13:53,222 --> 10:13:56,101
Đây chưa phải là một chuỗi\nit mà chỉ là một đoạn bộ nhớ--

10530
10:13:56,101 --> 10:13:58,231
bốn byte-- một mảng bốn byte.

10531
10:13:58,232 --> 10:14:01,802
Điều mà str copy cuối cùng đã làm\nđối với tôi là nó sao chép chữ h qua

10532
10:14:01,802 --> 10:14:06,032
i over, dấu chấm than\nover và dấu gạch chéo ngược số 0.

10533
10:14:06,031 --> 10:14:09,902
Và nếu tôi không muốn sử dụng str copy hoặc\n

10534
10:14:09,902 --> 10:14:14,062
sẽ làm chính xác điều tương tự.

10535
10:14:14,061 --> 10:14:19,178
Vậy có câu hỏi nào không,\không phải những ví dụ này ở đây.

10536
10:14:28,491 --> 10:14:29,741
DAVID J. Malan: Câu hỏi hay.

10537
10:14:29,741 --> 10:14:34,091
Sau malloc, nếu tôi có thì\nvẫn chỉ làm t bằng s

10538
10:14:34,091 --> 10:14:37,211
thực ra nó sẽ tạo lại\nvấn đề ban đầu tương tự

10539
10:14:37,211 --> 10:14:40,932
chỉ bằng cách sao chép 0x123 từ s vào t.

10540
10:14:40,932 --> 10:14:44,112
Vậy thì tôi sẽ bị bỏ lại với\n

10541
10:14:44,112 --> 10:14:48,072
cách đây vài bước, tôi đã-- và\ntôi không thể làm điều đó trực tiếp--

10542
10:14:48,072 --> 10:14:50,381
mũi tên này, nếu tôi làm\nđiều bạn vừa mô tả

10543
10:14:50,381 --> 10:14:54,358
bây giờ sẽ chỉ vào đây và như vậy\n

10544
10:14:54,358 --> 10:14:56,441
vấn đề, tôi sẽ\nthật lãng phí thêm

10545
10:14:56,442 --> 10:14:59,502
tạm thời bốn byte mà\ntôi thực sự không sử dụng.

10546
10:15:06,222 --> 10:15:08,180
bạn có luôn sử dụng malloc\nand str copy cùng nhau không?

10547
10:15:08,955 --> 10:15:10,872
Cả hai đều giải quyết\nhai vấn đề khác nhau.

10548
10:15:10,872 --> 10:15:15,132
malloc đang cung cấp cho tôi đủ bộ nhớ để\n

10549
10:15:15,131 --> 10:15:18,941
Tuy nhiên, bạn thực sự có thể sử dụng\n

10550
10:15:18,942 --> 10:15:22,272
và bạn có thể sử dụng str copy trên đó, và\n

10551
10:15:22,271 --> 10:15:24,432
Nhưng cho đến nay, đó là một\nmô hình tinh thần hợp lý

10552
10:15:24,432 --> 10:15:26,652
có cái đó nếu bạn\nmuốn sao chép chuỗi

10553
10:15:26,652 --> 10:15:30,281
bạn sử dụng malloc và sau đó str\ncopy hoặc vòng lặp cây nhà lá vườn của riêng bạn.

10554
10:15:42,531 --> 10:15:44,730
DAVID J. Malan: Hãy nói điều đó một lần nữa.

10555
10:15:55,531 --> 10:15:58,801
sao chép str, theo tài liệu của nó,\nsẽ sao chép toàn bộ chuỗi

10556
10:15:58,802 --> 10:16:01,022
cộng với ký tự null ở cuối.

10557
10:16:01,021 --> 10:16:03,481
Nó chỉ giả định rằng sẽ có một cái ở đó.

10558
10:16:03,482 --> 10:16:07,652
Do đó, việc vượt qua str\n là tùy thuộc vào bạn

10559
10:16:08,641 --> 10:16:10,832
Nếu tôi chỉ yêu cầu malloc\n ba byte, thì

10560
10:16:10,832 --> 10:16:12,902
có thể đã\ntạo ra vấn đề về bộ nhớ

10561
10:16:12,902 --> 10:16:16,262
theo đó str copy sẽ vẫn\nsao chép một cách mù quáng một, hai, ba

10562
10:16:16,262 --> 10:16:19,802
bốn byte, nhưng về mặt kỹ thuật thì phải như vậy\n

10563
10:16:19,802 --> 10:16:22,652
Bạn chưa có quyền truy cập vào\n

10564
10:16:22,652 --> 10:16:24,902
bởi vì bạn chưa bao giờ yêu cầu malloc cho nó.

10565
10:16:26,822 --> 10:16:29,822
ĐỐI TƯỢNG: Vậy số bên trong\n

10566
10:16:30,182 --> 10:16:32,057
Số bên trong malloc--\nit là một đối số.

10567
10:16:32,057 --> 10:16:35,084
Đó là số byte bạn muốn quay lại.

10568
10:16:35,084 --> 10:16:38,402
KHÁN GIẢ: Điều đó có nghĩa là bạn\nphải nhớ [KHÔNG NGHE ĐƯỢC]??

10569
10:16:41,158 --> 10:16:43,491
DAVID J. Malan: Vâng, trách nhiệm thuộc về bạn, người lập trình viên

10570
10:16:43,491 --> 10:16:45,658
để nhớ hay nói thẳng ra là dùng hàm\na để tìm ra

10571
10:16:45,658 --> 10:16:47,182
bạn thực sự cần bao nhiêu byte.

10572
10:16:47,182 --> 10:16:50,031
Đó là lý do tại sao cuối cùng tôi\nkhông gõ bốn chữ theo cách thủ công

10573
10:16:51,802 --> 10:16:55,192
Vì thế dấu cộng 1 là cần thiết nếu bạn\n

10574
10:16:55,192 --> 10:16:57,832
nhưng sử dụng strlen có nghĩa\nlà tôi thực sự có thể

10575
10:16:57,832 --> 10:17:01,012
thử nghiệm với bất kỳ loại\đầu vào nào và nó sẽ tự động

10576
10:17:02,902 --> 10:17:05,182
Chỉ cần nói rằng,\ncó rất nhiều cách

10577
10:17:05,182 --> 10:17:07,292
đã có sẵn nơi bạn có thể\nbắt đầu phá vỡ chương trình.

10578
10:17:07,292 --> 10:17:10,747
Hãy cung cấp cho bạn ít nhất một công cụ dành cho\n

10579
10:17:10,747 --> 10:17:12,622
Và quả thực, trong\nbộ vấn đề sắp tới, bạn sẽ

10580
10:17:12,622 --> 10:17:14,722
sử dụng điều này để tìm lỗi trong mã của riêng bạn.

10581
10:17:14,722 --> 10:17:18,351
Không chỉ sử dụng printf, không chỉ sử dụng\n

10582
10:17:19,561 --> 10:17:22,731
Vậy hãy để tôi tiếp tục và cố tình\n

10583
10:17:22,732 --> 10:17:24,872
có một số lỗi liên quan đến bộ nhớ.

10584
10:17:24,872 --> 10:17:30,262
Hãy để tôi thêm stdio.h ở trên cùng và\n

10585
10:17:30,262 --> 10:17:31,912
vì vậy bây giờ tôi có quyền truy cập vào malloc.

10586
10:17:31,911 --> 10:17:36,531
Hãy để tôi làm int main(void) và sau đó\n

10587
10:17:36,531 --> 10:17:39,711
Tôi muốn phân bổ\ncó lẽ ba--

10588
10:17:41,572 --> 10:17:43,552
Chỉ vì mục đích thảo luận.

10589
10:17:43,552 --> 10:17:48,082
Vì vậy tôi sẽ tiếp tục và làm malloc\n

10590
10:17:48,082 --> 10:17:51,368
Tôi muốn ba số nguyên và\nan số nguyên là bốn byte

10591
10:17:51,368 --> 10:17:52,701
nên về mặt kỹ thuật tôi có thể làm điều này--

10592
10:17:52,701 --> 10:17:57,211
3 nhân 4, hoặc tôi có thể làm 12 nhưng một lần nữa,\n

10593
10:17:57,211 --> 10:17:59,701
và nếu tôi chạy chương trình này trên\na một máy tính hơi khác

10594
10:17:59,701 --> 10:18:01,221
int có thể có kích thước khác.

10595
10:18:01,222 --> 10:18:05,682
vì vậy cách tốt hơn để làm điều này sẽ là\n

10596
10:18:05,682 --> 10:18:08,932
Và đây chỉ là một toán tử bạn có thể sử dụng\n

10597
10:18:08,932 --> 10:18:10,972
trên máy tính này, int lớn bao nhiêu?

10598
10:18:10,972 --> 10:18:13,652
Một cái phao lớn cỡ nào, hay cái gì khác?

10599
10:18:13,652 --> 10:18:15,772
Vậy điều đó sẽ mang lại cho tôi nhiều--

10600
10:18:15,771 --> 10:18:18,171
nhiều bộ nhớ cho ba số nguyên.

10601
10:18:18,171 --> 10:18:20,182
Tôi muốn gán cái này cho cái gì?

10602
10:18:20,182 --> 10:18:22,372
Vâng, malloc trả về một địa chỉ.

10603
10:18:22,372 --> 10:18:27,652
Con trỏ là địa chỉ nên tôi sẽ đi\n

10604
10:18:31,101 --> 10:18:33,682
Điều này ít rõ ràng hơn một chút,\nnhưng hãy quay lại vấn đề cơ bản.

10605
10:18:33,682 --> 10:18:38,451
Phía bên tay phải ở đây cho tôi một\n

10606
10:18:38,451 --> 10:18:42,021
malloc trả về địa chỉ của\nbyte đầu tiên của đoạn đó.

10607
10:18:42,021 --> 10:18:44,151
Làm cách nào để lưu trữ địa chỉ của bất kỳ thứ gì?

10608
10:18:45,052 --> 10:18:48,922
Cú pháp cho kiểu dữ liệu hôm nay, dấu sao

10609
10:18:48,921 --> 10:18:53,991
nơi loại dữ liệu được đề cập\n

10610
10:18:53,991 --> 10:18:57,891
Một lần nữa, nó khá vô mục đích, chỉ\n

10611
10:18:57,891 --> 10:19:03,262
ở đây, nhưng bây giờ nó tương đương với\n

10612
10:19:03,262 --> 10:19:06,711
có lẽ là tổng cộng, vì vậy về mặt kỹ thuật bây giờ tôi có thể thực hiện việc này.

10613
10:19:06,711 --> 10:19:10,851
Tôi có thể đi vào phần đầu tiên\n

10614
10:19:12,271 --> 10:19:20,061
Vị trí thứ hai, số 73, và\n

10615
10:19:20,061 --> 10:19:22,911
Bây giờ tôi đã cố tình\nsai lầm ở đây

10616
10:19:22,911 --> 10:19:26,061
bởi vì tôi đang cố gắng vượt qua\nsự hiểu biết mới tìm thấy của mình

10617
10:19:26,061 --> 10:19:28,641
hoặc màu xanh của tôi với\ncác con trỏ hiểu biết.

10618
10:19:28,641 --> 10:19:32,002
Thứ nhất, tôi đã không nhớ rằng tôi\n

10619
10:19:33,112 --> 10:19:36,502
malloc về cơ bản trả về một mảng,\n

10620
10:19:36,502 --> 10:19:38,902
Một mảng gồm ba số nguyên\cũng không mang tính kỹ thuật hơn

10621
10:19:38,902 --> 10:19:42,741
địa chỉ của một đoạn bộ nhớ\ncó thể chứa ba số nguyên.

10622
10:19:42,741 --> 10:19:46,042
Vì vậy tôi có thể sử dụng dấu ngoặc vuông\n

10623
10:19:46,042 --> 10:19:48,991
và sử dụng số học con trỏ, nhưng\n

10624
10:19:48,991 --> 10:19:50,841
Nhưng tôi đã phạm phải hai sai lầm.

10625
10:19:50,841 --> 10:19:54,441
Tôi chưa bắt đầu lập chỉ mục\nat số 0, vì vậy dòng bảy

10626
10:19:54,442 --> 10:19:56,302
lẽ ra phải là dấu ngoặc x bằng 0.

10627
10:19:56,302 --> 10:19:59,174
Dòng tám lẽ ra phải là x\nngoặc 1, rồi đến dòng chín

10628
10:19:59,173 --> 10:20:00,381
lẽ ra phải là x ngoặc 2.

10629
10:20:01,591 --> 10:20:04,521
Sai lầm thứ hai\ntôi mắc phải là do tác dụng phụ

10630
10:20:04,521 --> 10:20:07,581
là tôi cũng đang chạm vào\nký ức mà lẽ ra tôi không nên chạm vào.

10631
10:20:07,582 --> 10:20:12,531
x dấu ngoặc 3 có nghĩa là đi tới\n

10632
10:20:13,341 --> 10:20:15,861
Tôi chỉ yêu cầu đủ\nbộ nhớ cho ba int

10633
10:20:15,862 --> 10:20:19,101
không phải bốn, nên đây\nđược gọi là lỗi tràn bộ đệm.

10634
10:20:19,101 --> 10:20:22,191
Tôi vô tình, nhưng\ncố ý vào lúc này

10635
10:20:22,192 --> 10:20:26,312
vượt ra ngoài ranh giới của\nmảng này, đoạn bộ nhớ này.

10636
10:20:26,311 --> 10:20:28,671
Vì vậy, những điều tồi tệ có thể xảy ra,\nnhưng không nhất thiết

10637
10:20:28,671 --> 10:20:30,002
chỉ bằng cách chạy chương trình của bạn.

10638
10:20:30,002 --> 10:20:31,552
Hãy để tôi tiếp tục và thử điều này.

10639
10:20:31,552 --> 10:20:37,372
Tạo bộ nhớ và bạn sẽ thấy ở đây\nnó biên dịch ổn. ./bộ nhớ

10640
10:20:37,372 --> 10:20:39,500
và thực ra nó\nkhông có lỗi phân đoạn

10641
10:20:39,500 --> 10:20:41,542
quay trở lại điểm\ncủa thuyết bất định.

10642
10:20:41,542 --> 10:20:43,912
Đôi khi như vậy, đôi khi\nkhông-- nó phụ thuộc vào mức độ tệ hại

10643
10:20:45,052 --> 10:20:48,219
Nhưng có một chương trình có thể\nphát hiện ra những loại lỗi này

10644
10:20:48,218 --> 10:20:51,051
và tôi sẽ tiếp tục và mở rộng\n

10645
10:20:51,052 --> 10:20:56,512
và tôi sẽ không chỉ chạy ./memory,\n

10646
10:20:56,512 --> 10:20:59,362
Đây là lệnh đi kèm\nvới rất nhiều hệ thống máy tính

10647
10:20:59,362 --> 10:21:02,432
được thiết kế để tìm ra các lỗi liên quan đến\nbộ nhớ trong mã.

10648
10:21:02,432 --> 10:21:04,372
Vì vậy hôm nay đây là một công cụ mới trong\nbộ công cụ của bạn

10649
10:21:04,372 --> 10:21:06,472
và bạn sẽ sử dụng nó với\ncác bộ vấn đề sắp tới.

10650
10:21:07,671 --> 10:21:09,951
Thành thật mà nói, đó là đầu ra của nó, nó thật gớm ghiếc.

10651
10:21:09,951 --> 10:21:13,341
Nhưng có một vài thứ\nsẽ bắt đầu nổi lên

10652
10:21:13,341 --> 10:21:15,741
và sẽ giúp bạn về\ncác công cụ cũng như các vấn đề

10653
10:21:15,741 --> 10:21:17,311
chuẩn bị xem những thứ này.

10654
10:21:21,832 --> 10:21:25,822
Đó là trên dòng Memory.c\nnine, theo điểm nổi bật của tôi.

10655
10:21:25,822 --> 10:21:27,711
Vậy hãy để tôi xem dòng thứ chín.

10656
10:21:27,711 --> 10:21:31,372
Theo nghĩa nào thì đây là một bản ghi\không hợp lệ ở kích thước bốn?

10657
10:21:31,372 --> 10:21:33,952
Chà, tôi đang chạm vào ký ức\nrằng lẽ ra tôi không nên làm vậy, và tôi

10658
10:21:33,951 --> 10:21:35,421
chạm vào nó như thể nó là một int.

10659
10:21:35,421 --> 10:21:37,911
Và int là bốn byte-- kích thước bốn.

10660
10:21:37,911 --> 10:21:41,191
Một lần nữa, điều này cần thực hành một chút để\n

10661
10:21:41,192 --> 10:21:44,132
nhưng bây giờ đây là manh mối\nđối với tôi, người lập trình viên

10662
10:21:44,131 --> 10:21:47,591
điều đó không chỉ tôi làm sai mà\ntôi còn làm sai liên quan đến bộ nhớ

10663
10:21:47,591 --> 10:21:50,109
và đây chỉ là một gợi ý, nếu bạn muốn.

10664
10:21:50,110 --> 10:21:52,652
Nó sẽ không nhất thiết\ncho bạn biết chính xác cách khắc phục

10665
10:21:52,652 --> 10:21:56,491
bạn phải vật lộn với\nngữ nghĩa, nhưng không hợp lệ

10666
10:21:56,491 --> 10:21:58,322
viết cỡ bốn-- ồ, được rồi.

10667
10:21:58,322 --> 10:22:02,682
Vì vậy lẽ ra tôi không nên lập chỉ mục\nvượt qua ranh giới ở đây.

10668
10:22:02,682 --> 10:22:05,381
Được rồi, lẽ ra tôi không nên làm điều đó.

10669
10:22:05,381 --> 10:22:11,125
Vậy hãy để tôi tiếp tục và thay đổi điều này\n

10670
10:22:11,125 --> 10:22:13,292
Được rồi, hãy để tôi tiếp tục và biên dịch lại mã của mình.

10671
10:22:13,292 --> 10:22:19,622
Tạo bộ nhớ, ./memory, vẫn không được\n

10672
10:22:20,252 --> 10:22:26,461
Hãy để tôi tiếp tục và chạy Valgrind\n

10673
10:22:26,461 --> 10:22:28,682
Và bây giờ đã bớt đáng sợ hơn--

10674
10:22:28,682 --> 10:22:32,201
kết quả bây giờ đã bớt đáng sợ hơn, nhưng\nvẫn còn điều gì đó ở đó.

10675
10:22:32,201 --> 10:22:35,728
Lưu ý điều này-- 12 byte trong một khối--

10676
10:22:35,728 --> 10:22:37,561
không quan tâm đến ngữ pháp\ncó-- chắc chắn là

10677
10:22:37,561 --> 10:22:39,331
bị mất kỷ lục một trong một.

10678
10:22:39,332 --> 10:22:42,972
Siêu khó hiểu, nhưng điều này gợi ý về cái gọi là rò rỉ bộ nhớ.

10679
10:22:42,972 --> 10:22:46,802
Các khối bộ nhớ bị mất trong\n

10680
10:22:46,802 --> 10:22:48,242
Tôi đã yêu cầu nhưng tôi chưa bao giờ--

10681
10:22:51,368 --> 10:22:53,701
Và đây là cách nói phức tạp\n rằng, bạn đã làm hỏng việc.

10682
10:22:54,911 --> 10:22:57,181
Vì vậy, đây là một sửa chữa dễ dàng, may mắn thay.

10683
10:22:57,182 --> 10:23:01,572
Một khi tôi đã làm xong bộ nhớ này, tôi\n

10684
10:23:01,572 --> 10:23:03,991
Vậy bây giờ hãy để tôi tiếp tục\nvà chạy lại để tạo bộ nhớ

10685
10:23:03,991 --> 10:23:07,801
nó vẫn chạy tốt nên trong suốt thời gian đó\n

10686
10:23:08,942 --> 10:23:10,622
Nhưng hãy để tôi chạy Valgrind một lần nữa.

10687
10:23:14,701 --> 10:23:16,891
Tất cả các khối heap đã\nđược giải phóng, bất kể điều đó có nghĩa là gì.

10688
10:23:18,732 --> 10:23:21,842
Và mặc dù vẫn còn một chút\n

10689
10:23:21,841 --> 10:23:25,345
và trên thực tế, nó khá rõ ràng--\n

10690
10:23:27,002 --> 10:23:30,192
Vì vậy, mặc dù đây là một trong\ncông cụ phức tạp nhất mà chúng tôi sẽ sử dụng

10691
10:23:30,192 --> 10:23:32,702
nó cũng là một trong những thứ mạnh nhất vì nó có thể nhìn thấy mọi thứ

10692
10:23:32,701 --> 10:23:36,031
mà bạn, con người, có thể không, và\n

10693
10:23:36,031 --> 10:23:38,101
Nó thực hiện việc đọc mã của bạn gần hơn nhiều

10694
10:23:38,101 --> 10:23:43,862
trong khi nó đang chạy để tìm hiểu\n chính xác chuyện gì đang xảy ra.

10695
10:23:43,862 --> 10:23:46,141
Vậy thì bạn có câu hỏi nào về công cụ này không?

10696
10:23:46,141 --> 10:23:50,042
Và chúng tôi cũng sẽ hướng dẫn bạn sau ngày hôm nay\ncách thực sự sử dụng tính năng này.

10697
10:23:50,042 --> 10:23:52,561
Chỉ giúp bạn tìm ra những lỗi liên quan đến\nbộ nhớ

10698
10:23:52,561 --> 10:23:55,381
mà bây giờ bạn có thể có khả năng thực hiện.

10699
10:23:55,381 --> 10:23:57,542
Được rồi, hãy làm một\nviệc khác liên quan đến trí nhớ.

10700
10:23:57,542 --> 10:23:59,531
Hãy để tôi thu nhỏ cửa sổ terminal của tôi ở đây.

10701
10:23:59,531 --> 10:24:03,271
Hãy để tôi tạo một\ntệp khác ở đây có tên là rác.c.

10702
10:24:03,271 --> 10:24:06,781
Hoá ra đó là một thuật ngữ của chúng ta\n

10703
10:24:06,781 --> 10:24:08,292
mà chúng tôi có thể tiết lộ như sau.

10704
10:24:08,292 --> 10:24:11,281
Hãy để tôi đưa vào stdio.h,\nvà để tôi đưa vào--

10705
10:24:11,281 --> 10:24:14,822
thế còn stdlib.h thì sao, và\nđể tôi đưa ra ý kiến của mình

10706
10:24:14,822 --> 10:24:17,921
main(void) và sau đó trong chương trình\ntương đối ngắn này

10707
10:24:17,921 --> 10:24:20,822
hãy để tôi tự thưởng cho mình ba\nint bằng cách sử dụng tuần trước

10708
10:24:20,822 --> 10:24:24,781
ký hiệu, chỉ là dấu ngoặc int điểm\n

10709
10:24:24,781 --> 10:24:28,801
Vậy hãy để tôi tiếp tục và làm cho\n

10710
10:24:28,802 --> 10:24:34,052
i cộng cộng, rồi để tôi tiếp tục\nvà in ra, %i gạch chéo ngược n

10711
10:24:38,851 --> 10:24:44,141
Mã này, khá chắc chắn là sẽ có\n

10712
10:24:46,531 --> 10:24:51,061
Tôi đã quên một bước mặc dù\n

10713
10:24:53,792 --> 10:24:56,281
Vâng, tôi đã không cung cấp\nsđiểm, nên thực ra tôi đã không

10714
10:24:56,281 --> 10:25:00,211
khởi tạo mảng có tên là điểm\n

10715
10:25:00,211 --> 10:25:03,752
Tuy nhiên, điều gây tò mò về điều này là\n

10716
10:25:04,442 --> 10:25:08,402
Hãy để tôi tiếp tục và tinh nghịch\nlàm rác, Enter

10717
10:25:08,402 --> 10:25:10,982
và đó là một mô tả thích hợp\nbởi vì những gì tôi sắp thấy

10718
10:25:10,982 --> 10:25:13,592
được gọi là giá trị rác.

10719
10:25:13,591 --> 10:25:18,421
Khi bạn, lập trình viên, không\n

10720
10:25:18,421 --> 10:25:21,239
đôi khi, ai biết được điều gì sẽ xảy ra ở đó.

10721
10:25:21,239 --> 10:25:23,072
Máy tính đang\nlàm một số việc khác

10722
10:25:23,072 --> 10:25:26,521
thậm chí còn có một chút việc xảy ra\n

10723
10:25:26,521 --> 10:25:29,761
vì vậy có thể còn sót lại\ncác số nguyên, ký tự, chuỗi trong quá khứ

10724
10:25:29,762 --> 10:25:32,402
nổi-- bất kỳ thứ gì khác trong\ntrong đó và những gì bạn đang thấy

10725
10:25:32,402 --> 10:25:38,022
đó là những giá trị rác rưởi, đó là\n

10726
10:25:38,021 --> 10:25:40,961
như tôi vừa làm, để khởi tạo\ngiá trị của một biến nào đó.

10727
10:25:40,961 --> 10:25:42,961
Và điều này thực sự\nkhá nguy hiểm, và ở đó

10728
10:25:42,961 --> 10:25:46,442
đã có nhiều ví dụ về\nphần mềm bị xâm phạm

10729
10:25:46,442 --> 10:25:49,622
vì một trong những vấn đề này\n

10730
10:25:49,622 --> 10:25:53,972
và đột nhiên có người dùng, có thể là mọi người\n

10731
10:25:53,972 --> 10:25:57,842
các ứng dụng, có thể đột nhiên nhìn thấy\n

10732
10:25:58,951 --> 10:26:01,411
Có thể mật khẩu của ai đó\đã được nhập trước đó

10733
10:26:01,411 --> 10:26:03,391
hoặc một số giá trị khác như\na số thẻ tín dụng

10734
10:26:03,391 --> 10:26:04,951
đã được gõ vào trước đó.

10735
10:26:04,951 --> 10:26:06,932
Có nhiều cơ chế phòng thủ\nkhác nhau

10736
10:26:06,932 --> 10:26:10,472
nói chung là điều này không có khả năng xảy ra lắm, nhưng chắc chắn là có

10737
10:26:10,472 --> 10:26:13,531
rất có thể, ít nhất\ntrong bối cảnh này

10738
10:26:13,531 --> 10:26:17,461
để xem những giá trị mà bạn\ncó lẽ không nên thấy vì chúng

10739
10:26:17,461 --> 10:26:20,981
có thể là tàn dư của\nthứ khác đã sử dụng chúng.

10740
10:26:20,982 --> 10:26:25,062
Vì vậy, điều này muốn nói lại một lần nữa, bạn có cái này\n

10741
10:26:25,061 --> 10:26:28,381
nhưng bây giờ bạn cũng có khả năng\nhack tuyệt vời này để khám phá xung quanh

10742
10:26:28,381 --> 10:26:31,801
nội dung của bộ nhớ, và đây là\n

10743
10:26:31,802 --> 10:26:35,792
đang cố gắng tìm cách khai thác hệ thống.

10744
10:26:40,432 --> 10:26:42,472
Được rồi, chúng ta hãy tiếp tục và\nnghỉ ngơi nhanh trong năm phút

10745
10:26:42,472 --> 10:26:44,872
và khi quay lại, chúng ta sẽ\nxây dựng những chủ đề cuối cùng này.

10746
10:26:47,031 --> 10:26:50,841
Đầu tiên, chỉ là một lập trình viên nhỏ\n

10747
10:26:50,841 --> 10:26:53,211
sẽ có ý nghĩa một chút với bạn.

10748
10:26:53,211 --> 10:26:57,682
Và những gì chúng ta cũng sẽ làm tiếp theo để thực hiện\n

10749
10:26:57,682 --> 10:27:00,862
hoạt hình bằng đất sét, nếu bạn\n

10750
10:27:00,862 --> 10:27:03,862
chính xác điều gì sẽ xảy ra bây giờ nếu bạn có\n

10751
10:27:03,862 --> 10:27:07,364
các giá trị là gì và làm thế nào chúng đạt được điều đó, và\n

10752
10:27:07,364 --> 10:27:09,531
Chỉ cần in\nchúng ra như tôi vừa làm là một chuyện

10753
10:27:09,531 --> 10:27:13,792
đó là chuyện khác nếu bạn thực sự nhầm\n

10754
10:27:13,792 --> 10:27:17,241
bởi vì giá trị rác chỉ là số 0\n

10755
10:27:17,241 --> 10:27:20,121
Nhưng nếu bạn sử dụng toán tử\ndereference mới đó, dấu sao

10756
10:27:20,122 --> 10:27:24,472
và cố gắng đi đến một giá trị rác\nnghĩ sai rằng đó là

10757
10:27:24,472 --> 10:27:26,872
một con trỏ hợp lệ, những điều xấu có thể xảy ra.

10758
10:27:26,872 --> 10:27:31,792
Máy tính có thể gặp sự cố hoặc quen thuộc hơn,\n

10759
10:27:31,792 --> 10:27:34,762
Vậy cho phép tôi giới thiệu, nếu chúng ta\n

10760
10:27:34,762 --> 10:27:36,472
bạn Binky của chúng tôi đến từ Stanford.

10761
10:27:40,311 --> 10:27:41,901
GIỌNG 1: Này Binky, dậy đi.

10762
10:27:48,544 --> 10:27:50,461
GIỌNG 1: Chà, để bắt đầu\ntôi đoán chúng ta

10763
10:27:50,461 --> 10:27:52,082
sẽ cần một vài gợi ý.

10764
10:27:52,082 --> 10:27:56,359
BINKY: OK, mã này phân bổ hai\n

10765
10:27:56,942 --> 10:28:00,549
Ồ, tôi thấy hai con trỏ, nhưng chúng\n

10766
10:28:01,381 --> 10:28:03,511
Ban đầu, con trỏ\nkhông trỏ tới bất kỳ thứ gì.

10767
10:28:03,512 --> 10:28:06,542
Những thứ chúng trỏ đến được gọi là\n

10768
10:28:07,535 --> 10:28:08,702
NGƯỜI GIỌNG 1: Ồ, đúng rồi.

10769
10:28:11,381 --> 10:28:13,711
Vậy làm thế nào để bạn phân bổ một pointee?

10770
10:28:13,711 --> 10:28:17,281
BINKY: OK, mã này\nallocates một số nguyên mới

10771
10:28:17,281 --> 10:28:20,354
và phần này đặt x để trỏ tới nó.

10772
10:28:20,355 --> 10:28:21,772
GIỌNG 1: Này, cái đó có vẻ tốt hơn.

10773
10:28:23,381 --> 10:28:26,771
BINKY: OK, tôi sẽ hủy đăng ký\ncon trỏ x để lưu số

10774
10:28:28,902 --> 10:28:32,562
Đối với thủ thuật này, tôi sẽ cần\ncây đũa thần có khả năng hội thảo.

10775
10:28:32,561 --> 10:28:35,951
GIỌNG 1: Phép thuật\nthảo thuật hội nghị của bạn?

10776
10:28:37,802 --> 10:28:39,512
BINKY: Mã trông như thế này.

10777
10:28:39,512 --> 10:28:42,307
Tôi sẽ chỉ cần thiết lập số và--

10778
10:28:44,531 --> 10:28:49,451
Vì vậy việc hủy bỏ tham chiếu trên x sẽ diễn ra\n

10779
10:28:49,451 --> 10:28:51,491
trong trường hợp này để lưu trữ 42 trong đó.

10780
10:28:51,491 --> 10:28:56,112
Này, hãy thử dùng nó để lưu số\n

10781
10:28:57,252 --> 10:29:01,631
Tôi sẽ qua đây để bạn cài đặt số 13

10782
10:29:01,631 --> 10:29:06,161
và sau đó sử dụng đũa\hội thảo và chỉ--

10783
10:29:07,241 --> 10:29:09,461
GIỌNG 1: Ồ này, cách đó không hiệu quả.

10784
10:29:09,461 --> 10:29:13,182
Nói đi, Binky, tôi không nghĩ\hội thảo y là ý kiến hay

10785
10:29:13,182 --> 10:29:16,377
vì việc thiết lập\nngười nhận điểm là một bước riêng biệt

10786
10:29:16,377 --> 10:29:18,912
và tôi không nghĩ chúng tôi đã từng làm điều đó.

10787
10:29:19,961 --> 10:29:22,391
GIỌNG 1: Vâng, chúng tôi đã phân bổ con trỏ y

10788
10:29:22,391 --> 10:29:25,631
nhưng chúng tôi chưa bao giờ đặt nó\nđể trỏ tới một con trỏ.

10789
10:29:26,800 --> 10:29:28,842
GIỌNG 1: Này, cậu\ntrông ổn đấy, Binky.

10790
10:29:28,841 --> 10:29:31,721
Bạn có thể sửa sao cho y trỏ\ncùng một điểm với x không?

10791
10:29:31,722 --> 10:29:35,082
BINKY: Chắc chắn rồi, tôi sẽ sử dụng\ncây phép thuật của mình để gán con trỏ.

10792
10:29:35,082 --> 10:29:37,332
GIỌNG 1: Điều đó có\ncó vấn đề như trước đây không?

10793
10:29:37,332 --> 10:29:39,222
BINKY: Không, điều này không chạm tới con trỏ

10794
10:29:39,222 --> 10:29:42,851
nó chỉ thay đổi một con trỏ thành\n

10795
10:29:43,872 --> 10:29:46,542
Bây giờ y trỏ đến cùng một vị trí với x.

10796
10:29:48,432 --> 10:29:51,491
Nó có một con trỏ để bạn có thể thử\nphương thức hội thảo lần nữa

10797
10:29:56,434 --> 10:29:57,641
NGƯỜI GIỌNG 1: Này, nhìn kìa.

10798
10:29:57,641 --> 10:29:59,472
Hiện tại, tính năng hội thảo đã hoạt động trên y.

10799
10:29:59,472 --> 10:30:03,522
Và bởi vì các con trỏ đang chia sẻ\n

10800
10:30:05,232 --> 10:30:07,272
Vậy bây giờ chúng ta đổi chỗ nhé?

10801
10:30:07,271 --> 10:30:09,191
GIỌNG 1: Ồ nhìn này, chúng ta đã hết thời gian rồi.

10802
10:30:10,311 --> 10:30:12,531
Đó là từ người bạn của chúng tôi\nNick Parlante ở Stanford.

10803
10:30:12,531 --> 10:30:14,871
Vì vậy, hãy xem xét những gì\nNick đã làm ở đây với tư cách là Binky.

10804
10:30:14,872 --> 10:30:16,942
Vì vậy, đây là tất cả các mã cùng nhau.

10805
10:30:16,942 --> 10:30:20,619
Hai dòng đầu tiên này không phải\n

10806
10:30:20,618 --> 10:30:21,951
họ di chuyển các ngôi sao sang trái.

10807
10:30:22,701 --> 10:30:25,612
Một lần nữa, thông thường hơn\ncó thể là cú pháp này ở đây.

10808
10:30:26,822 --> 10:30:30,141
Bạn có thể tạo\nbiến, thậm chí cả con trỏ

10809
10:30:30,141 --> 10:30:33,771
và không gán cho chúng một giá trị ban đầu\n

10810
10:30:33,771 --> 10:30:36,291
Vì vậy, cuối cùng chúng tôi làm\nở đây, với dòng này.

10811
10:30:36,292 --> 10:30:39,351
Chúng ta gán cho x giá trị trả về\n của malloc, giá trị này

10812
10:30:39,351 --> 10:30:41,182
có lẽ là địa chỉ của một cái gì đó.

10813
10:30:41,182 --> 10:30:44,432
Công bằng mà nói, chúng ta thực sự cũng nên kiểm tra giá trị rỗng

10814
10:30:44,432 --> 10:30:46,351
nhưng đó không phải là vấn đề lớn nhất ở đây.

10815
10:30:46,351 --> 10:30:48,841
Vấn đề lớn nhất\nthậm chí không phải ở dòng tiếp theo này

10816
10:30:48,841 --> 10:30:54,591
có nghĩa là đi đến vị trí bộ nhớ\n

10817
10:30:54,591 --> 10:30:56,811
Không sao đâu, bởi vì\nmột lần nữa, malloc trả về

10818
10:30:56,811 --> 10:30:59,061
địa chỉ của một đoạn bộ nhớ nào đó.

10819
10:30:59,061 --> 10:31:01,161
Đoạn bộ nhớ này\nđủ lớn cho một int.

10820
10:31:01,161 --> 10:31:04,072
do đó x sẽ lưu trữ\nđịa chỉ của đoạn đó

10821
10:31:05,031 --> 10:31:08,902
Ngôi sao x nhớ lại sự vô hiệu\n

10822
10:31:10,701 --> 10:31:13,822
Giống như việc đi tới hộp thư\nvà bỏ số 42 vào đó

10823
10:31:13,822 --> 10:31:16,732
thay vì lấy số\n50 ra như chúng tôi đã làm trước đây.

10824
10:31:18,411 --> 10:31:21,651
Có thể nói đây là nơi Binky bị mất đầu.

10825
10:31:24,042 --> 10:31:26,042
ĐỐI TƯỢNG: Chúng tôi chưa\phân bổ không gian cho nó.

10826
10:31:26,591 --> 10:31:28,502
Chúng tôi vẫn chưa phân bổ không gian cho y.

10827
10:31:28,502 --> 10:31:31,412
Không có đề cập đến malloc,\nkhông có sự phân công của y

10828
10:31:32,951 --> 10:31:35,801
Vì vậy, đây sẽ là, đi\nđến địa chỉ trong y

10829
10:31:35,802 --> 10:31:39,192
nhưng nếu không có địa chỉ nào được biết ở\n

10830
10:31:39,192 --> 10:31:42,122
có nghĩa là đi tới một địa chỉ ngẫu nhiên nào đó\n

10831
10:31:42,932 --> 10:31:47,582
điều đó có thể gây ra những gì chúng ta đã thấy trong\n

10832
10:31:47,582 --> 10:31:49,472
Bây giờ, may mắn thay,\là loại điều này

10833
10:31:49,472 --> 10:31:53,402
rằng nếu bạn không đủ tinh mắt\n

10834
10:31:53,402 --> 10:31:55,272
cũng có thể giúp bạn tìm thấy.

10835
10:31:55,271 --> 10:31:59,041
Nhưng đó chỉ là một ví dụ khác về\n

10836
10:31:59,042 --> 10:32:02,472
về việc có quyền kiểm soát ngay bây giờ\nngoài bộ nhớ ở cấp độ này.

10837
10:32:02,972 --> 10:32:04,805
Thôi, hãy tiếp tục\nvà làm một việc khác.

10838
10:32:04,805 --> 10:32:07,947
Xét từ tuần trước\nrằng khái niệm hoán đổi này

10839
10:32:07,947 --> 10:32:09,572
thực sự là một hoạt động thực sự phổ biến.

10840
10:32:09,572 --> 10:32:12,572
Chúng tôi đã mời tất cả tình nguyện viên đến\n

10841
10:32:12,572 --> 10:32:14,942
trong quá trình sắp xếp bong bóng và\nkể cả sắp xếp lựa chọn

10842
10:32:14,942 --> 10:32:17,042
và chúng tôi đã chấp nhận rằng hai người

10843
10:32:17,042 --> 10:32:18,974
con người sẽ tự trao đổi tốt thôi.

10844
10:32:18,974 --> 10:32:21,182
Nhưng cần phải có mã\nđể làm điều đó nếu bạn thực sự

10845
10:32:21,182 --> 10:32:24,999
triển khai sắp xếp bong bóng, sắp xếp lựa chọn,\n

10846
10:32:24,999 --> 10:32:26,582
Vì vậy, hãy xem xét một số mã như thế này.

10847
10:32:26,582 --> 10:32:28,652
Chúng tôi sẽ giữ mọi chuyện đơn giản\nnhư tuần trước và ở đâu

10848
10:32:28,652 --> 10:32:35,700
chúng tôi muốn trao đổi một số giá trị như\n

10849
10:32:35,699 --> 10:32:38,491
Vô hiệu vì tôi sẽ không quay lại\n

10850
10:32:39,391 --> 10:32:44,701
Ví dụ ở đây\ncó thể có một số mã cho việc này.

10851
10:32:44,701 --> 10:32:45,909
Nhưng tại sao nó lại phức tạp như vậy?

10852
10:32:45,910 --> 10:32:47,494
Ở đây, chúng ta hãy thực sự lùi lại một bước.

10853
10:32:48,661 --> 10:32:50,281
Tôi nghĩ chúng ta có thời gian\ncho một tình nguyện viên nữa.

10854
10:32:50,281 --> 10:32:51,739
Chúng ta có thể nhờ ai đó lên được không?

10855
10:32:51,739 --> 10:32:54,031
Bạn phải thoải mái\không có máy ảnh và bạn

10856
10:32:54,031 --> 10:32:57,061
được yêu cầu giúp đỡ việc-- ồ,\n

10857
10:32:57,061 --> 10:33:01,002
Vì vậy, bất cứ ai có\nbạn của họ làm việc này ở đây--

10858
10:33:01,982 --> 10:33:03,872
Bây giờ họ đang chỉ nó ở đây.

10859
10:33:03,872 --> 10:33:05,612
Bây giờ, theo đúng nghĩa đen, một cánh tay đang bị xoắn.

10860
10:33:25,002 --> 10:33:27,078
Bạn đang cố gắng tình nguyện cho ai?

10861
10:33:29,332 --> 10:33:33,652
Vậy nên chúng ta có Marina hai\n

10862
10:33:33,652 --> 10:33:35,182
chỉ để chúng siêu rõ ràng.

10863
10:33:35,182 --> 10:33:37,586
Và giả sử rằng vấn đề đang xảy ra, như tuần trước

10864
10:33:37,586 --> 10:33:40,461
nó chỉ là trao đổi hai giá trị, vì\n

10865
10:33:40,461 --> 10:33:42,472
hai người và chúng tôi muốn trao đổi họ.

10866
10:33:42,472 --> 10:33:45,862
Nhưng hãy xem xét những chiếc kính này\n

10867
10:33:45,862 --> 10:33:47,572
trong một mảng, và bạn biết gì không?

10868
10:33:47,572 --> 10:33:50,042
Tôi thực sự muốn bạn trao đổi các giá trị.

10869
10:33:50,042 --> 10:33:53,601
Vậy màu cam phải vào đó,\nvà màu tím phải vào đó.

10870
10:33:54,555 --> 10:33:56,722
Và chúng tôi sẽ xem liệu chúng tôi có thể\nchuyển nó sang mã hay không.

10871
10:34:02,472 --> 10:34:04,932
Vậy có lẽ bạn đang\tật khó khăn về mặt tinh thần

10872
10:34:04,932 --> 10:34:08,141
với cách bạn sẽ làm điều này mà không cần\n

10873
10:34:08,682 --> 10:34:11,552
Hãy để tôi tiếp tục và chúng ta có một\n

10874
10:34:11,552 --> 10:34:14,052
Vậy nếu tôi đưa cho bạn cái này,\nbạn sẽ giải quyết vấn đề này như thế nào bây giờ?

10875
10:34:16,542 --> 10:34:18,292
KHÁN GIẢ: Tôi muốn\nnhư thế, nhưng nó--

10876
10:34:18,292 --> 10:34:18,942
DAVID J. Malan: Không, đó là--

10877
10:34:20,232 --> 10:34:23,342
Hãy làm đi-- hãy làm theo bản năng của bạn.

10878
10:34:26,042 --> 10:34:28,171
Đi đến bất cứ điều gì bản năng của bạn.

10879
10:34:34,561 --> 10:34:37,188
Vâng, có một chút--\nnói đúng ra thì có lẽ

10880
10:34:37,188 --> 10:34:39,271
đáng lẽ không nên di chuyển\nkính chỉ vì điều đó

10881
10:34:39,271 --> 10:34:41,291
sẽ giống như việc di chuyển\ncác vị trí của mảng

10882
10:34:41,292 --> 10:34:43,972
vậy nên hãy thực sự làm điều đó một lần nữa nhưng bây giờ chiếc kính

10883
10:34:43,972 --> 10:34:45,722
phải quay lại nơi\nban đầu họ ở.

10884
10:34:45,722 --> 10:34:50,412
Vậy bây giờ bạn sẽ trao đổi những thứ này như thế nào,\nsử dụng biến tạm thời này?

10885
10:34:51,836 --> 10:34:54,461
Nếu không thì chúng ta sẽ hoàn toàn\nuproot mảng đó chẳng hạn

10886
10:34:54,461 --> 10:34:56,442
chỉ bằng cách di chuyển nó xung quanh.

10887
10:34:56,442 --> 10:34:58,932
Vậy là bạn đã chuyển quả cam vào\nbiến tạm thời này

10888
10:34:58,932 --> 10:35:01,271
sau đó bạn sao chép màu tím\nvào nơi có màu cam

10889
10:35:01,271 --> 10:35:03,641
và bây giờ, có lẽ là xuất sắc.

10890
10:35:03,641 --> 10:35:06,461
Màu cam sẽ kết thúc\nở nơi từng có màu tím

10891
10:35:06,461 --> 10:35:08,981
và biến tạm thời này\nit đã lưu trữ thêm một số bộ nhớ.

10892
10:35:08,982 --> 10:35:11,802
Vào thời điểm đó, điều đó là cần thiết,\nnhưng cuối cùng thì không cần thiết.

10893
10:35:11,802 --> 10:35:17,492
Nhưng một tràng pháo tay nếu chúng ta có thể,\n

10894
10:35:17,491 --> 10:35:21,671
Vậy thực tế là điều đó ngay lập tức xảy ra với Mariana

10895
10:35:21,671 --> 10:35:25,072
rằng bạn cần một số biến tạm thời\n

10896
10:35:25,072 --> 10:35:28,311
và thực tế là đoạn mã này ở đây\nmà bây giờ chúng ta có thể nhìn thoáng qua

10897
10:35:28,311 --> 10:35:30,398
gợi nhớ đến\chính xác thuật toán đó

10898
10:35:30,398 --> 10:35:33,231
trong đó A và B, ở cuối\n

10899
10:35:33,232 --> 10:35:35,242
Cũng giống như lần\nthứ hai, hai chiếc ly

10900
10:35:35,241 --> 10:35:37,641
thậm chí phải ở yên một chỗ\n

10901
10:35:37,641 --> 10:35:39,391
nhưng họ đang quay lại\nnơi họ đã ở

10902
10:35:39,391 --> 10:35:41,391
giống như có\nhai giá trị, A và B

10903
10:35:41,391 --> 10:35:44,451
và bạn chỉ có một biến\n tạm thời để sao chép A vào đó

10904
10:35:44,451 --> 10:35:47,691
sau đó bạn thay đổi A bằng\nB, sau đó bạn thay đổi

10905
10:35:47,692 --> 10:35:50,632
B với bất kỳ giá trị\nban đầu nào của A là

10906
10:35:50,631 --> 10:35:55,281
bởi vì bạn đã lưu nó tạm thời\n

10907
10:35:55,281 --> 10:35:59,521
Thật không may, mã này không nhất thiết phải hoạt động như dự kiến.

10908
10:35:59,521 --> 10:36:02,752
Vì vậy, hãy để tôi đi tới Mã\nVS của tôi ở đây và mở ra

10909
10:36:02,752 --> 10:36:06,021
một chương trình tên là swap.c,\nand trong swap.c, hãy

10910
10:36:06,021 --> 10:36:11,002
tôi làm cái gì đó thật nhanh\n

10911
10:36:12,921 --> 10:36:18,112
Bên trong main hãy để tôi làm gì đó\nnhư x được 1 và y được 2.

10912
10:36:18,112 --> 10:36:23,241
Hãy để tôi in ra\nsự xác nhận bằng hình ảnh rằng x là %i

10913
10:36:23,241 --> 10:36:28,252
y là %i dấu gạch chéo ngược n, cắm\nin x và y tương ứng.

10914
10:36:28,252 --> 10:36:31,432
Vậy hãy để tôi gọi một hàm hoán đổi\n

10915
10:36:31,432 --> 10:36:38,122
Hoán đổi x và y Sau đó để tôi in ra\n

10916
10:36:38,122 --> 10:36:41,692
chỉ để in lại chúng là gì,\n

10917
10:36:41,692 --> 10:36:44,855
2 lần đầu tiên, sau đó là 2, 1 lần thứ hai.

10918
10:36:44,855 --> 10:36:46,522
Bây giờ việc trao đổi sẽ được thực hiện như thế nào?

10919
10:36:46,521 --> 10:36:49,951
Hãy để tôi triển khai chính xác\nas trên màn hình lúc nãy.

10920
10:36:52,372 --> 10:36:54,862
hoặc hãy gọi nó là int A\nđể đảm bảo tính nhất quán, int B.

10921
10:36:54,862 --> 10:36:57,022
Nhưng tôi luôn có thể gọi\nnhững tên đó bất cứ thứ gì tôi muốn.

10922
10:36:57,021 --> 10:37:01,252
Int tmp được A, A được B, B được tmp.

10923
10:37:01,252 --> 10:37:04,341
Đúng như tôi đã đề xuất\na lúc trước, và chính xác

10924
10:37:04,341 --> 10:37:08,121
như Mariana đã thực sự thực hiện bằng cách sử dụng những ly nước này.

10925
10:37:08,122 --> 10:37:11,932
Bây giờ tôi cần đưa nguyên mẫu của mình vào,\n

10926
10:37:11,932 --> 10:37:15,622
Và tôi sẽ chỉ sao chép/dán nó lên đây,\n

10927
10:37:15,622 --> 10:37:18,832
Vì vậy, hãy thực hiện trao đổi-- cho đến nay, rất tốt-- trao đổi--

10928
10:37:18,832 --> 10:37:23,692
x bây giờ là 1, y là 2, x là 1, y là 2.

10929
10:37:23,692 --> 10:37:29,452
Vì vậy, có vẻ như có một chút\nlỗi ở đây, nhưng tại sao lại như vậy?

10930
10:37:29,451 --> 10:37:33,291
Mã này thực tế không hoạt động, thậm chí\n

10931
10:37:35,086 --> 10:37:41,600
ĐỐI TƯỢNG: Bởi vì A và B khác nhau\n

10932
10:37:41,599 --> 10:37:43,391
DAVID J. Malan: Tốt,\nvà hãy để tôi tóm tắt.

10933
10:37:43,391 --> 10:37:46,722
A và B quả thực có\nđịa chỉ khác nhau của x và y

10934
10:37:46,722 --> 10:37:50,322
và trên thực tế điều gì sẽ xảy ra khi bạn\n

10935
10:37:50,322 --> 10:37:54,582
đang gọi trao đổi, chuyển vào x và\ny, bạn đang gọi một hàm

10936
10:37:56,211 --> 10:37:57,972
Và đây là một thuật ngữ\nart chỉ có nghĩa là

10937
10:37:57,972 --> 10:38:02,682
bạn đang chuyển các bản sao của x và\n

10938
10:38:02,682 --> 10:38:06,912
A và B trong bối cảnh này\n

10939
10:38:06,911 --> 10:38:10,811
Về mặt kỹ thuật, những\ntên này chỉ mang tính địa phương.

10940
10:38:10,811 --> 10:38:13,572
Tôi có thể gọi cái này là x,\nTôi có thể gọi cái này là y

10941
10:38:13,572 --> 10:38:17,891
Lẽ ra tôi có thể đổi nó thành x,\n

10942
10:38:17,891 --> 10:38:19,391
Vấn đề vẫn còn đó.

10943
10:38:19,391 --> 10:38:23,322
Chỉ vì bạn sử dụng cùng tên\n

10944
10:38:23,322 --> 10:38:24,911
điều đó không có nghĩa là chúng giống nhau.

10945
10:38:24,911 --> 10:38:26,481
Họ chỉ trông giống nhau với bạn.

10946
10:38:26,482 --> 10:38:31,182
Nhưng thực sự, trao đổi sẽ nhận được bản sao\n

10947
10:38:33,822 --> 10:38:36,161
x và y sẽ là bản sao của bản gốc.

10948
10:38:36,161 --> 10:38:38,501
Vì vậy, để rõ ràng, hãy để tôi\nhoàn nguyên điều này về A và B

10949
10:38:38,502 --> 10:38:42,311
chỉ để làm rõ rằng họ\n

10950
10:38:42,311 --> 10:38:44,261
nhưng thực sự có vấn đề ở đó.

10951
10:38:44,262 --> 10:38:46,402
Chức năng này thực sự hoạt động tốt.

10952
10:38:47,722 --> 10:38:52,281
Hãy để tôi tiếp tục và in ra\bên trong cái này. printf A là %i

10953
10:38:52,281 --> 10:38:56,351
B là %i dấu gạch chéo ngược n và\nsau đó tôi sẽ in A và B.

10954
10:38:56,351 --> 10:38:59,561
Và hãy để tôi làm điều tương tự ở\n

10955
10:39:02,112 --> 10:39:06,101
Thực hiện trao đổi, ./swap,\nvà điều này đầy hứa hẹn.

10956
10:39:06,101 --> 10:39:12,731
Ban đầu x là 1, y là 2, A\nis 1, B là 2, A là 2, B là 1

10957
10:39:12,732 --> 10:39:14,959
nhưng không-- x là 1, y là 2.

10958
10:39:14,959 --> 10:39:17,292
Vì vậy, nếu có, tôi đã xác nhận\nrằng logic đó là đúng--

10959
10:39:17,292 --> 10:39:20,412
Logic của Mariana là đúng, nhưng\ncó điều gì đó về C.

10960
10:39:20,411 --> 10:39:24,281
Có điều gì đó về việc sử dụng một\n

10961
10:39:26,031 --> 10:39:30,381
Thực tế là tôi đang chuyển các bản sao của\n

10962
10:39:30,381 --> 10:39:31,752
Vậy thực tế chuyện gì đang xảy ra?

10963
10:39:31,752 --> 10:39:34,572
Một lần nữa, bên trong máy tính của bạn\n

10964
10:39:34,572 --> 10:39:36,447
và chúng ta đã nói\nvề chúng một cách trừu tượng

10965
10:39:36,447 --> 10:39:38,502
nó chỉ là lưới các vị trí bộ nhớ này.

10966
10:39:38,502 --> 10:39:41,703
Hóa ra\nmáy tính của bạn sử dụng bộ nhớ này

10967
10:39:41,703 --> 10:39:42,911
theo một cách khá thông thường.

10968
10:39:42,911 --> 10:39:46,991
Nó không chỉ là ngẫu nhiên, mà nó chỉ là\n

10969
10:39:46,991 --> 10:39:50,951
nó thực sự sử dụng các phần khác nhau của\n

10970
10:39:50,951 --> 10:39:54,341
Và bạn có quyền kiểm soát rất nhiều\n

10971
10:39:55,184 --> 10:39:56,891
Và hãy tiếp tục\nvà thu nhỏ từ đây

10972
10:39:56,891 --> 10:40:00,942
và xem xét điều đó trong\n máy tính của bạn

10973
10:40:00,942 --> 10:40:04,362
thực chất là lưu trữ ban đầu,\nall số 0 và số 1

10974
10:40:04,362 --> 10:40:08,362
mà bạn đã biên soạn ở trên cùng\n

10975
10:40:08,362 --> 10:40:11,592
Vì vậy khi bạn biên dịch một chương trình và\n

10976
10:40:11,591 --> 10:40:15,011
hoặc trên máy Mac hoặc PC, bạn nhấp đúp\nvào nó, trước tiên là máy tính--

10977
10:40:15,012 --> 10:40:20,141
hệ điều hành trước tiên-- tải tất cả\n

10978
10:40:20,141 --> 10:40:24,731
Mã máy chỉ thành một đoạn lớn\n

10979
10:40:24,732 --> 10:40:28,662
Bên dưới nó lưu trữ các biến toàn cục-- bất kỳ biến nào

10980
10:40:28,661 --> 10:40:32,543
bạn đã tạo trong chương trình của mình\n

10981
10:40:33,252 --> 10:40:35,052
Nói chung, phần trên cùng của tập tin của bạn.

10982
10:40:35,052 --> 10:40:36,995
Globals có xu hướng đi đầu ở đó.

10983
10:40:36,995 --> 10:40:39,912
Sau đó có đoạn ký ức này\n

10984
10:40:39,911 --> 10:40:42,311
và chúng tôi thấy từ đó\nmột thời gian ngắn trong kết quả của Valgin

10985
10:40:42,311 --> 10:40:45,941
và sau đó có\nbộ nhớ khác được gọi là ngăn xếp.

10986
10:40:45,942 --> 10:40:51,072
Và hóa ra là cho đến lúc này\n

10987
10:40:51,072 --> 10:40:56,322
Bất cứ khi nào bạn sử dụng biến cục bộ trong\n

10988
10:40:56,322 --> 10:41:00,042
Bất cứ khi nào bạn sử dụng malloc,\nbộ nhớ đó sẽ nằm trong vùng heap.

10989
10:41:00,042 --> 10:41:02,112
Bây giờ, như mũi tên gợi ý,\nđiều này thực sự có vẻ

10990
10:41:02,112 --> 10:41:05,194
giống như một vấn đề đang chờ xảy ra bởi vì\n

10991
10:41:05,194 --> 10:41:07,031
đống, và ngày càng nhiều\nvà nhiều ngăn xếp hơn nữa, đó là

10992
10:41:07,031 --> 10:41:09,762
giống như hai thứ đang lao xuống\n

10993
10:41:10,252 --> 10:41:11,502
Và đó thực sự là một vấn đề.

10994
10:41:11,502 --> 10:41:14,841
Nếu bạn đã từng nghe cụm từ\n

10995
10:41:14,841 --> 10:41:16,631
đây là nguồn gốc tên của nó.

10996
10:41:16,631 --> 10:41:18,881
Khi bạn bắt đầu sử dụng\nngày càng nhiều

10997
10:41:18,881 --> 10:41:21,161
bộ nhớ bằng cách gọi nhiều\nand rất nhiều chức năng

10998
10:41:21,161 --> 10:41:23,621
hoặc sử dụng rất nhiều\n biến cục bộ

10999
10:41:23,622 --> 10:41:25,872
bạn sử dụng rất nhiều bộ nhớ ngăn xếp này.

11000
10:41:25,872 --> 10:41:29,322
Hoặc nếu bạn sử dụng malloc nhiều và giữ\n

11001
10:41:29,322 --> 10:41:33,042
và thực sự không bao giờ hoặc hiếm khi gọi\n

11002
10:41:33,042 --> 10:41:36,881
và cuối cùng hai thứ này có thể\n

11003
10:41:37,932 --> 10:41:40,552
Chương trình sẽ bị lỗi hoặc\nđiều gì đó tồi tệ sẽ xảy ra.

11004
10:41:40,552 --> 10:41:43,332
Vì vậy, trách nhiệm của bạn\nlà đừng làm điều đó.

11005
10:41:43,332 --> 10:41:45,582
Nhưng đây là thiết kế,\nnói chung, của những gì

11006
10:41:45,582 --> 10:41:47,472
đang diễn ra bên trong\nbộ nhớ máy tính của bạn.

11007
10:41:47,472 --> 10:41:51,072
Tuy nhiên, bây giờ trong bộ nhớ đó,\ncó những quy ước nhất định

11008
10:41:51,072 --> 10:41:52,932
tập trung vào đây, ngăn xếp.

11009
10:41:52,932 --> 10:41:55,391
Và trên thực tế, hãy để tôi đi\nđến đây với một điểm đánh dấu

11010
10:41:55,391 --> 10:41:58,881
và nói rằng điều này đại diện cho\n

11011
10:41:58,881 --> 10:42:03,161
Và ở đây chúng ta có rất nhiều\n

11012
10:42:03,161 --> 10:42:05,451
đại diện cho một byte bộ nhớ\nvà cái này chẳng hạn

11013
10:42:05,451 --> 10:42:08,141
có thể đại diện cho bốn byte\tổng cộng-- đủ tốt cho một int

11014
10:42:09,472 --> 10:42:13,811
Vì vậy, trong mã gốc mà tôi đã viết\n

11015
10:42:13,811 --> 10:42:16,211
thực tế điều gì đang diễn ra\bên trong hàm hoán đổi?

11016
10:42:16,211 --> 10:42:20,262
Chúng ta có thể hình dung nó như thế này-- khi\n

11017
10:42:20,262 --> 10:42:23,862
vấn đề, main là hàm đầu tiên\n

11018
10:42:23,862 --> 10:42:27,372
nên tôi sẽ gắn nhãn\n

11019
10:42:27,372 --> 10:42:31,742
Và hai biến tôi\n là gì

11020
10:42:33,561 --> 10:42:35,761
Và mỗi cái trong số đó là một\nint, vậy là bốn byte

11021
10:42:35,762 --> 10:42:38,482
nên tôi cố ý\nđể dành bốn--

11022
10:42:38,482 --> 10:42:41,312
một khúc gỗ ở đây có dung lượng 4 byte.

11023
10:42:41,311 --> 10:42:45,261
Vậy hãy để tôi gọi đây là x, và tôi chỉ\n

11024
10:42:45,771 --> 10:42:49,791
Và sau đó tôi có biến y khác, và\n

11025
10:42:49,792 --> 10:42:54,002
Điều gì xảy ra khi các cuộc gọi chính hoán đổi\n

11026
10:42:54,002 --> 10:43:00,292
Chà, nó có hai biến\n

11027
10:43:00,292 --> 10:43:04,702
và B ban đầu là 2, nhưng nó\nha có biến thứ ba, tmp

11028
10:43:04,701 --> 10:43:07,731
là một biến cục bộ cùng với các đối số A và B

11029
10:43:07,732 --> 10:43:12,292
đã được chuyển vào nên tôi sẽ đi\n

11030
10:43:12,292 --> 10:43:13,516
Và giá trị của tmp là gì?

11031
10:43:13,516 --> 10:43:15,141
Vâng, chúng ta phải nhìn lại mã.

11032
10:43:15,141 --> 10:43:19,792
tmp ban đầu nhận giá trị của A.\n

11033
10:43:21,502 --> 10:43:23,961
Đó là bước một trong chương trình\nba dòng của tôi.

11034
10:43:23,961 --> 10:43:27,981
Được rồi, A bằng B. Vậy là được gán\n

11035
10:43:27,982 --> 10:43:31,612
vào A Vậy B là 2, A là\nthế này, vậy để mình đi trước

11036
10:43:31,612 --> 10:43:33,722
và xóa cái này và chỉ ghi đè lên cái kia.

11037
10:43:33,722 --> 10:43:37,252
Vì vậy, tại thời điểm này trong câu chuyện\nbạn có hai bản sao của hai

11038
10:43:37,252 --> 10:43:40,072
vậy thì cũng không sao, vì\ndòng mã thứ ba

11039
10:43:40,072 --> 10:43:43,101
nói tmp được sao chép\nvào B. Vậy tmp--

11040
10:43:43,101 --> 10:43:48,531
1, được sao chép vào B, vậy hãy để\ntôi ghi đè số 2 này bằng số 1

11041
10:43:50,182 --> 10:43:53,302
Thật không may, mã đã kết thúc.

11042
10:43:53,302 --> 10:43:56,872
trao đổi thực sự không làm gì cả\n

11043
10:43:56,872 --> 10:43:58,882
là tôi có thể đã có một giá trị trả về.

11044
10:43:58,881 --> 10:44:01,101
Tôi có thể vào đó\nvà đổi void thành int

11045
10:44:01,101 --> 10:44:02,871
nhưng tôi sẽ quay lại cái nào?

11046
10:44:04,582 --> 10:44:06,992
Toàn bộ mục tiêu là\nshoán đổi hai giá trị và nó

11047
10:44:06,991 --> 10:44:08,991
có vẻ hơi khập khiễng nếu bạn\nkhông thể viết một hàm

11048
10:44:08,991 --> 10:44:12,021
làm điều gì đó thông thường trong các thuật toán sắp xếp\ntuần trước

11049
10:44:14,902 --> 10:44:18,112
Chà, mặc dù khi\nchương trình này bắt đầu chạy

11050
10:44:18,112 --> 10:44:21,351
main đang sử dụng đoạn bộ nhớ này\n

11051
10:44:21,351 --> 10:44:24,021
và chồng này giống như\na chồng khay ở quán cà phê--

11052
10:44:25,561 --> 10:44:27,651
Đây là bộ nhớ chính trên ngăn xếp.

11053
10:44:27,652 --> 10:44:29,932
Đây là\nbộ nhớ của hàm hoán đổi trên ngăn xếp.

11054
10:44:29,932 --> 10:44:32,601
Nó đang sử dụng ba số nguyên thay vì hai--

11055
10:44:34,311 --> 10:44:37,822
Điều gì xảy ra khi hàm\n

11056
10:44:37,822 --> 10:44:41,061
Loại ký ức\nđây là ký ức của sự hoán đổi sẽ biến mất

11057
10:44:41,061 --> 10:44:42,651
và các giá trị rác còn lại.

11058
10:44:42,652 --> 10:44:46,891
Vì vậy, thật đáng yêu, chúng ta loại bỏ\nnhững giá trị này ở đây

11059
10:44:46,891 --> 10:44:51,351
và vẫn còn dữ liệu ở đó--\n

11060
10:44:51,351 --> 10:44:54,951
vẫn còn đó trong máy tính\n

11061
10:44:54,951 --> 10:44:56,701
bởi vì chức năng hiện đã trở lại.

11062
10:44:56,701 --> 10:44:59,781
Vậy là họ vẫn còn ở đó và cái này\n

11063
10:44:59,781 --> 10:45:03,141
tại sao lại có những thứ khác trong bộ nhớ\n

11064
10:45:03,982 --> 10:45:06,432
Đôi khi bạn đã đặt\nit ở đó, nhưng bây giờ một lần

11065
10:45:06,432 --> 10:45:10,072
trao đổi trả về, bạn chỉ nên\nchạm vào bộ nhớ bên trong main.

11066
10:45:10,072 --> 10:45:14,362
Nhưng chúng tôi chưa bao giờ thực sự\ncopy một giá trị vào main.

11067
10:45:14,362 --> 10:45:18,022
Chúng tôi chưa trả lại bất cứ thứ gì và chúng tôi\n

11068
10:45:19,652 --> 10:45:23,662
Chà, điều gì sẽ xảy ra nếu thay vào đó chúng ta chuyển\ninto hoán đổi không phải bản sao của x và y

11069
10:45:23,661 --> 10:45:28,041
gọi họ là A và B. Điều gì sẽ xảy ra nếu họ\n

11070
10:45:28,042 --> 10:45:31,222
một loại bản đồ kho báu\nsẽ dẫn đến việc trao đổi với x thực tế

11071
10:45:32,601 --> 10:45:36,411
Ngày nay chúng ta có\nkhả năng đó bằng cách sử dụng con trỏ.

11072
10:45:36,411 --> 10:45:40,281
Vì vậy, giả sử chúng ta\nsử dụng mã này để thay thế.

11073
10:45:40,281 --> 10:45:43,192
Có rất nhiều ngôi sao\nở đây, điều này hơi khó chịu

11074
10:45:43,192 --> 10:45:45,862
nhưng hãy xem xét điều chúng ta đang cố gắng đạt được.

11075
10:45:45,862 --> 10:45:50,752
Điều gì sẽ xảy ra nếu chúng ta chuyển vào không phải x và y, mà là\n

11076
10:45:50,752 --> 10:45:52,862
tương ứng--\nmẩu bánh mì, nếu bạn muốn--

11077
10:45:52,862 --> 10:45:55,881
điều đó sẽ dẫn đến việc hoán đổi về\ncác giá trị ban đầu.

11078
10:45:55,881 --> 10:45:59,691
Sau đó, điều chúng ta làm là chúng ta vẫn\ngung cấp cho mình một biến tmp

11079
10:46:00,711 --> 10:46:03,051
Nó vẫn là một cái ly nên\nchúng ta vẫn gọi nó là int

11080
10:46:03,052 --> 10:46:05,432
nhưng chúng ta muốn đặt\nvào biến tạm thời đó cái gì?

11081
10:46:05,432 --> 10:46:08,014
Chúng tôi không muốn thêm A vào đó,\nvì giờ đây đó là một địa chỉ.

11082
10:46:08,014 --> 10:46:10,731
Chúng tôi muốn đi đến\nđịa chỉ đó theo dấu sao

11083
10:46:10,732 --> 10:46:12,502
và đặt bất cứ thứ gì vào địa chỉ đó.

11084
10:46:13,741 --> 10:46:17,481
Chà, sau đó chúng tôi muốn sao chép\nvào bất cứ thứ gì ở vị trí A

11085
10:46:17,482 --> 10:46:20,272
chúng tôi muốn sao chép sang\nnội dung của vị trí A

11086
10:46:20,271 --> 10:46:24,471
bất kể nội dung\ncủa vị trí B là gì và cuối cùng, chúng tôi

11087
10:46:24,472 --> 10:46:27,622
muốn sao chép tmp vào\nbất cứ thứ gì ở vị trí B.

11088
10:46:27,622 --> 10:46:31,510
Một lần nữa, chúng tôi đang cố ý\giới thiệu tất cả những ngôi sao này

11089
10:46:31,510 --> 10:46:33,802
bởi vì chúng tôi không muốn\nthay đổi bất kỳ địa chỉ nào trong số này

11090
10:46:33,802 --> 10:46:37,222
chúng tôi muốn đi đến những địa chỉ này\ntheo toán tử tham chiếu

11091
10:46:37,222 --> 10:46:41,582
và đặt các giá trị ở đó\cũng như không nhận các giá trị từ đó.

11092
10:46:41,582 --> 10:46:43,052
Vậy điều này thực sự có ý nghĩa gì?

11093
10:46:43,052 --> 10:46:47,362
Chà, nếu tôi tua lại câu chuyện này\n

11094
10:46:47,362 --> 10:46:53,031
mặc dù tôi định xóa nó\n

11095
10:46:53,031 --> 10:46:56,481
và tôi vẫn có A, nhưng\nđiều gì sẽ khác

11096
10:46:56,482 --> 10:47:00,412
lần này là cách tôi sử dụng A và B.\nHãy để tôi xóa chúng xong.

11097
10:47:00,411 --> 10:47:02,541
Đó là A ở bên trái,\nđây là B ở bên phải.

11098
10:47:02,542 --> 10:47:05,061
Tại thời điểm này trong\ncâu chuyện, chúng tôi đang chạy lại trao đổi

11099
10:47:05,061 --> 10:47:08,511
với phiên bản mới và cải tiến này,\nvà hãy xem điều gì sẽ xảy ra.

11100
10:47:08,512 --> 10:47:12,232
Chà, x có lẽ đang ở một địa chỉ nào đó.

11101
10:47:12,232 --> 10:47:15,712
Có lẽ nó giống như 0x123 như mọi khi.

11102
10:47:15,711 --> 10:47:18,832
Vậy thì A nhận được gì\nkhi tôi sử dụng mã này?

11103
10:47:28,012 --> 10:47:33,641
Chà, tôi sẽ đặt 0x456,\nvà tôi sẽ làm gì?

11104
10:47:33,641 --> 10:47:35,832
Dựa trên ba\ndòng mã này, tôi sẽ

11105
10:47:35,832 --> 10:47:40,031
để lưu trữ trong tmp bất cứ thứ gì có ở\n

11106
10:47:40,031 --> 10:47:43,061
Đó là thứ này ở đây, vì vậy\nTôi sẽ đặt 1 vào tmp.

11107
10:47:43,061 --> 10:47:45,612
Dòng hai-- Tôi sẽ chuyển sang dòng B--

11108
10:47:45,612 --> 10:47:48,491
được rồi, B là 456, vậy\ntôi sẽ tới B và tôi

11109
10:47:48,491 --> 10:47:53,292
sẽ lưu trữ 2 ở bất cứ vị trí nào ở vị trí A và ở vị trí A

11110
10:47:53,292 --> 10:47:56,572
là 123, vậy nó là thế này,\nvậy tôi sẽ làm gì?

11111
10:47:56,572 --> 10:47:59,262
Tôi sẽ thay đổi 1 thành 2.

11112
10:47:59,262 --> 10:48:01,992
Dòng mã cuối cùng-- lấy\ngiá trị của tmp, là 1

11113
10:48:01,991 --> 10:48:07,091
và sau đó đặt nó vào bất cứ thứ gì\n

11114
10:48:07,091 --> 10:48:11,651
và thay đổi nó thành giá trị\ncủa tmp, tmp, đặt 1 ở đây.

11115
10:48:12,881 --> 10:48:14,441
Vẫn không có giá trị trả về.

11116
10:48:14,442 --> 10:48:17,742
trao đổi trả về, có nghĩa là\nba biến tạm thời này

11117
10:48:19,451 --> 10:48:21,831
Chúng có thể được sử dụng lại bởi\ncác lệnh gọi hàm tiếp theo

11118
10:48:21,832 --> 10:48:26,452
nhưng bây giờ, tôi thực sự đã\nhoán đổi giá trị của x và y.

11119
10:48:26,451 --> 10:48:30,401
Điều đó có nghĩa là điều gì đến một cách tự nhiên\n

11120
10:48:30,402 --> 10:48:33,882
không hoàn toàn đơn giản\nđược thực hiện trong C bởi vì một lần nữa

11121
10:48:33,881 --> 10:48:36,221
các chức năng được tách biệt với nhau.

11122
10:48:36,222 --> 10:48:39,502
Bạn có thể chuyển các giá trị nhưng bạn sẽ nhận được bản sao của các giá trị đó.

11123
10:48:39,502 --> 10:48:44,052
Nếu bạn muốn một chức năng ảnh hưởng đến\n

11124
10:48:44,052 --> 10:48:47,382
bạn phải 1, hiểu\nchuyện gì đang xảy ra nhưng 2

11125
10:48:47,381 --> 10:48:50,331
chuyển mọi thứ vào đây bằng một con trỏ ở đây.

11126
10:48:50,332 --> 10:48:53,921
Vì vậy, nếu tôi quay lại mã của mình ở đây,\n

11127
10:48:53,921 --> 10:48:56,021
Hãy để tôi loại bỏ những printf thừa này.

11128
10:48:56,021 --> 10:48:58,752
Hãy để tôi đi vào và thêm tất cả những ngôi sao này.

11129
10:48:58,752 --> 10:49:02,771
Vì vậy tôi sẽ hủy tham chiếu những địa chỉ\thực tế này ở đây và ở đây

11130
10:49:02,771 --> 10:49:05,182
và tôi phải thực hiện thêm một thay đổi nữa.

11131
10:49:05,182 --> 10:49:11,741
Bây giờ làm cách nào để gọi trao đổi nếu trao đổi là\n

11132
10:49:11,741 --> 10:49:14,801
Tức là địa chỉ của một int\nvà địa chỉ của một int khác.

11133
10:49:14,802 --> 10:49:17,292
Tôi phải thay đổi gì ở dòng 11 ở đây?

11134
10:49:25,591 --> 10:49:28,411
DAVID J. Malan: Xin lỗi,\nđịa chỉ của người điều hành.

11135
10:49:28,411 --> 10:49:33,091
Vì vậy, ở dòng 11, chúng ta viết\nampersand x và ampersand y.

11136
10:49:33,091 --> 10:49:36,361
Vì vậy, về mặt kỹ thuật, chúng tôi đang chuyển bản sao của một giá trị

11137
10:49:36,362 --> 10:49:39,241
nhưng lần này bản sao chúng tôi đang chuyển\n

11138
10:49:39,241 --> 10:49:42,631
và ngay khi chúng ta có địa chỉ,\n

11139
10:49:42,631 --> 10:49:45,932
ngón tay sủi bọt-- tôi có thể chỉ vào\n

11140
10:49:45,932 --> 10:49:49,921
và thực sự nhận được một giá trị từ\n

11141
10:49:52,182 --> 10:49:56,912
Vì vậy, hãy bắt chéo ngón tay của chúng ta\nbây giờ và thực hiện trao đổi, Enter.

11142
10:49:56,911 --> 10:49:58,081
Ôi trời, nhiều lỗi quá.

11143
10:49:58,082 --> 10:50:00,242
Ồ, tôi không nhớ\nđã thay đổi nguyên mẫu của mình

11144
10:50:00,241 --> 10:50:03,781
vậy hãy để tôi đi lên đây\nthêm hai ngôi sao nữa vì tôi

11145
10:50:05,161 --> 10:50:10,322
Thực hiện trao đổi, ./swap và viola--\nbây giờ tôi thực sự đã trao đổi.

11146
10:50:17,021 --> 10:50:19,851
Được rồi, vậy chúng ta có thể làm gì hơn nữa đây?

11147
10:50:19,851 --> 10:50:24,822
Chà, hãy để tôi xem xét\nrằng suốt thời gian qua chúng ta đã

11148
10:50:24,822 --> 10:50:29,052
đã cố tình sử dụng\nGetString và GetInt và GetFloat

11149
10:50:29,052 --> 10:50:30,472
vân vân, nhưng vì một lý do.

11150
10:50:30,472 --> 10:50:33,430
Đây không chỉ là bánh xe phụ\n

11151
10:50:33,430 --> 10:50:36,432
chúng thực sự có sẵn\nđể làm cho mã của bạn an toàn hơn.

11152
10:50:36,432 --> 10:50:40,872
Và để minh họa điều này, hãy để tôi đi\n

11153
10:50:40,872 --> 10:50:45,222
Thế còn một tệp có tên scanf.c.

11154
10:50:45,222 --> 10:50:48,252
Hóa ra là cách\ntrường học cũ-- cách trong C

11155
10:50:48,252 --> 10:50:52,512
thực sự là nhận thông tin đầu vào của người dùng\nis thông qua các chức năng như scanf

11156
10:50:52,512 --> 10:50:56,112
và để tôi tiếp tục thêm\nstdio.h, int main(void)

11157
10:50:56,112 --> 10:50:59,802
và không sử dụng thư viện CS50 tại\n

11158
10:51:00,972 --> 10:51:03,522
Hãy để tôi đặt cho mình một int tên là x.

11159
10:51:03,521 --> 10:51:07,436
Để tôi in ra giá trị của\n

11160
10:51:07,436 --> 10:51:10,722
hay đúng hơn, hãy hỏi người dùng\ngiá trị bằng cách yêu cầu họ cung cấp x.

11161
10:51:10,722 --> 10:51:14,141
Và tôi sẽ sử dụng một hàm\n

11162
10:51:14,141 --> 10:51:20,711
trong một số nguyên sử dụng %i, và tôi sẽ đi\n

11163
10:51:22,667 --> 10:51:25,542
Sau đó tôi sẽ tiếp tục và,\n

11164
10:51:25,542 --> 10:51:29,592
Tôi sẽ in ra với %i\n

11165
10:51:29,591 --> 10:51:32,681
Được rồi, vậy thì mã kiểu dòng 8\nis tuần 1.

11166
10:51:32,682 --> 10:51:36,351
Dòng năm và sáu là mã kiểu tuần 1.

11167
10:51:36,351 --> 10:51:41,771
Vậy sự tò mò ngày hôm nay là dòng mới này.\n

11168
10:51:43,332 --> 10:51:46,031
Tôi đang sử dụng cùng một cú pháp\nmà tôi sử dụng cho printf

11169
10:51:46,031 --> 10:51:49,451
đó là một chút manh mối-- a\n

11170
10:51:49,451 --> 10:51:52,391
muốn quét, nghĩa là đọc\ntừ bàn phím của con người--

11171
10:51:52,391 --> 10:51:55,932
và tôi đang bảo nó nên đặt\nbất cứ thứ gì con người gõ vào.

11172
10:51:55,932 --> 10:51:59,682
Tôi không thể chỉ nói x, vì chúng tôi gặp phải\n

11173
10:51:59,682 --> 10:52:02,171
Tôi phải cung cấp một ít\nbreadcrumb cho biến

11174
10:52:02,171 --> 10:52:05,472
nơi tôi muốn scanf nhập số nguyên của con người.

11175
10:52:05,472 --> 10:52:08,902
Và do đó, điều này chỉ yêu cầu\nmáy tính lấy int.

11176
10:52:08,902 --> 10:52:11,141
Về cơ bản đây là những gì bạn phải gõ

11177
10:52:11,141 --> 10:52:14,052
trong tuần 1 chỉ để nhận\nan int từ người dùng

11178
10:52:14,052 --> 10:52:16,902
và vẫn còn rất nhiều\nđiều có thể sai sót

11179
10:52:16,902 --> 10:52:20,292
nhưng đó là cú pháp khó hiểu mà chúng tôi\n

11180
10:52:20,292 --> 10:52:22,241
Hãy để tôi tiếp tục và thực hiện scanf ở đây--

11181
10:52:25,302 --> 10:52:27,252
Đặt dấu chấm phẩy sai chỗ.

11182
10:52:30,641 --> 10:52:32,036
Non void không trả về giá trị.

11183
10:52:42,332 --> 10:52:45,312
Tôi sẽ gõ vào một số như\n

11184
10:52:45,311 --> 10:52:49,542
Vậy đó là cách truyền thống\n

11185
10:52:49,542 --> 10:52:53,012
Tuy nhiên, vấn đề là khi bạn\n

11186
10:52:54,482 --> 10:52:56,650
Hãy để tôi xóa tất cả\nthứ này và dành cho chính mình

11187
10:52:56,650 --> 10:52:59,192
một chuỗi s, mặc dù hãy đợi một\nphút-- chúng tôi không gọi nó là chuỗi

11188
10:52:59,192 --> 10:53:02,252
nữa-- char star để lưu trữ một chuỗi.

11189
10:53:02,252 --> 10:53:06,091
Sau đó, hãy để tôi tiếp tục và chỉ nhắc\n

11190
10:53:06,091 --> 10:53:10,891
Vậy để tôi tiếp tục và sử dụng scanf, hỏi\n

11191
10:53:10,891 --> 10:53:13,572
và lưu trữ nó tại địa chỉ đó.

11192
10:53:13,572 --> 10:53:16,112
Sau đó, hãy để tôi tiếp tục và in\nra bất cứ điều gì con người đã gõ

11193
10:53:16,112 --> 10:53:19,002
chỉ bằng cách sử dụng cùng một ký hiệu.

11194
10:53:19,002 --> 10:53:24,152
Vì vậy, ở đây, dòng năm cũng giống như vậy\n

11195
10:53:24,152 --> 10:53:26,552
lớp đó hôm nay nên nó là char star s.

11196
10:53:26,552 --> 10:53:31,352
Đây chỉ là tuần một,\nchỉ là tuần một, dòng bảy là mới.

11197
10:53:31,351 --> 10:53:37,171
scanf cũng sẽ đọc từ\n của con người

11198
10:53:37,171 --> 10:53:39,002
Nhưng không sao cả, vì s là một địa chỉ.

11199
10:53:39,002 --> 10:53:41,912
Đúng là không làm dấu và.

11200
10:53:42,811 --> 10:53:47,432
Một chuỗi đã và luôn\nlà một ngôi sao char, hay còn gọi là chuỗi.

11201
10:53:47,432 --> 10:53:49,451
Tuy nhiên, vấn đề phát sinh như sau--

11202
10:53:51,771 --> 10:53:53,271
ôi Chúa ơi, tôi đã làm gì sai--

11203
10:53:53,271 --> 10:53:55,791
Tôi không thể-- OK, chúng tôi đã có sẵn một số\nphòng thủ nhất định.

11204
10:53:55,792 --> 10:54:02,241
Hãy để tôi thực hiện tiếng kêu của scanf.c, một\nđầu ra của chương trình có tên scanf.

11205
10:54:02,241 --> 10:54:05,199
Được rồi, vậy là tôi đang vượt qua\nmột số biện pháp bảo vệ sư phạm của chúng ta

11206
10:54:05,199 --> 10:54:06,531
mà chúng tôi có sẵn với make.

11207
10:54:06,531 --> 10:54:11,121
Bây giờ hãy để tôi chạy bản scanf của phiên bản này,\n

11208
10:54:15,701 --> 10:54:18,521
Vậy là nó thậm chí còn không lưu trữ thứ gì đó\n

11209
10:54:18,521 --> 10:54:22,182
Lần này là chữ thường,\nnhưng điều đó có liên quan phần nào.

11210
10:54:22,182 --> 10:54:26,921
Về cơ bản, tôi\nđã làm gì sai ở đây?

11211
10:54:26,921 --> 10:54:29,051
Tại sao điều này ngày càng trở nên nguy hiểm hơn?

11212
10:54:29,052 --> 10:54:30,832
Và hãy để tôi minh họa\nđiểm này nhiều hơn nữa.

11213
10:54:30,832 --> 10:54:34,101
Điều gì sẽ xảy ra nếu tôi gõ vào không chỉ thứ gì đó\n

11214
10:54:34,101 --> 10:54:39,941
Nếu tôi thích thì sao, xin chàooooo và\n

11215
10:54:45,451 --> 10:54:48,631
Đúng, một chuỗi dài,\không ngờ lại dài đến thế.

11216
10:54:48,631 --> 10:54:50,491
Đây là chủ nghĩa không xác định đang phát huy tác dụng.

11217
10:54:51,781 --> 10:54:53,614
Tôi đang cố kích hoạt lỗi phân đoạn\na

11218
10:54:53,614 --> 10:54:56,851
nhưng điều đó sẽ không xảy ra, nhưng\nvấn đề vẫn còn đó.

11219
10:54:56,851 --> 10:55:01,542
Nó vẫn không hoạt động, nhưng có chuyện gì vậy\n

11220
10:55:01,542 --> 10:55:03,211
và nó không lưu trữ thông tin đầu vào thực tế của tôi?

11221
10:55:04,091 --> 10:55:06,026
ĐỐI TƯỢNG: Bạn có phải tạo khoảng trống không?

11222
10:55:06,027 --> 10:55:07,902
DAVID J. Malan: Chúng ta phải\ndành chỗ cho nó.

11223
10:55:07,902 --> 10:55:11,141
Vì vậy, thứ chúng ta đang thiếu ở đây là\nmalloc hoặc thứ gì đó tương tự.

11224
10:55:11,141 --> 10:55:14,101
Vì thế tôi có thể làm điều đó, tôi có thể\nlàm điều gì đó như thế này.

11225
10:55:14,101 --> 10:55:16,801
Chà, hãy để con người gõ\nanh ít nhất một từ có ba chữ cái

11226
10:55:16,802 --> 10:55:20,942
vì vậy tôi có thể thực hiện malloc bằng 3\nplus 1 cho ký tự null.

11227
10:55:20,942 --> 10:55:25,322
Vậy hãy để tôi cho họ bốn ký tự,\n

11228
10:55:26,281 --> 10:55:28,442
Không, xin lỗi. kêu vang, tôi phải--

11229
10:55:29,582 --> 10:55:36,171
Ồ, bao gồm stdlib.h-- chúng ta bắt đầu.

11230
10:55:36,171 --> 10:55:39,197
Điều đó mang lại cho tôi malloc, bây giờ tôi\n

11231
10:55:39,197 --> 10:55:42,322
bây giờ tôi sẽ chạy lại nó, và bây giờ tôi\n

11232
10:55:43,701 --> 10:55:47,421
Và bây giờ hãy để tôi hung hăng một chút\n

11233
10:55:47,421 --> 10:55:49,461
Vẫn hoạt động, nhưng tôi đang gặp may mắn.

11234
10:55:53,031 --> 10:55:55,355
Chết tiệt, nó vẫn hoạt động.

11235
10:55:56,451 --> 10:55:58,650
Nhưng thực ra-- không hoàn toàn như vậy.

11236
10:55:58,650 --> 10:56:00,771
Có điều gì đó kỳ lạ đang diễn ra ở đó rồi.

11237
10:56:00,771 --> 10:56:02,371
Hóa ra tôi cũng có thể làm được điều này.

11238
10:56:02,372 --> 10:56:05,751
Thực ra tôi có thể nói\nchar ngôi sao bốn và tự cho mình

11239
10:56:05,750 --> 10:56:07,041
một mảng gồm bốn ký tự.

11240
10:56:07,042 --> 10:56:08,461
Hãy để tôi thử điều này một lần nữa.

11241
10:56:08,461 --> 10:56:12,021
Vậy hãy để tôi chạy lại clang ./scanf.

11242
10:56:12,021 --> 10:56:16,820
Xin chàooooo, rõ ràng là vượt quá\n4 ký tự--

11243
10:56:22,182 --> 10:56:24,703
Tuy nhiên, vấn đề ở đây là\nnếu chúng tôi không cung cấp cho bạn GetInt

11244
10:56:24,703 --> 10:56:27,161
bạn sẽ phải sử dụng\nscanf-- không phải là vấn đề lớn

11245
10:56:28,432 --> 10:56:31,682
Nhưng nếu chúng tôi không đưa cho bạn GetString thì bạn\n

11246
10:56:31,682 --> 10:56:34,842
đã biết về malloc rồi hoặc\n

11247
10:56:34,841 --> 10:56:36,911
và thậm chí bây giờ vẫn còn có mối nguy hiểm.

11248
10:56:36,911 --> 10:56:41,112
Nếu con người gõ vào năm chữ cái,\n

11249
10:56:41,112 --> 10:56:44,862
giống như kiểu nhập Xin chào, sẽ\n

11250
10:56:44,862 --> 10:56:46,842
Vì vậy GetString cũng đã\nchức năng này được xây dựng

11251
10:56:46,841 --> 10:56:49,150
ở nơi chúng tôi có một vòng lặp\nfancy bên trong như vậy

11252
10:56:49,150 --> 10:56:53,682
mà chúng tôi phân bổ bằng cách sử dụng malloc as\n

11253
10:56:53,682 --> 10:56:55,631
và về cơ bản chúng tôi sử dụng malloc\ncho mỗi lần nhấn phím.

11254
10:56:55,631 --> 10:57:00,461
Ngay lúc bạn gõ h-e-l-l-o, chúng ta\n

11255
10:57:00,461 --> 10:57:04,932
phân bổ ngày càng nhiều bộ nhớ để\n

11256
10:57:04,932 --> 10:57:07,661
GetString mặc dù\nit rất dễ bị bẻ khóa--

11257
10:57:07,661 --> 10:57:10,811
điều này dễ làm hỏng mã của bạn\nviệc sử dụng scanf nếu bạn lại

11258
10:57:10,811 --> 10:57:13,481
đã làm điều đó mà không cần sự trợ giúp của thư viện.

11259
10:57:13,482 --> 10:57:15,539
Vậy tất cả chúng ta sẽ đi đâu với điều này?

11260
10:57:15,538 --> 10:57:17,621
Chà, để tôi chỉ cho bạn\nmột vài ví dụ cuối cùng sẽ

11261
10:57:17,622 --> 10:57:19,961
mở đường cho những gì\nsẽ là vấn đề thứ tư.

11262
10:57:19,961 --> 10:57:23,122
Hãy để tôi tiếp tục và mở\nup từ mã ngày hôm nay--

11263
10:57:23,122 --> 10:57:25,241
có sẵn trên\ntrang web của khóa học--

11264
10:57:25,241 --> 10:57:32,202
ví dụ: một chương trình như\nnày, có tên là phonebook.c

11265
10:57:32,201 --> 10:57:34,900
và tôi sẽ cho\nbạn xem nhanh nó

11266
10:57:34,900 --> 10:57:37,862
mà bạn sẽ xem thêm chi tiết trong\n

11267
10:57:37,862 --> 10:57:40,570
Chúng tôi sắp giới thiệu một vài\n

11268
10:57:40,571 --> 10:57:43,812
Bạn sẽ thấy một hàm có tên\n

11269
10:57:43,811 --> 10:57:47,203
và cần có hai đối số--\n

11270
10:57:47,203 --> 10:57:50,411
mà bạn có thể thao tác trong Excel hoặc\n

11271
10:57:50,411 --> 10:57:55,211
các giá trị được phân tách và sau đó là thứ gì đó\n

11272
10:57:55,211 --> 10:57:58,150
W để ghi, tùy thuộc vào việc\nbạn có muốn thêm vào tệp hay không

11273
10:57:58,150 --> 10:58:00,682
chỉ cần mở nó ra, hoặc thay đổi nó.

11274
10:58:00,682 --> 10:58:03,192
Chúng tôi sắp giới thiệu\ncho bạn một con trỏ tệp.

11275
10:58:03,192 --> 10:58:05,031
Bạn sẽ thấy tập tin vốn đó--

11276
10:58:05,031 --> 10:58:07,631
điều này hơi khác thường một chút\-- tập tin viết hoa là

11277
10:58:07,631 --> 10:58:10,481
một con trỏ tới một tập tin thực tế\không phải ổ cứng của máy tính

11278
10:58:10,482 --> 10:58:13,001
để bạn thực sự có thể truy cập\nthứ gì đó như tệp CSV

11279
10:58:14,351 --> 10:58:16,661
Và chúng ta sẽ thấy\nbên dưới rằng bạn cũng

11280
10:58:16,661 --> 10:58:20,411
sẽ có khả năng viết\n

11281
10:58:20,411 --> 10:58:24,341
Bạn sẽ thấy các hàm như\nprintf printf cho tệp printf.

11282
10:58:24,341 --> 10:58:29,471
Hoặc fwrite-- ghi tập tin-- mà bây giờ\n

11283
10:58:29,472 --> 10:58:33,311
bạn sẽ có khả năng\thực tế không chỉ đọc các tập tin--

11284
10:58:33,311 --> 10:58:36,830
tệp văn bản, hình ảnh,\nnhững thứ khác-- nhưng cũng có thể ghi chúng ra.

11285
10:58:36,830 --> 10:58:42,281
Trên thực tế, chẳng hạn, chỉ như một đoạn giới thiệu\n

11286
10:58:42,281 --> 10:58:44,682
chúng tôi tập trung vào tuần này\nchúng tôi cung cấp cho bạn hình ảnh pháp y

11287
10:58:44,682 --> 10:58:47,351
và mục tiêu của bạn là\nkhôi phục càng nhiều ảnh càng tốt

11288
10:58:47,351 --> 10:58:51,012
từ hình ảnh pháp y này của một\n

11289
10:58:51,012 --> 10:58:54,432
Và cách bạn sẽ làm\nđiều đó là biết trước

11290
10:58:54,432 --> 10:58:58,932
rằng mọi JPEG trên thế giới đều bắt đầu\n

11291
10:58:58,932 --> 10:59:01,161
ở dạng thập lục phân, nhưng ba số này.

11292
10:59:01,161 --> 10:59:03,881
Và trên thực tế, như\na đoạn giới thiệu, hãy để tôi mở ra

11293
10:59:03,881 --> 10:59:07,061
một ví dụ bạn sẽ thấy trên trang web của khóa học hôm nay.

11294
10:59:07,061 --> 10:59:09,796
Nếu tôi cuộn qua đây,\nbạn sẽ thấy một chương trình

11295
10:59:09,796 --> 10:59:11,421
điều đó thực hiện một chút gì đó như thế này.

11296
10:59:13,572 --> 10:59:15,762
nếu chúng ta có thể nhấn nút--

11297
10:59:16,402 --> 10:59:21,582
Vì vậy ở đây chúng ta có khái niệm về một byte\n

11298
10:59:21,582 --> 10:59:24,461
Chúng ta sẽ thấy một kiểu dữ liệu được gọi là byte,\nlà một quy ước chung.

11299
10:59:25,701 --> 10:59:28,034
Và bạn sẽ tìm hiểu\nvề một hàm tên là fread

11300
10:59:28,035 --> 10:59:31,932
đọc từ một tập tin một số nào đó\n

11301
10:59:31,932 --> 10:59:33,701
Sau đó chúng ta có thể sử dụng mã như thế này.

11302
10:59:33,701 --> 10:59:37,362
Nếu khung byte bằng 0\nequals bằng 0xFF và byte

11303
10:59:37,362 --> 10:59:43,122
dấu ngoặc 1 bằng 0xD8 và dấu ngoặc byte\n

11304
10:59:43,122 --> 10:59:47,842
byte tôi vừa xác nhận đại diện cho một\n

11305
10:59:47,841 --> 10:59:51,171
Hãy để tôi tiếp tục và chạy\nchương trình này như sau.

11306
10:59:51,171 --> 10:59:55,281
Hãy để tôi sao chép jpeg.c vào thư mục\ncủa tôi từ bản phân phối ngày hôm nay.

11307
10:59:55,281 --> 11:00:03,432
Hãy để tôi tạo jpeg và để tôi chạy\n

11308
11:00:03,432 --> 11:00:07,201
được gọi là bài giảng.jpeg và tôi\nxác nhận là có, nó có thể là JPEG.

11309
11:00:08,201 --> 11:00:11,841
Hãy để tôi mở nó ra cho chúng tôi, được gọi là\n

11310
11:00:11,841 --> 11:00:15,941
đó có phải là bức ảnh mà chúng ta đã bắt đầu\n

11311
11:00:15,942 --> 11:00:18,072
Nhưng những gì chúng tôi cũng\nsẽ làm trong tuần này

11312
11:00:18,072 --> 11:00:22,991
đang bắt đầu triển khai cách sắp xếp của riêng chúng ta\n

11313
11:00:22,991 --> 11:00:26,261
chúng tôi có thể chụp ảnh và thực sự\n

11314
11:00:26,262 --> 11:00:28,279
tạo ra các phiên bản khác nhau của nó.

11315
11:00:28,279 --> 11:00:30,072
Ví dụ: sử dụng định dạng tệp\nkhác

11316
11:00:30,072 --> 11:00:33,862
được gọi là BMP, về cơ bản nó trình bày\n

11317
11:00:35,262 --> 11:00:36,822
Bạn sẽ thấy một cấu trúc--

11318
11:00:36,822 --> 11:00:38,862
một cấu trúc dữ liệu trong C phức tạp hơn nhiều

11319
11:00:38,862 --> 11:00:40,991
hơn ứng cử viên\ncấu trúc từ trước

11320
11:00:40,991 --> 11:00:43,226
hoặc cấu trúc con người\ntừ quá khứ, đó

11321
11:00:43,226 --> 11:00:45,851
trông như thế này, chỉ có\na nhiều giá trị hơn trong đó

11322
11:00:45,851 --> 11:00:47,769
nhưng chúng tôi sẽ hướng dẫn bạn\nnhững điều này trong tập hợp p.

11323
11:00:47,769 --> 11:00:49,781
Và chúng ta có thể chụp một\nbức ảnh như thế này và hỏi

11324
11:00:49,781 --> 11:00:52,241
bạn chạy một vài\nbộ lọc khác nhau trên đó giống như Instagram

11325
11:00:52,241 --> 11:00:55,871
như bộ lọc đen trắng,\cũng như thang độ xám, bộ lọc màu nâu đỏ

11326
11:00:55,872 --> 11:00:59,891
để mang lại cảm giác cổ điển, hoặc\n

11327
11:00:59,891 --> 11:01:02,481
hoặc làm mờ nó, thậm chí theo cách này.

11328
11:01:02,482 --> 11:01:05,472
Và để kết thúc bằng một ghi chú\nở đây, tôi có một phiên bản

11329
11:01:05,472 --> 11:01:08,982
mã này đã sẵn sàng hoạt động nhưng không\n

11330
11:01:08,982 --> 11:01:11,712
ban đầu nó chỉ thực hiện một bộ lọc.

11331
11:01:11,711 --> 11:01:14,411
Hãy để tôi tiếp tục và sẵn sàng\ncái này trên máy tính của tôi ở đây.

11332
11:01:14,411 --> 11:01:16,466
Tôi sẽ truy cập vào phiên bản bộ lọc\nown của mình

11333
11:01:16,466 --> 11:01:18,341
và bạn sẽ thấy một vài\ntệp sẽ cung cấp cho bạn

11334
11:01:18,341 --> 11:01:21,981
ví dụ: một chuyến tham quan vào tuần tới\nin bitmap.h

11335
11:01:21,982 --> 11:01:26,872
là một phiên bản của cấu trúc này\n

11336
11:01:26,872 --> 11:01:34,722
Và để tôi cho bạn xem tệp này ở đây,\n

11337
11:01:34,722 --> 11:01:38,412
được gọi là bộ lọc mà tôi đã\thực hiện trước ngày hôm nay.

11338
11:01:38,411 --> 11:01:41,471
Nhưng những thứ chúng tôi trao cho bạn để xứng đáng\n

11339
11:01:41,472 --> 11:01:43,847
chức năng này được gọi là bộ lọc\nlấy chiều cao của hình ảnh

11340
11:01:43,847 --> 11:01:46,942
chiều rộng của hình ảnh và\na mảng hai chiều.

11341
11:01:46,942 --> 11:01:49,932
Vì vậy, các hàng và cột\no pixel, sau đó tôi

11342
11:01:49,932 --> 11:01:53,771
có một vòng lặp như thế này lặp đi lặp lại\n

11343
11:01:55,402 --> 11:01:57,372
Và sau đó chú ý\ntôi sẽ làm gì ở đây.

11344
11:01:57,372 --> 11:02:00,552
Tôi sẽ thay đổi giá trị\nmàu xanh thành 0 trong trường hợp này

11345
11:02:00,552 --> 11:02:02,962
và giá trị xanh\nbằng 0 trong trường hợp này.

11346
11:02:03,701 --> 11:02:07,451
Chà, hình ảnh tôi nghĩ tới là cái này

11347
11:02:07,451 --> 11:02:10,241
nhờ đó chúng ta có được hình ảnh\ẩn này một cách đơn giản

11348
11:02:10,241 --> 11:02:13,511
có phong cách cổ điển-- một\nthông điệp bí mật được nhúng trong đó.

11349
11:02:13,512 --> 11:02:16,722
Và nếu bạn không có trong\n

11350
11:02:16,722 --> 11:02:18,942
về cơ bản những chiếc kính\nlàm mọi thứ có màu đỏ--

11351
11:02:18,942 --> 11:02:21,817
loại bỏ màu xanh lá cây trong\n

11352
11:02:21,817 --> 11:02:24,192
thực ra bạn có thể-- thực ra\ncó lẽ tôi là người duy nhất

11353
11:02:24,192 --> 11:02:26,472
có thể đọc được nội dung này ngay\nbây giờ-- xem thông báo nào

11354
11:02:26,472 --> 11:02:28,752
ẩn đằng sau tất cả những tiếng ồn đỏ này.

11355
11:02:28,752 --> 11:02:34,482
Nhưng nếu sử dụng mã của tôi được viết ở đây trong\n

11356
11:02:34,482 --> 11:02:37,182
trong bức ảnh và tôi loại bỏ\ntất cả màu xanh lá cây trong bức ảnh

11357
11:02:37,182 --> 11:02:39,792
về cơ bản là thực hiện\ný tưởng của bộ lọc này--

11358
11:02:39,792 --> 11:02:42,612
bộ lọc màu đỏ này nơi bạn chỉ nhìn thấy màu đỏ--

11359
11:02:42,612 --> 11:02:45,862
được rồi, chúng ta hãy tiếp tục\nbiên dịch chương trình này.

11360
11:02:45,862 --> 11:02:50,832
Tạo bộ lọc, chạy ./filter\non tin nhắn ẩn này.bmp.

11361
11:02:50,832 --> 11:02:53,891
Tôi sẽ lưu nó vào một\ntệp mới tên là message.bmp

11362
11:02:53,891 --> 11:02:56,832
và với bước khởi sắc cuối cùng\nchúng ta sẽ mở ra

11363
11:02:56,832 --> 11:03:00,732
message.bmp, đó là kết quả\ncủa việc đeo những chiếc kính này

11364
11:03:00,732 --> 11:03:03,882
và hy vọng bây giờ bạn\ncũng sẽ thấy những gì tôi thấy.

11365
11:03:12,891 --> 11:03:14,292
Được rồi, thế là xong cho CS50!

11366
11:04:39,311 --> 11:04:42,222
Và đây đã là tuần thứ 5,\ncó nghĩa là đây thực sự là

11367
11:04:44,722 --> 11:04:48,552
Trên thực tế, chỉ trong vài ngày'\n, mọi thứ đã trông như thế này

11368
11:04:48,552 --> 11:04:50,972
và có lẽ còn khó hiểu hơn nhiều\nđiều này

11369
11:04:50,972 --> 11:04:53,472
sẽ được chắt lọc thành\nthứ gì đó đơn giản hơn nhiều vào tuần tới.

11370
11:04:53,472 --> 11:04:55,632
Khi chúng ta chuyển sang một\nngôn ngữ có tên Python.

11371
11:04:55,631 --> 11:04:59,951
Và với Python, chúng ta vẫn có\n

11372
11:05:00,654 --> 11:05:03,822
Nhưng rất nhiều hệ thống ống nước cấp thấp\n

11373
11:05:03,822 --> 11:05:06,502
đang vật lộn, chán nản\ntrong vài tuần qua

11374
11:05:06,502 --> 11:05:08,802
đặc biệt là bây giờ\nchúng tôi đã giới thiệu con trỏ.

11375
11:05:08,802 --> 11:05:11,682
Và có vẻ như bạn\nphải tự mình làm mọi việc.

11376
11:05:11,682 --> 11:05:14,542
Trong Python và trong nhiều\nngôn ngữ cấp cao hơn

11377
11:05:14,542 --> 11:05:16,932
có thể nói-- ngôn ngữ hiện đại hơn,\ngần đây hơn

11378
11:05:16,932 --> 11:05:20,021
bạn sẽ có thể làm được nhiều hơn thế\n

11379
11:05:20,021 --> 11:05:23,021
Và thực sự, chúng ta sắp bắt đầu\n

11380
11:05:24,461 --> 11:05:27,641
Các khung, là bộ sưu tập của\n

11381
11:05:27,641 --> 11:05:31,091
Và trên hết, bạn sẽ\n

11382
11:05:31,091 --> 11:05:34,691
những dự án ấn tượng, thực sự giải quyết được\n

11383
11:05:34,692 --> 11:05:37,582
Đặc biệt, thông qua dự án cuối cùng của chính bạn.

11384
11:05:37,582 --> 11:05:41,082
Tuy nhiên, tuần trước, trong tuần 4,\n

11385
11:05:41,082 --> 11:05:43,692
Và chúng tôi đã xử lý\nbộ nhớ này bên trong máy tính của bạn

11386
11:05:45,042 --> 11:05:48,252
Vào cuối ngày, chỉ là\n

11387
11:05:48,252 --> 11:05:51,381
Và việc bạn làm với những byte đó thực sự tùy thuộc vào bạn\n.

11388
11:05:51,381 --> 11:05:54,881
Và cách bạn kết nối chúng với nhau, bằng cách nào\n

11389
11:05:54,881 --> 11:05:56,959
Và mảng,\nkhông phải là cách đơn giản nhất.

11390
11:05:56,959 --> 11:05:58,752
Chúng tôi bắt đầu chơi đùa với ký ức đó.

11391
11:05:58,752 --> 11:06:00,641
Chỉ là những phần ký ức liền kề nhau.

11392
11:06:01,781 --> 11:06:04,512
Nhưng hãy xem xét, trong giây lát, một số vấn đề

11393
11:06:04,512 --> 11:06:06,101
khá nhanh chóng phát sinh với mảng.

11394
11:06:06,101 --> 11:06:09,671
Và sau đó, hôm nay hãy tập trung vào điều gì hơn nữa\n

11395
11:06:09,671 --> 11:06:14,591
Sử dụng bộ nhớ máy tính của bạn\na như một canvas linh hoạt hơn nhiều

11396
11:06:14,591 --> 11:06:16,861
để tạo ra các cấu trúc\nhai chiều chẵn.

11397
11:06:16,862 --> 11:06:18,612
Để thể hiện thông tin,\nand, cuối cùng

11398
11:06:18,612 --> 11:06:20,692
để giải quyết những vấn đề thú vị hơn.

11399
11:06:20,692 --> 11:06:22,272
Vì vậy, đây là một mảng có kích thước 3.

11400
11:06:22,271 --> 11:06:24,072
Có lẽ, kích thước của 3 số nguyên.

11401
11:06:24,072 --> 11:06:26,319
Và giả sử rằng cái này\n nằm trong một chương trình.

11402
11:06:26,319 --> 11:06:29,112
Và tại thời điểm này trong câu chuyện,\n

11403
11:06:30,521 --> 11:06:34,558
Và giả sử, bất kể bối cảnh nào,\n

11404
11:06:36,432 --> 11:06:39,449
Chà, theo bản năng,\nsố 4 nên đi đâu?

11405
11:06:39,449 --> 11:06:41,531
Nếu đây là\nbộ nhớ máy tính của bạn và hiện tại chúng tôi

11406
11:06:41,531 --> 11:06:43,241
có mảng 1, 2, 3 này từ cái gì.

11407
11:06:44,591 --> 11:06:47,822
Có lẽ con số 4\ncông bằng sẽ đi về đâu một cách ngây thơ.

11408
11:06:52,061 --> 11:06:53,502
Vì vậy, bạn có thể thay thế số 1.

11409
11:06:53,502 --> 11:06:55,377
Tuy nhiên, tôi thực sự không thích\nđiều đó vì tôi muốn

11410
11:06:55,377 --> 11:06:56,771
muốn giữ số 1 xung quanh.

11411
11:06:58,061 --> 11:06:59,811
Nhưng tất nhiên là tôi đang mất thông tin.

11412
11:06:59,811 --> 11:07:02,271
Vậy tôi có thể làm gì khác nếu\nTôi muốn cộng số 4.

11413
11:07:02,771 --> 11:07:04,146
ĐỐI TƯỢNG: Ở phía bên phải của 3.

11414
11:07:04,813 --> 11:07:06,953
Vì vậy, ý tôi là, có cảm giác như\nnếu có sự sắp xếp nào đó

11415
11:07:06,953 --> 11:07:09,161
đối với những điều này, có vẻ như là một suy luận hợp lý

11416
11:07:09,161 --> 11:07:11,261
rằng nó có lẽ thuộc về\nnơi nào đó ở đây.

11417
11:07:11,262 --> 11:07:14,742
Nhưng hãy nhớ lại tuần trước, khi chúng ta bắt đầu\n

11418
11:07:14,741 --> 11:07:16,612
có những thứ khác\ncó thể đang diễn ra.

11419
11:07:16,612 --> 11:07:20,232
Và nếu điền vào đó, lý tưởng nhất là chúng ta\n

11420
11:07:20,232 --> 11:07:22,062
Nếu chúng ta duy trì trật tự như thế này.

11421
11:07:22,061 --> 11:07:24,461
Nhưng hãy nhớ lại trong ngữ cảnh\no của bộ nhớ máy tính của bạn

11422
11:07:24,461 --> 11:07:25,902
có thể có những thứ khác ở đó.

11423
11:07:25,902 --> 11:07:28,414
Một số giá trị\n rác này có thể sử dụng được

11424
11:07:28,413 --> 11:07:30,371
nhưng chúng tôi không thực sự biết\cũng như không quan tâm chúng là gì.

11425
11:07:30,372 --> 11:07:31,961
Như được đại diện bởi Oscar ở đây.

11426
11:07:31,961 --> 11:07:34,991
Nhưng thực tế có thể có\ndữ liệu hữu ích đang được sử dụng.

11427
11:07:34,991 --> 11:07:38,381
Giống như, nếu chương trình của bạn\nkhông chỉ có một vài số nguyên trong mảng này

11428
11:07:38,381 --> 11:07:40,511
mà còn có một chuỗi\ncó nội dung như "Xin chào thế giới.

11429
11:07:40,512 --> 11:07:46,572
Có thể máy tính của bạn có\n

11430
11:07:48,192 --> 11:07:50,442
Chà, có thể bạn đã tạo\narray trong một dòng mã

11431
11:07:52,091 --> 11:07:54,491
Có lẽ dòng\ncode tiếp theo đã sử dụng GET-STRING.

11432
11:07:54,491 --> 11:07:57,711
Hoặc có thể chỉ cần mã hóa cứng một chuỗi\n

11433
11:07:57,711 --> 11:08:00,459
Và thế là bạn đã tự vẽ mình vào một góc, có thể nói như vậy.

11434
11:08:00,459 --> 11:08:03,042
Bây giờ tôi nghĩ bạn có thể yêu cầu,\ntốt, hãy ghi đè H.

11435
11:08:03,042 --> 11:08:04,991
Nhưng điều đó có vấn đề\nvì những lý do tương tự.

11436
11:08:06,711 --> 11:08:09,612
Vậy cả 4 có thể đi đâu khác?

11437
11:08:09,612 --> 11:08:12,851
Hoặc làm cách nào để giải quyết vấn đề này\nnếu chúng ta muốn cộng một số

11438
11:08:12,851 --> 11:08:14,561
và rõ ràng có sẵn bộ nhớ.

11439
11:08:14,561 --> 11:08:17,951
Bởi vì những giá trị rác đó là rác\n

11440
11:08:17,951 --> 11:08:20,081
Vì vậy, chúng tôi chắc chắn có thể tái sử dụng chúng.

11441
11:08:20,082 --> 11:08:23,722
4 và\ncó lẽ toàn bộ mảng này có thể đi đâu?

11442
11:08:24,222 --> 11:08:26,052
Vì vậy, tôi được biết chúng ta có thể\ndi chuyển nó đi đâu đó.

11443
11:08:26,052 --> 11:08:27,885
Có thể thay thế một số\ngiá trị rác đó.

11444
11:08:27,885 --> 11:08:29,902
Và thành thật mà nói, chúng ta có rất nhiều lựa chọn.

11445
11:08:29,902 --> 11:08:32,141
Chúng ta có thể sử dụng bất kỳ giá trị\nrác nào ở đây.

11446
11:08:32,141 --> 11:08:34,881
Chúng ta có thể sử dụng bất kỳ thứ nào trong số này\nở đây hoặc thậm chí xa hơn.

11447
11:08:34,881 --> 11:08:38,441
Vấn đề là có rất nhiều\nbộ nhớ khả dụng

11448
11:08:38,442 --> 11:08:41,891
được chỉ ra bởi những giải Oscar này,\nchúng ta có thể đặt 4, thậm chí có thể là 5

11449
11:08:43,271 --> 11:08:46,451
Điều đáng chú ý là chúng ta đã chọn sai từ rất sớm.

11450
11:08:47,531 --> 11:08:51,167
Và 1, 2, 3 kết thúc với\n

11451
11:08:52,250 --> 11:08:55,060
Hãy tiếp tục và giả định rằng\n

11452
11:08:55,061 --> 11:08:58,226
Và chúng ta sẽ đặt\narray mới vào vị trí này ở đây.

11453
11:08:58,226 --> 11:09:00,101
Vì vậy tôi sẽ tiếp tục\nvà sao chép số 1 lại.

11454
11:09:01,902 --> 11:09:04,634
Và cuối cùng, khi\ntôi đã sẵn sàng điền vào 4

11455
11:09:04,633 --> 11:09:07,091
Về cơ bản, tôi có thể vứt bỏ\nmảng cũ vào thời điểm này.

11456
11:09:07,091 --> 11:09:09,101
Bởi vì bây giờ tôi có nó\nhoàn toàn trùng lặp.

11457
11:09:09,101 --> 11:09:11,241
Và tôi có thể điền vào đó số 4.

11458
11:09:12,612 --> 11:09:15,582
Đó là một giải pháp tiềm năng đúng đắn cho vấn đề này.

11459
11:09:16,665 --> 11:09:19,624
Và đây là điều chúng tôi sắp làm\n

11460
11:09:19,624 --> 11:09:22,302
Nhược điểm của việc\ngiải quyết vấn đề này theo cách này là gì?

11461
11:09:23,896 --> 11:09:25,271
Tôi đang thêm rất nhiều thời gian chạy.

11462
11:09:25,271 --> 11:09:28,061
Tôi đã mất rất nhiều công sức để\nsao chép những con số bổ sung đó.

11463
11:09:28,061 --> 11:09:29,502
Bây giờ, được cho phép, đó là một mảng nhỏ.

11464
11:09:30,502 --> 11:09:32,377
Nó sẽ kết thúc\ntrong chớp mắt.

11465
11:09:32,377 --> 11:09:35,061
Nhưng nếu chúng ta bắt đầu nói\nvề những tập dữ liệu thú vị

11466
11:09:35,061 --> 11:09:37,671
tập dữ liệu ứng dụng web,\nbộ dữ liệu ứng dụng dành cho thiết bị di động.

11467
11:09:37,671 --> 11:09:41,152
Nơi bạn không chỉ có một vài mà còn\n

11468
11:09:41,152 --> 11:09:43,112
vài triệu mẩu dữ liệu.

11469
11:09:43,112 --> 11:09:46,252
Đây có lẽ là giải pháp\nkhông tối ưu để chỉ, ồ

11470
11:09:46,252 --> 11:09:48,234
di chuyển tất cả dữ liệu của bạn từ\nnơi này sang nơi khác.

11471
11:09:48,233 --> 11:09:49,941
Bởi vì ai có thể nói\nrằng chúng ta sẽ không đi

11472
11:09:49,942 --> 11:09:51,531
để vẽ mình vào một góc mới.

11473
11:09:51,531 --> 11:09:54,741
Và bạn sẽ có cảm giác như mình đang lãng phí\n

11474
11:09:54,741 --> 11:09:58,591
Và cuối cùng, bạn chỉ tốn rất nhiều thời gian.

11475
11:09:58,591 --> 11:10:01,611
Trên thực tế, nếu bây giờ chúng ta đặt cái này vào\n

11476
11:10:01,612 --> 11:10:06,531
từ vài tuần trước,\nthời gian hoạt động của Tìm kiếm bây giờ có thể là bao nhiêu

11477
11:10:08,752 --> 11:10:10,912
Một sự trở lại của một vài tuần trước.

11478
11:10:10,911 --> 11:10:14,061
Nếu bạn đang sử dụng một mảng, để\ntóm tắt, thời gian chạy là bao lâu

11479
11:10:14,061 --> 11:10:17,072
của thuật toán Tìm kiếm theo ký hiệu Big O?

11480
11:10:17,072 --> 11:10:19,252
Vì vậy, có thể, trong trường hợp xấu nhất.

11481
11:10:19,252 --> 11:10:23,031
Nếu bạn có n số thì 3 trong số này\n

11482
11:10:28,582 --> 11:10:30,202
Và trực giác của bạn về điều đó là gì?

11483
11:10:36,792 --> 11:10:39,584
Vì vậy, nếu chúng ta đi qua từng phần tử,\n

11484
11:10:39,584 --> 11:10:42,972
thì Tìm kiếm sẽ mất\nthời gian chạy Big O.

11485
11:10:42,972 --> 11:10:46,002
Tuy nhiên, nếu chúng ta đang nói cụ thể về\nnhững con số này.

11486
11:10:46,002 --> 11:10:48,972
Và bây giờ tôi sẽ quy định rõ ràng\nrằng, vâng, chúng đã được sắp xếp.

11487
11:10:50,141 --> 11:10:54,432
Ký hiệu Big O sẽ là gì\n

11488
11:10:54,432 --> 11:10:56,921
có thể là kích thước 3 hoặc 4,\hay n, nói chung hơn.

11489
11:10:57,972 --> 11:10:59,772
GIỌNG 1: Big O of, không phải n, mà đúng hơn?

11490
11:11:01,182 --> 11:11:05,190
Bởi vì chúng ta có thể sử dụng số không mỗi tuần\n

11491
11:11:05,190 --> 11:11:06,732
chúng ta sẽ phải giải quyết một số vấn đề làm tròn.

11492
11:11:06,732 --> 11:11:08,922
Bởi vì hiện tại không có số lượng\nphần tử hoàn hảo.

11493
11:11:08,921 --> 11:11:10,332
Nhưng bạn có thể sử dụng tìm kiếm nhị phân.

11494
11:11:11,652 --> 11:11:13,391
Sau đó đi sang trái hoặc\nphải, trái hoặc phải

11495
11:11:13,391 --> 11:11:15,141
cho đến khi bạn tìm thấy\yếu tố mà bạn quan tâm.

11496
11:11:15,141 --> 11:11:19,302
Vì vậy, Tìm kiếm vẫn ở trạng thái Big O\nof log n khi sử dụng mảng.

11497
11:11:19,302 --> 11:11:21,132
Nhưng còn việc chèn thì sao bây giờ?

11498
11:11:21,131 --> 11:11:23,171
Nếu chúng ta bắt đầu nghĩ\nvề những hoạt động khác.

11499
11:11:23,171 --> 11:11:26,862
Giống như việc thêm một số vào mảng này,\n

11500
11:11:26,862 --> 11:11:29,531
ứng dụng hoặc Google đang tìm\nantrang khác trên Internet.

11501
11:11:29,531 --> 11:11:31,991
Vì vậy, việc chèn xảy ra mọi lúc.

11502
11:11:31,991 --> 11:11:34,811
Thời gian chạy của Insert là bao lâu?

11503
11:11:34,811 --> 11:11:38,112
Khi nói đến việc chèn vào\nan mảng có kích thước n.

11504
11:11:38,112 --> 11:11:40,781
Việc đó có thể mất bao nhiêu bước?

11505
11:11:43,201 --> 11:11:46,061
Vì trong trường hợp xấu nhất,\nbạn hết dung lượng

11506
11:11:46,061 --> 11:11:48,629
có vẻ như bạn phải phân bổ một mảng mới.

11507
11:11:48,629 --> 11:11:50,921
Có thể, tiếp quản một số\ngiá trị rác trước đó.

11508
11:11:50,921 --> 11:11:52,661
Nhưng điều đáng chú ý là, mặc dù\nbạn chỉ

11509
11:11:52,661 --> 11:11:55,031
chèn một số mới,\nnhư số 4

11510
11:11:55,031 --> 11:11:58,551
bạn phải sao chép hết\n

11511
11:11:58,552 --> 11:12:01,542
Vì vậy, nếu mảng ban đầu của bạn có kích thước\n, việc sao chép mảng đó

11512
11:12:01,542 --> 11:12:03,412
sẽ lấy Big O(n+1).

11513
11:12:03,411 --> 11:12:06,411
Nhưng chúng ta có thể vứt bỏ dấu cộng 1\n

11514
11:12:06,411 --> 11:12:09,341
Vì vậy Insert bây giờ trở thành Big O của n.

11515
11:12:09,341 --> 11:12:11,201
Và điều đó có thể không lý tưởng.

11516
11:12:11,201 --> 11:12:13,991
Bởi vì nếu bạn có thói quen\nđưa đồ vào thường xuyên

11517
11:12:13,991 --> 11:12:16,362
cái đó có thể bắt đầu cộng\nup, cộng lên, cộng lên.

11518
11:12:16,362 --> 11:12:19,302
Và đây là lý do tại sao các chương trình máy tính,\nand trang web và ứng dụng di động

11519
11:12:20,472 --> 11:12:23,482
Nếu bạn không để ý\n đến những sự đánh đổi này.

11520
11:12:23,482 --> 11:12:27,492
Vậy còn, để cho chắc chắn, ký hiệu Omega thì sao.

11521
11:12:28,752 --> 11:12:31,241
Tóm lại\nở đây, chúng ta có thể gặp may mắn

11522
11:12:31,241 --> 11:12:33,533
và Tìm kiếm chỉ có thể thực hiện một bước.

11523
11:12:33,533 --> 11:12:35,741
Bởi vì bạn có thể gặp\nmay mắn và tăng số lượng

11524
11:12:35,741 --> 11:12:38,292
bạn đang tìm kiếm ở ngay trong\n

11525
11:12:38,292 --> 11:12:40,152
Hoặc thậm chí tìm kiếm tuyến tính, cho vấn đề đó.

11526
11:12:41,201 --> 11:12:45,191
Nếu có đủ chỗ và chúng tôi thì không\n

11527
11:12:45,192 --> 11:12:46,728
1, 2 và 3 đến một địa điểm mới.

11528
11:12:47,561 --> 11:12:49,722
Và chúng ta có thể, như\nai đó đã gợi ý, chỉ cần

11529
11:12:49,722 --> 11:12:51,520
đặt số 4 ngay ở cuối.

11530
11:12:51,519 --> 11:12:53,561
Và nếu chúng ta không gặp may,\nit có thể phải thực hiện n bước.

11531
11:12:53,561 --> 11:12:57,441
Nếu chúng ta gặp may mắn, có thể chỉ mất\n

11532
11:12:57,442 --> 11:12:59,152
Trên thực tế, hãy để tôi tiếp tục và làm điều này.

11533
11:12:59,152 --> 11:13:00,802
Thế còn chúng ta làm điều gì đó như thế này thì sao?

11534
11:13:00,802 --> 11:13:02,502
Hãy để tôi chuyển sang một số mã ở đây.

11535
11:13:02,502 --> 11:13:05,591
Hãy để tôi bắt đầu tạo một\nchương trình có tên List.C.

11536
11:13:05,591 --> 11:13:08,270
Và trong List.C, hãy\nbắt đầu với cách cũ.

11537
11:13:08,271 --> 11:13:11,512
Vì vậy, chúng tôi đi theo đường dẫn mà chúng tôi đã\n

11538
11:13:11,512 --> 11:13:14,952
Vì vậy, trong List.C này, tôi sẽ\nbao gồm Standardio.h.

11539
11:13:16,932 --> 11:13:20,262
Sau đó, bên trong mã của tôi ở đây, tôi\n

11540
11:13:20,262 --> 11:13:22,072
phiên bản đầu tiên của bộ nhớ.

11541
11:13:22,072 --> 11:13:26,811
Vì vậy, danh sách int 3 hiện đã được triển khai\na thời điểm này, trong một mảng.

11542
11:13:26,811 --> 11:13:29,169
Vì vậy, chúng tôi đang tua lại\nmã kiểu tuần 2.

11543
11:13:29,169 --> 11:13:31,002
Và sau đó, hãy để tôi\khởi tạo thứ này.

11544
11:13:31,002 --> 11:13:32,682
Tại vị trí đầu tiên sẽ là 1.

11545
11:13:32,682 --> 11:13:34,722
Tại địa điểm tiếp theo sẽ là 2.

11546
11:13:34,722 --> 11:13:37,391
Và ở vị trí cuối cùng sẽ là 3.

11547
11:13:37,391 --> 11:13:39,722
Vì vậy, mảng luôn được lập chỉ mục bằng 0.

11548
11:13:39,722 --> 11:13:41,472
Tôi, chỉ vì mục đích thảo luận

11549
11:13:41,472 --> 11:13:44,902
tôi đang nhập các số 1, 2,\n3, giống như một người bình thường.

11550
11:13:45,402 --> 11:13:46,819
Vì vậy bây giờ chúng ta hãy in chúng ra.

11551
11:13:50,322 --> 11:13:53,232
Bây giờ chúng ta hãy tiếp tục\nin ra bằng printf.

11552
11:13:56,141 --> 11:13:59,771
Chương trình rất đơn giản, được truyền cảm hứng\ntừ những gì chúng ta đã làm trong tuần 2.

11553
11:13:59,771 --> 11:14:03,682
Chỉ để tạo và sau đó in\nout nội dung của một mảng.

11554
11:14:05,862 --> 11:14:09,942
Cho đến nay, rất tốt. ./list\nVà thì đấy, chúng ta thấy 1, 2, 3.

11555
11:14:09,942 --> 11:14:14,952
Bây giờ chúng ta hãy bắt đầu thực hành một số điều\n

11556
11:14:14,951 --> 11:14:19,541
Vì vậy, hãy để tôi vào ngay bây giờ và loại bỏ\nphiên bản mảng.

11557
11:14:19,542 --> 11:14:22,391
Và để tôi thu nhỏ một chút\n

11558
11:14:22,391 --> 11:14:25,932
Và bây giờ hãy bắt đầu\ntạo danh sách có kích thước 3.

11559
11:14:25,932 --> 11:14:29,112
Vì vậy, nếu tôi định làm\nviệc này bây giờ, một cách linh hoạt

11560
11:14:29,112 --> 11:14:33,262
nên tôi phải phân bổ đi phân bổ lại những\nthứ này

11561
11:14:33,262 --> 11:14:34,912
hãy để tôi tiếp tục và làm điều này.

11562
11:14:34,911 --> 11:14:41,951
Hãy để tôi đưa ra cho mình một danh sách thuộc loại\n

11563
11:14:41,951 --> 11:14:48,971
gấp 3 lần kích thước của một int, vậy thì sao\n

11564
11:14:48,972 --> 11:14:51,972
đủ bộ nhớ cho bức tranh\nđầu tiên chúng ta vẽ trên bảng.

11565
11:14:51,972 --> 11:14:54,641
Đó là mảng\nchứa 1, 2 và 3.

11566
11:14:54,641 --> 11:14:57,472
Nhưng việc đặt nền móng\nđể có thể thay đổi kích thước nó

11567
11:14:57,472 --> 11:14:59,061
đó cuối cùng là mục tiêu.

11568
11:14:59,061 --> 11:15:01,131
Vì vậy, cú pháp của tôi ở đây hơi khác một chút.

11569
11:15:01,131 --> 11:15:04,572
Tôi sẽ sử dụng malloc và lấy bộ nhớ\n

11570
11:15:05,482 --> 11:15:09,372
Thay vì chỉ sử dụng ngăn xếp\n

11571
11:15:12,161 --> 11:15:16,572
Tức là dòng mã này từ\n

11572
11:15:16,572 --> 11:15:20,112
giống hệt dòng\ncode này trong phiên bản thứ hai.

11573
11:15:20,112 --> 11:15:22,211
Nhưng dòng\ncode đầu tiên đặt bộ nhớ

11574
11:15:22,211 --> 11:15:24,372
trên ngăn xếp, tự động, cho tôi.

11575
11:15:24,372 --> 11:15:27,282
Dòng mã thứ hai\nmà tôi đã để lại ở đây

11576
11:15:27,281 --> 11:15:30,762
đang tạo một mảng có kích thước 3,\nnhưng nó đang đặt mảng đó vào vùng nhớ heap.

11577
11:15:30,762 --> 11:15:34,382
Và điều đó quan trọng vì nó chỉ\n

11578
11:15:35,311 --> 11:15:38,341
Rằng bạn thực sự có thể yêu cầu nhiều hơn\n

11579
11:15:38,341 --> 11:15:42,241
Khi bạn chỉ sử dụng\nký hiệu đầu tiên int list 3

11580
11:15:42,241 --> 11:15:45,631
bạn đã vĩnh viễn cấp cho mình một mảng có kích thước 3.

11581
11:15:45,631 --> 11:15:48,612
Bạn không thể thêm vào đó trong mã.

11582
11:15:48,612 --> 11:15:50,491
Vậy hãy để tôi tiếp tục và làm điều này.

11583
11:15:50,491 --> 11:15:53,625
Nếu danh sách==null thì đã xảy ra lỗi.

11584
11:15:53,625 --> 11:15:54,792
Máy tính hết bộ nhớ.

11585
11:15:54,792 --> 11:15:56,985
Vì vậy, hãy quay lại 1 và\nthoát khỏi chương trình này.

11586
11:15:56,985 --> 11:15:58,152
Không có gì để xem ở đây.

11587
11:15:58,152 --> 11:16:00,002
Vì vậy, chỉ cần kiểm tra lỗi tốt ở đó.

11588
11:16:00,002 --> 11:16:02,252
Bây giờ hãy để tôi tiếp tục và\khởi tạo danh sách này.

11589
11:16:02,252 --> 11:16:04,201
Vì vậy danh sách [0] sẽ lại là 1.

11590
11:16:07,921 --> 11:16:10,292
Vì vậy, đó là loại cú pháp giống như trước đây.

11591
11:16:10,292 --> 11:16:13,412
Và chú ý sự tương đương này.

11592
11:16:13,411 --> 11:16:18,211
Hãy nhớ rằng có mối quan hệ này\n

11593
11:16:18,211 --> 11:16:21,031
Và mảng thực sự chỉ đang thực hiện\nsố học con trỏ cho bạn

11594
11:16:21,031 --> 11:16:22,741
nơi có ký hiệu dấu ngoặc vuông.

11595
11:16:22,741 --> 11:16:27,511
Vì vậy, nếu tôi đã tự hỏi mình ở đây, khi đang xếp hàng\n

11596
11:16:27,512 --> 11:16:32,732
bây giờ hoàn toàn có thể đối xử với nó như thế\n

11597
11:16:32,732 --> 11:16:35,222
Bởi vì máy tính sẽ\nlàm phép tính cho tôi

11598
11:16:35,222 --> 11:16:37,921
và tìm vị trí đầu tiên,\nthứ hai và thứ ba.

11599
11:16:37,921 --> 11:16:42,031
Nếu bạn thực sự muốn trở nên\nngầu và giống hacker, thì

11600
11:16:42,031 --> 11:16:48,781
bạn có thể nói danh sách=1,\ndanh sách 1=2, danh sách 2=3.

11601
11:16:51,362 --> 11:16:53,701
Đó là điều tương tự\nsử dụng rất rõ ràng

11602
11:16:53,701 --> 11:16:56,311
số học con trỏ mà chúng ta\nđã xem xét sơ lược vào tuần trước.

11603
11:16:56,311 --> 11:16:58,651
Nhưng điều này thật tồi tệ đối với hầu hết mọi người.

11604
11:16:58,652 --> 11:17:00,342
Nó chỉ không thân thiện với người dùng.

11605
11:17:00,341 --> 11:17:03,271
Do đó, thời gian nhập sẽ lâu hơn\nhầu hết mọi người, ngay cả khi

11606
11:17:03,271 --> 11:17:06,151
phân bổ bộ nhớ động\nas tôi đã làm cách đây một giây

11607
11:17:06,152 --> 11:17:10,112
sẽ chỉ sử dụng ký hiệu\nquen thuộc hơn của một mảng.

11608
11:17:11,792 --> 11:17:16,322
Bây giờ giả sử thời gian trôi qua\nvà tôi nhận ra, ôi bắn đi

11609
11:17:16,322 --> 11:17:21,302
Tôi thực sự muốn mảng này\ncó kích thước 4 thay vì kích thước 3.

11610
11:17:21,302 --> 11:17:23,844
Bây giờ, rõ ràng là tôi có thể\ntua lại và sửa chương trình.

11611
11:17:23,843 --> 11:17:25,801
Nhưng giả sử đây là một chương trình lớn hơn nhiều.

11612
11:17:25,802 --> 11:17:28,172
Và tại thời điểm này,\ntôi nhận ra rằng tôi cần

11613
11:17:28,171 --> 11:17:31,561
để có thể tự động thêm nhiều hơn\n

11614
11:17:32,222 --> 11:17:33,762
Hãy để tôi tiếp tục và làm điều này.

11615
11:17:33,762 --> 11:17:36,152
Hãy để tôi nói, được rồi\nđược rồi, danh sách thực sự nên

11616
11:17:36,152 --> 11:17:42,182
là kết quả của việc yêu cầu 4\nchunk bộ nhớ từ malloc.

11617
11:17:42,182 --> 11:17:46,217
Và sau đó, tôi có thể làm điều gì đó\nnhư thế này, liệt kê [3]=4.

11618
11:17:49,171 --> 11:17:52,182
Hiện tại, điều này có thể có lỗi\theo một số cách.

11619
11:17:52,182 --> 11:17:59,012
Nhưng trước tiên hãy để tôi hỏi, thực sự là gì\n

11620
11:17:59,012 --> 11:18:03,332
Mục tiêu trước mắt là bắt đầu với\n

11621
11:18:03,332 --> 11:18:05,141
Và tôi muốn thêm số 4 vào đó.

11622
11:18:05,141 --> 11:18:10,862
Vì vậy, tại thời điểm này, ở dòng 17, tôi đã hỏi\n

11623
11:18:12,421 --> 11:18:14,612
Và sau đó tôi thêm số 4 vào đó.

11624
11:18:14,612 --> 11:18:18,092
Nhưng tôi đã bỏ qua một vài\nbước và bằng cách nào đó đã phá vỡ điều này.

11625
11:18:19,375 --> 11:18:21,504
KHÁN GIẢ: Bạn không biết\chính xác [KHÔNG NGHE ĐƯỢC]..

11626
11:18:22,171 --> 11:18:24,542
Tôi không nhất thiết phải biết ở đâu\n

11627
11:18:24,542 --> 11:18:26,042
Có lẽ sẽ không ngay lập tức

11628
11:18:26,042 --> 11:18:27,391
liền kề với đoạn trước.

11629
11:18:27,391 --> 11:18:30,222
Và vì vậy, vâng, mặc dù tôi\nđã nhập số vào đó

11630
11:18:30,222 --> 11:18:34,182
Tôi chưa sao chép cái 1, cái 2 hoặc\n

11631
11:18:35,881 --> 11:18:40,112
à, thực ra thì, thực ra,\n

11632
11:18:40,112 --> 11:18:43,561
Tôi đang mồ côi đoạn ký ức ban đầu.

11633
11:18:43,561 --> 11:18:46,741
Nếu bạn nghĩ về bức tranh đó\n

11634
11:18:46,741 --> 11:18:52,981
ở đây trên dòng 5 phân bổ\n

11635
11:18:55,752 --> 11:18:59,131
Nhưng ngay sau khi tôi làm điều này, tôi\nsẽ ghi đè giá trị của danh sách.

11636
11:18:59,131 --> 11:19:01,441
Và nói không, đừng chỉ vào đoạn ký ức này.

11637
11:19:01,442 --> 11:19:05,382
Trỏ vào đoạn bộ nhớ này, tại\n

11638
11:19:05,381 --> 11:19:07,711
đoạn bộ nhớ ban đầu ở đâu.

11639
11:19:07,711 --> 11:19:12,301
Vì vậy, cách đúng đắn để làm điều gì đó như\n

11640
11:19:12,302 --> 11:19:14,880
Hãy để tôi tiếp tục và tự cung cấp cho mình một biến tạm thời.

11641
11:19:14,879 --> 11:19:16,171
Và tôi sẽ gọi nó là TMP theo đúng nghĩa đen.

11642
11:19:16,171 --> 11:19:18,301
T-M-P, giống như tôi đã làm tuần trước.

11643
11:19:18,302 --> 11:19:21,602
Để bây giờ tôi có thể yêu cầu máy tính\n

11644
11:19:22,771 --> 11:19:25,711
Tôi sẽ nói lại\nif TMP bằng null

11645
11:19:25,711 --> 11:19:27,851
Tôi sẽ nói rằng có những điều tồi tệ đã xảy ra ở đây.

11646
11:19:29,042 --> 11:19:31,322
Và bạn biết không,\nđể gọn gàng hơn, hãy để tôi

11647
11:19:31,322 --> 11:19:34,023
giải phóng danh sách ban đầu trước khi tôi thoát.

11648
11:19:34,023 --> 11:19:35,731
Bởi vì hãy nhớ\ntuần trước, bất cứ lúc nào

11649
11:19:35,732 --> 11:19:38,132
bạn dùng malloc thì cuối cùng bạn phải dùng free.

11650
11:19:38,131 --> 11:19:41,521
Nhưng đoạn mã này\nis chỉ là một biện pháp kiểm tra an toàn.

11651
11:19:41,521 --> 11:19:43,921
Nếu không còn bộ nhớ thì\nsẽ không có gì để xem ở đây.

11652
11:19:43,921 --> 11:19:46,981
Tôi sẽ dọn dẹp\n trạng thái của mình và thoát ra.

11653
11:19:46,982 --> 11:19:50,322
Nhưng bây giờ, nếu tôi yêu cầu\nđoạn ký ức này

11654
11:19:50,322 --> 11:19:55,682
bây giờ tôi có thể làm điều này 4 int tôi nhận được 0.

11655
11:19:58,082 --> 11:20:00,002
Nếu tôi làm điều gì đó như thế này thì sao?

11656
11:20:04,021 --> 11:20:08,461
Điều đó dường như có tác dụng\n

11657
11:20:09,281 --> 11:20:12,991
Và sau đó, tôi nghĩ mình cần\nlàm một việc cuối cùng TMP [3]

11658
11:20:12,991 --> 11:20:14,941
lấy số 4 chẳng hạn.

11659
11:20:14,942 --> 11:20:18,961
Một lần nữa, tôi đang cố gắng mã hóa các con số\nđể thảo luận.

11660
11:20:18,961 --> 11:20:23,942
Sau khi tôi làm xong việc này,\nbây giờ tôi có thể làm gì?

11661
11:20:23,942 --> 11:20:28,472
Bây giờ tôi có thể đặt danh sách bằng TMP.

11662
11:20:28,472 --> 11:20:31,529
Và bây giờ tôi đã cập nhật\ndanh sách liên kết của mình một cách chính xác.

11663
11:20:31,529 --> 11:20:32,822
Vậy hãy để tôi tiếp tục và làm điều này.

11664
11:20:36,961 --> 11:20:42,301
Hãy để tôi tiếp tục và in từng cái này\n

11665
11:20:42,302 --> 11:20:45,372
Và sau đó, tôi sẽ trả về 0\n

11666
11:20:45,372 --> 11:20:49,472
Bây giờ để tóm tắt lại, chúng ta\khởi tạo mảng ban đầu

11667
11:20:49,472 --> 11:20:52,622
có kích thước 3 và plug-in\ncác giá trị 1, 2, 3.

11668
11:20:53,442 --> 11:20:55,692
Và sau đó, tôi nhận ra, đợi một\nphút, tôi cần thêm không gian.

11669
11:20:55,692 --> 11:20:58,067
Vì thế tôi đã yêu cầu máy tính\nđoạn bộ nhớ thứ hai.

11670
11:20:59,281 --> 11:21:01,949
Giống như một biện pháp kiểm tra an toàn, tôi\nđảm bảo rằng TMP không bằng null.

11671
11:21:01,949 --> 11:21:03,489
Bởi vì nếu có thì tôi sẽ hết bộ nhớ.

11672
11:21:03,489 --> 11:21:05,072
Vì thế tôi nên bỏ cuộc hoàn toàn.

11673
11:21:05,072 --> 11:21:07,591
Nhưng một khi tôi chắc chắn rằng\nit không phải là null, tôi

11674
11:21:07,591 --> 11:21:12,931
sẽ sao chép tất cả các giá trị từ\n

11675
11:21:12,932 --> 11:21:16,391
Và sau đó, tôi sẽ thêm\n mới của mình

11676
11:21:16,391 --> 11:21:19,891
Và sau đó, bây giờ tôi đã chơi xong\n

11677
11:21:19,891 --> 11:21:23,341
Tôi sẽ nhớ\n biến danh sách của tôi là gì

11678
11:21:23,341 --> 11:21:25,381
địa chỉ của đoạn bộ nhớ\nmới này.

11679
11:21:25,381 --> 11:21:28,051
Và sau đó, tôi sẽ in\ntất cả những giá trị đó ra.

11680
11:21:28,052 --> 11:21:31,832
Vì vậy, ít nhất, về mặt thẩm mỹ, khi tôi\n

11681
11:21:31,832 --> 11:21:34,141
ngoại trừ dấu chấm phẩy bị thiếu của tôi.

11682
11:21:38,101 --> 11:21:40,771
Khai báo ngầm một hàm\nthư viện malloc.

11683
11:21:40,771 --> 11:21:45,230
Lỗi của tôi là gì\nbạn thấy loại lỗi đó?

11684
11:21:46,862 --> 11:21:52,182
Vì thế ở trên đây, tôi quên thêm\n

11685
11:21:52,182 --> 11:21:53,972
Hãy để tôi tiếp tục và\nmột lần nữa, lập danh sách.

11686
11:21:56,432 --> 11:21:59,311
Và tôi sẽ thấy 1, 2, 3, 4.

11687
11:21:59,311 --> 11:22:03,122
Nhưng chúng vẫn là một lỗi ở đây.

11688
11:22:03,122 --> 11:22:05,792
Có ai nhìn thấy\nlỗi-- hoặc câu hỏi không?

11689
11:22:05,792 --> 11:22:07,582
ĐỐI TƯỢNG: Bạn quên giải phóng chúng.

11690
11:22:07,582 --> 11:22:08,272
GIỌNG 1: Tôi xin lỗi, nói lại.

11691
11:22:08,271 --> 11:22:09,951
ĐỐI TƯỢNG: Bạn quên giải phóng chúng.

11692
11:22:09,951 --> 11:22:12,051
LOA 1: Tôi quên\ngiải phóng danh sách ban đầu.

11693
11:22:12,052 --> 11:22:15,652
Và chúng ta có thể thấy điều này, ngay cả khi không\n

11694
11:22:15,652 --> 11:22:18,329
Nếu tôi làm điều gì đó như\nValgrind của dấu chấm/danh sách

11695
11:22:18,328 --> 11:22:19,911
hãy nhớ công cụ của chúng tôi trong tuần qua.

11696
11:22:19,911 --> 11:22:22,791
Hãy để tôi tạm thời tăng kích thước cửa sổ\nterminal của mình.

11697
11:22:22,792 --> 11:22:25,022
Đầu ra lúc đầu rất khó hiểu.

11698
11:22:25,021 --> 11:22:30,261
Nhưng, hãy lưu ý rằng tôi chắc chắn có\n

11699
11:22:30,262 --> 11:22:32,632
Và quả thực, nó thậm chí còn\nchỉ vào số dòng

11700
11:22:32,631 --> 11:22:34,411
trong đó một số byte đó đã bị mất.

11701
11:22:34,411 --> 11:22:36,411
Vì vậy, hãy để tôi tiếp tục và quay lại mã của tôi.

11702
11:22:36,411 --> 11:22:41,091
Và thực sự, tôi nghĩ điều tôi cần làm\n

11703
11:22:41,091 --> 11:22:44,631
trỏ nó vào đoạn\nof bộ nhớ mới này thay vì đoạn cũ

11704
11:22:44,631 --> 11:22:47,391
Tôi nghĩ bây giờ tôi cần phải\nchủ động

11705
11:22:47,391 --> 11:22:49,942
nói giải phóng danh sách bộ nhớ cũ.

11706
11:22:51,961 --> 11:22:56,731
Vì vậy nếu bây giờ tôi thực hiện Lập danh sách và thực hiện dấu chấm\n

11707
11:22:56,732 --> 11:22:59,932
Và nếu tôi bắt chéo ngón tay\nvà chạy lại Valgrind

11708
11:22:59,932 --> 11:23:03,921
sau khi tăng kích thước\n cửa sổ của tôi, hy vọng là ở đây.

11709
11:23:06,561 --> 11:23:09,502
Có vẻ như bộ nhớ bị mất ít hơn.

11710
11:23:09,502 --> 11:23:11,932
Bây giờ tôi đã quên làm gì?

11711
11:23:11,932 --> 11:23:13,912
KHÁN GIẢ: Bạn quên giải phóng phần cuối.

11712
11:23:13,911 --> 11:23:16,221
GIỌNG 1: Tôi cũng quên free\nit ở cuối.

11713
11:23:16,222 --> 11:23:19,042
Bởi vì tôi vẫn còn một đoạn\nbộ nhớ mà tôi lấy được từ malloc.

11714
11:23:19,042 --> 11:23:21,682
Vì vậy, hãy để tôi đi tới phần cuối của chương trình ngay bây giờ.

11715
11:23:21,682 --> 11:23:26,811
Và sau khi tôi làm xong việc một cách vô nghĩa\nchỉ in cái này ra

11716
11:23:29,932 --> 11:23:33,262
Và bây giờ hãy để tôi thực hiện Lập danh sách, dấu chấm/danh sách.

11717
11:23:35,152 --> 11:23:39,682
Bây giờ hãy thực hiện Valgrind\nof dot/list, Enter.

11718
11:23:39,682 --> 11:23:43,012
Và bây giờ, hy vọng rằng tất cả\nheap khối đã được giải phóng.

11719
11:23:44,500 --> 11:23:47,542
Vì vậy đây có lẽ là kết quả tốt nhất\n

11720
11:23:47,542 --> 11:23:50,432
Tôi đã sử dụng vùng nhớ heap nhưng cũng đã giải phóng\ntất cả bộ nhớ.

11721
11:23:50,432 --> 11:23:52,112
Vì vậy, có 2 bản sửa lỗi cần thiết ở đó.

11722
11:23:52,612 --> 11:23:56,391
Nếu có bất kỳ câu hỏi nào về mảng này\n

11723
11:23:56,391 --> 11:23:59,012
có thể nói là phân bổ tĩnh mảng\nan.

11724
11:23:59,012 --> 11:24:00,711
Chỉ bằng cách mã hóa cứng số 3.

11725
11:24:00,711 --> 11:24:04,671
Phiên bản thứ hai bây giờ\nphân bổ mảng một cách động

11726
11:24:04,671 --> 11:24:06,862
sử dụng không phải ngăn xếp mà là đống.

11727
11:24:06,862 --> 11:24:10,281
Tuy nhiên, nó cũng gặp phải tình trạng\nschậm mà chúng tôi đã mô tả trước đó

11728
11:24:10,281 --> 11:24:12,771
phải sao chép tất cả\ngiá trị đó từ cái này sang cái khác.

11729
11:24:14,665 --> 11:24:17,340
ĐỐI TƯỢNG: Tại sao bạn không cần phải giải phóng TMP?

11730
11:24:18,381 --> 11:24:20,301
Tại sao tôi không phải giải phóng TMP?

11731
11:24:20,302 --> 11:24:22,612
Về cơ bản cuối cùng tôi đã làm được.

11732
11:24:22,612 --> 11:24:27,842
Bởi vì TMP đã trỏ\na vào đoạn 4 số nguyên.

11733
11:24:27,841 --> 11:24:33,291
Nhưng ở dòng 33 ở đây,\ntôi đã gán danh sách là

11734
11:24:33,292 --> 11:24:36,061
giống hệt với những gì TMP đã chỉ vào.

11735
11:24:36,061 --> 11:24:40,654
Và vì vậy, cuối cùng khi tôi giải phóng danh sách,\n

11736
11:24:40,654 --> 11:24:43,822
Thực ra, nếu tôi muốn, tôi có thể nói\n

11737
11:24:43,822 --> 11:24:45,561
Nhưng về mặt khái niệm thì nó sai.

11738
11:24:45,561 --> 11:24:49,612
Bởi vì tại thời điểm này trong câu chuyện, tôi\n

11739
11:24:50,722 --> 11:24:52,822
Nhưng họ giống nhau ở điểm\ntrong câu chuyện.

11740
11:24:53,322 --> 11:24:55,360
ĐỐI TƯỢNG: Là [? dòng ?] một phần của nó?

11741
11:24:56,402 --> 11:24:58,832
Và nói tóm lại,\mọi thứ chúng tôi đang làm cho đến nay

11742
11:24:58,832 --> 11:25:00,302
vẫn còn trong thế giới của mảng.

11743
11:25:00,302 --> 11:25:02,192
Sự khác biệt duy nhất\nchúng tôi đang tạo ra là

11744
11:25:02,192 --> 11:25:08,702
trong phiên bản 1, khi tôi nói int list\n

11745
11:25:08,701 --> 11:25:12,631
Cái gọi là phân bổ tĩnh\không phải ngăn xếp, như tuần trước.

11746
11:25:12,631 --> 11:25:16,381
Phiên bản này hiện vẫn đang xử lý\n

11747
11:25:16,381 --> 11:25:18,461
và sử dụng phân bổ bộ nhớ động.

11748
11:25:18,461 --> 11:25:20,979
Để tôi vẫn có thể sử dụng\narray cho những bức ảnh đầu tiên

11749
11:25:22,021 --> 11:25:24,551
Nhưng ít nhất tôi có thể phát triển\nmảng nếu tôi muốn.

11750
11:25:24,552 --> 11:25:28,472
Vì vậy, chúng ta thậm chí còn chưa giải quyết được vấn đề này, thậm chí\n

11751
11:25:30,061 --> 11:25:34,411
KHÁN GIẢ: Làm thế nào bạn có thể giải phóng\n

11752
11:25:34,411 --> 11:25:37,201
GIỌNG 1: Làm thế nào tôi có thể giải phóng danh sách?

11753
11:25:37,201 --> 11:25:41,791
Tôi đã giải phóng địa chỉ ban đầu của danh sách.

11754
11:25:41,792 --> 11:25:44,702
Sau đó, tôi đã thay đổi danh sách đang lưu trữ.

11755
11:25:44,701 --> 11:25:47,551
Tôi đang di chuyển mũi tên của nó tới\na đoạn bộ nhớ mới.

11756
11:25:47,552 --> 11:25:51,032
Và điều đó hoàn toàn hợp lý\nđể tôi thao túng

11757
11:25:51,031 --> 11:25:54,661
bởi vì bây giờ danh sách đang trỏ\na cùng một giá trị của TMP.

11758
11:25:54,661 --> 11:26:00,091
Và TMP là thứ được trả lại\n

11759
11:26:00,091 --> 11:26:02,261
Vì vậy, đoạn bộ nhớ đó là hợp lệ.

11760
11:26:02,262 --> 11:26:05,702
Vậy đây chỉ là những hình vuông\không phải bảng, đúng không.

11761
11:26:05,701 --> 11:26:07,451
Chỉ có con trỏ bên trong chúng.

11762
11:26:07,451 --> 11:26:09,368
Vì vậy, về mặt kỹ thuật\nđiều tôi đang nói là, và tôi không

11763
11:26:09,368 --> 11:26:11,521
chỉ ra rằng tôi không giải phóng\ndanh sách, tôi đang

11764
11:26:11,521 --> 11:26:16,141
giải phóng đoạn bộ nhớ bắt đầu\n

11765
11:26:16,141 --> 11:26:21,542
Vì thế, nếu sau vài dòng, tôi\n

11766
11:26:21,542 --> 11:26:25,561
Hoàn toàn hợp lý khi chạm vào đó\n

11767
11:26:25,561 --> 11:26:27,871
Bởi vì bạn không giải phóng\nbiến đó

11768
11:26:27,872 --> 11:26:30,272
bạn đang giải phóng địa chỉ\n trong biến.

11769
11:26:31,622 --> 11:26:37,232
Vì vậy, hãy để tôi sao lưu ở đây và\nbây giờ thực hiện chỉnh sửa cuối cùng.

11770
11:26:37,232 --> 11:26:41,672
Vì vậy, hãy kết thúc việc này mà\không có cải tiến cuối cùng nào ở đây.

11771
11:26:41,671 --> 11:26:44,641
Bởi vì hóa ra,\ncó một cách tốt hơn một chút

11772
11:26:44,641 --> 11:26:48,091
để thực sự thay đổi kích thước một mảng\nas mà chúng tôi đang thực hiện ở đây.

11773
11:26:48,091 --> 11:26:52,509
Và còn có một chức năng khác trong stdlib\n

11774
11:26:52,510 --> 11:26:55,052
Và tôi sẽ đi vào\nvà thực hiện một chút thay đổi

11775
11:26:55,052 --> 11:26:58,060
ở đây để tôi có thể làm những việc sau.

11776
11:26:58,059 --> 11:26:59,851
Hãy để tôi tiếp tục và\nnhận xét điều này trước tiên ngay bây giờ

11777
11:26:59,851 --> 11:27:02,801
chỉ để chúng tôi có thể theo dõi những gì\n

11778
11:27:02,802 --> 11:27:09,452
Vì vậy, phân bổ động\nan mảng có kích thước 3.

11779
11:27:09,451 --> 11:27:14,131
Gán 3 số cho mảng đó.

11780
11:27:15,811 --> 11:27:21,121
Phân bổ mảng mới có kích thước 4.

11781
11:27:21,122 --> 11:27:26,942
Sao chép số từ mảng cũ\narray sang mảng mới.

11782
11:27:26,942 --> 11:27:31,652
Và thêm số thứ tư vào mảng mới.

11783
11:27:36,332 --> 11:27:41,942
Hãy nhớ rằng, nếu bạn muốn, mảng mới\nsử dụng cùng một biến danh sách của tôi.

11784
11:27:49,741 --> 11:27:53,011
Và chúng tôi sẽ đăng mã này lên mạng sau\n

11785
11:27:53,012 --> 11:27:56,702
Vậy hóa ra là chúng ta có thể giảm bớt\n

11786
11:27:56,701 --> 11:27:59,461
Không nhiều lắm với việc in\nở đây, nhưng với việc sao chép này.

11787
11:27:59,461 --> 11:28:01,741
Hóa ra c có một\nhàm tên là realloc

11788
11:28:01,741 --> 11:28:07,061
thực sự có thể xử lý việc thay đổi kích thước\n

11789
11:28:07,061 --> 11:28:09,182
Tôi sẽ cuộn lên\nnơi tôi đã di chuyển trước đây

11790
11:28:09,182 --> 11:28:12,302
được phân bổ một mảng mới có kích thước 4.

11791
11:28:12,302 --> 11:28:19,502
Và thay vào đó tôi sẽ nói điều này,\n

11792
11:28:19,502 --> 11:28:21,959
Bây giờ, trước đây điều này\nhất thiết là không thể thực hiện được.

11793
11:28:21,959 --> 11:28:23,792
Bởi vì nhớ lại rằng chúng ta đã tự vẽ

11794
11:28:23,792 --> 11:28:25,625
vào một góc có\nví dụ trên màn hình

11795
11:28:25,625 --> 11:28:28,472
nơi xảy ra "Xin chào thế giới"\n

11796
11:28:29,891 --> 11:28:32,822
Hãy để tôi sử dụng realloc, để phân bổ lại.

11797
11:28:32,822 --> 11:28:36,122
Và không chỉ chuyển vào kích thước\nbộ nhớ mà chúng ta muốn lần này

11798
11:28:36,122 --> 11:28:39,812
mà còn cả địa chỉ\nmà chúng tôi muốn thay đổi kích thước.

11799
11:28:39,811 --> 11:28:43,421
Một lần nữa, mảng này có tên là list.

11800
11:28:43,921 --> 11:28:46,811
Mã sau đó\ngần như giống nhau.

11801
11:28:46,811 --> 11:28:50,682
Nhưng điều tôi không cần phải làm là điều này.

11802
11:28:50,682 --> 11:28:54,002
Vì vậy, realloc khá tiện dụng\n

11803
11:28:54,002 --> 11:28:57,152
Nếu ngay đầu giờ học,\n

11804
11:28:57,152 --> 11:29:00,491
Và bản năng của ai đó là chỉ muốn ngồi phịch\n

11805
11:29:00,491 --> 11:29:03,241
Nếu còn bộ nhớ trống,\nrealloc sẽ thực hiện việc đó.

11806
11:29:03,241 --> 11:29:07,682
Và bùng nổ, nó sẽ chỉ phát triển mảng\n

11807
11:29:07,682 --> 11:29:11,641
Tuy nhiên, nếu nó nhận ra, xin lỗi, có\n

11808
11:29:11,641 --> 11:29:14,521
hoặc thứ gì khác ở đó,\nrealloc sẽ xử lý

11809
11:29:14,521 --> 11:29:18,211
rắc rối khi di chuyển toàn bộ\narray đó từ 1 đoạn bộ nhớ

11810
11:29:18,211 --> 11:29:20,491
ban đầu, tới một đoạn bộ nhớ mới.

11811
11:29:20,491 --> 11:29:26,881
Và sau đó realloc sẽ trả lại cho bạn,\n

11812
11:29:26,881 --> 11:29:31,031
Và nó sẽ xử lý quá trình giải phóng đoạn cũ cho bạn.

11813
11:29:31,031 --> 11:29:33,281
Vì vậy, bạn không cần phải tự mình làm điều này.

11814
11:29:33,281 --> 11:29:36,612
Vì vậy, trên thực tế, hãy để tôi tiếp tục\nvà loại bỏ điều này.

11815
11:29:36,612 --> 11:29:41,582
Vì thế realloc chỉ cô đọng lại, rất nhiều thứ\n

11816
11:29:41,582 --> 11:29:45,592
Theo đó, realloc xử lý nó cho bạn.

11817
11:29:46,091 --> 11:29:49,151
Vì vậy, đó là cải tiến cuối cùng\không phải cách tiếp cận dựa trên mảng này.

11818
11:29:49,152 --> 11:29:51,932
Vậy bây giờ thì sao, biết\nký ức của bạn là gì

11819
11:29:51,932 --> 11:29:54,881
bây giờ chúng ta có thể làm gì với nó để giải quyết loại vấn đề đó?

11820
11:29:54,881 --> 11:29:56,801
Bởi vì thế giới\nsẽ trở nên rất chậm.

11821
11:29:56,802 --> 11:29:59,802
Và các ứng dụng, điện thoại và\n của chúng tôi

11822
11:29:59,802 --> 11:30:04,032
nếu chúng ta liên tục lãng phí\n

11823
11:30:04,031 --> 11:30:05,891
Thay vào đó chúng ta có thể làm gì?

11824
11:30:05,891 --> 11:30:07,961
Chà, hôm nay có một\ncú pháp mới

11825
11:30:07,961 --> 11:30:11,322
được xây dựng dựa trên 3 cú pháp\nof này từ quá khứ.

11826
11:30:11,322 --> 11:30:13,182
Hãy nhớ lại rằng chúng ta\nđã xem xét cấu trúc, cái mà

11827
11:30:13,182 --> 11:30:16,302
là một từ khóa trong C, nó giúp\nbạn phát minh ra cấu trúc của riêng mình.

11828
11:30:16,302 --> 11:30:19,542
Biến của riêng bạn, nếu bạn muốn,\nkết hợp với typedef.

11829
11:30:19,542 --> 11:30:23,682
Điều này cho phép bạn nói một người có tên\n

11830
11:30:23,682 --> 11:30:26,141
Hoặc một ứng cử viên có tên\và một số phiếu bầu.

11831
11:30:26,141 --> 11:30:30,521
Bạn có thể gói gọn nhiều phần\n

11832
11:30:30,521 --> 11:30:34,641
Đôi khi chúng ta đã sử dụng Ký hiệu dấu chấm\nđể làm gì?

11833
11:30:34,641 --> 11:30:37,949
Toán tử dấu chấm làm gì trong C?

11834
11:30:37,949 --> 11:30:39,241
ĐỐI TƯỢNG: Truy cập cấu trúc.

11835
11:30:39,631 --> 11:30:41,682
Để truy cập vào trường\bên trong cấu trúc.

11836
11:30:41,682 --> 11:30:43,807
Vì vậy, nếu bạn có một người\ncó tên và số điện thoại

11837
11:30:43,807 --> 11:30:46,832
bạn có thể nói điều gì đó như\nperson.name hoặc user.number

11838
11:30:46,832 --> 11:30:48,992
nếu người là tên\ncủa một biến như vậy.

11839
11:30:48,991 --> 11:30:51,331
Tất nhiên, Star, bây giờ chúng ta đã thấy theo một số cách.

11840
11:30:51,332 --> 11:30:55,022
Giống như tuần 1, chúng ta\nđã thấy nó giống như phép nhân.

11841
11:30:55,021 --> 11:30:58,231
Tuần trước, chúng ta đã bắt đầu thấy nó\trong ngữ cảnh của con trỏ

11842
11:30:58,232 --> 11:31:00,452
nhờ đó, bạn dùng nó\nđể khai báo một con trỏ.

11843
11:31:00,451 --> 11:31:03,041
Giống như int* p hoặc đại loại như thế.

11844
11:31:03,042 --> 11:31:05,522
Nhưng chúng tôi cũng thấy nó trong\không bối cảnh nào khác, mà

11845
11:31:05,521 --> 11:31:08,861
thì ngược lại,\nlà toán tử quy chiếu.

11846
11:31:08,862 --> 11:31:10,754
Nó nói rằng nếu đây là địa chỉ\nan thì đó là

11847
11:31:10,754 --> 11:31:13,711
nếu đây là một biến giống như một con trỏ,\n

11848
11:31:13,711 --> 11:31:17,461
thì không có int hoặc không có char,\nkhông có kiểu dữ liệu ở phía trước.

11849
11:31:17,461 --> 11:31:19,351
Có nghĩa là đi đến địa chỉ đó.

11850
11:31:19,351 --> 11:31:22,781
Và nó hủy đăng ký con trỏ\nand đi đến vị trí đó.

11851
11:31:22,781 --> 11:31:25,201
Vậy hoá ra việc sử dụng\n3 khối xây dựng này

11852
11:31:25,201 --> 11:31:28,241
bạn thực sự có thể bắt đầu sử dụng ngay bây giờ\n

11853
11:31:28,741 --> 11:31:31,201
Và thậm chí vào tuần tới, khi\nchúng tôi chuyển sang Python

11854
11:31:31,201 --> 11:31:33,841
và bạn bắt đầu nhận được nhiều\ntính năng miễn phí.

11855
11:31:33,841 --> 11:31:36,031
Giống như một dòng\ncode sẽ làm được rất nhiều việc

11856
11:31:36,031 --> 11:31:40,652
trong Python nhiều hơn trong C. Nó\n

11857
11:31:40,652 --> 11:31:42,542
Và chỉ vậy là bạn đã nhìn thấy nó rồi.

11858
11:31:42,542 --> 11:31:47,252
Hóa ra việc sử dụng toán tử này rất phổ biến trong C

11859
11:31:47,252 --> 11:31:51,271
để đi vào bên trong một cấu trúc và\n

11860
11:31:51,271 --> 11:31:53,731
rằng có\nchú thích viết tắt cho nó, hay còn gọi là.

11861
11:31:54,932 --> 11:31:56,576
Điều đó thực sự trông giống như một mũi tên.

11862
11:31:56,576 --> 11:31:58,951
Vì vậy hãy nhớ lại tuần trước, tôi có thói quen chỉ tay, thậm chí

11863
11:32:00,152 --> 11:32:04,502
Ký hiệu mũi tên này, a\nhyphen và dấu ngoặc nhọn

11864
11:32:04,502 --> 11:32:11,432
biểu thị việc đi tới một địa chỉ và\nxem trường bên trong địa chỉ đó.

11865
11:32:11,432 --> 11:32:13,722
Nhưng chúng ta sẽ thấy điều này\ntrong thực tế sau một lát nữa.

11866
11:32:13,722 --> 11:32:16,592
Vậy giải pháp\ncó thể là gì cho vấn đề này bây giờ

11867
11:32:16,591 --> 11:32:20,101
chúng ta đã thấy cách đây một lúc, theo đó, chúng ta đã có\n

11868
11:32:20,101 --> 11:32:23,381
Và ký ức của chúng tôi, cách đây một lát\na, trông như thế này.

11869
11:32:23,381 --> 11:32:28,201
Chúng tôi chỉ có thể sao chép toàn bộ\n hiện có

11870
11:32:29,491 --> 11:32:33,331
Giải pháp khác có lẽ\ntốt hơn trong dài hạn là gì

11871
11:32:33,332 --> 11:32:38,627
được, điều đó không yêu cầu\nliên tục di chuyển đồ đạc xung quanh?

11872
11:32:38,627 --> 11:32:40,502
Có thể chờ đợi\nbản năng của bạn nếu bạn

11873
11:32:40,502 --> 11:32:44,682
biết cụm từ buzz mà chúng tôi đang tìm kiếm\n

11874
11:32:44,682 --> 11:32:47,281
Nhưng nếu chúng ta muốn tránh\ndi chuyển số 1, 2 và 3

11875
11:32:47,281 --> 11:32:49,981
nhưng chúng tôi vẫn muốn có thể\nthêm lượng dữ liệu vô tận.

11876
11:32:51,961 --> 11:32:54,872
Vì vậy, có thể tạo một số loại danh sách\nof bằng cách sử dụng các con trỏ

11877
11:32:54,872 --> 11:32:56,852
chỉ cần trỏ vào một vị trí mới, phải không.

11878
11:32:56,851 --> 11:32:59,972
Trong một thế giới lý tưởng, mặc dù\nmảnh ký ức này

11879
11:32:59,972 --> 11:33:02,912
đang được h này sử dụng trong\nchuỗi "Xin chào, thế giới"

11880
11:33:02,911 --> 11:33:05,461
có lẽ bằng cách nào đó chúng ta có thể sử dụng con trỏ\na từ tuần trước.

11881
11:33:05,461 --> 11:33:09,811
Giống như một mũi tên, chỉ sau\n

11882
11:33:11,521 --> 11:33:15,791
Và bạn chỉ cần ghép những số nguyên này lại với nhau trong bộ nhớ

11883
11:33:15,792 --> 11:33:17,822
để mỗi cái dẫn đến cái tiếp theo.

11884
11:33:17,822 --> 11:33:21,182
Nó không nhất thiết phải như vậy\ntheo đúng nghĩa đen là nó quay lưng lại với nhau.

11885
11:33:21,182 --> 11:33:23,432
Có vẻ như điều đó có\nnhược điểm

11886
11:33:23,432 --> 11:33:24,991
khiến chúng ta tốn một ít không gian.

11887
11:33:24,991 --> 11:33:27,601
Giống như một con trỏ, có chức năng gọi lại,\nchiếm một khoảng không gian.

11888
11:33:27,601 --> 11:33:29,881
Thông thường là 8 byte hoặc 64 bit.

11889
11:33:29,881 --> 11:33:33,481
Nhưng tôi không cần phải sao chép lượng dữ liệu khổng lồ\na chỉ

11890
11:33:34,921 --> 11:33:36,760
Và vì thế những thứ này đều có tên.

11891
11:33:36,760 --> 11:33:38,552
Và thực sự, những điều này\na là những gì nói chung

11892
11:33:38,552 --> 11:33:42,302
sẽ được gọi là danh sách liên kết.

11893
11:33:42,302 --> 11:33:44,822
Danh sách liên kết nắm bắt\chính xác trực giác đó

11894
11:33:44,822 --> 11:33:46,542
liên kết các sự vật lại với nhau trong trí nhớ.

11895
11:33:46,542 --> 11:33:48,012
Vì vậy, chúng ta hãy xem một ví dụ.

11896
11:33:48,012 --> 11:33:49,804
Đây là bản tóm tắt\nbộ nhớ của máy tính.

11897
11:33:49,803 --> 11:33:52,621
Giả sử tôi đang cố gắng\ntạo một mảng.

11898
11:33:52,622 --> 11:33:55,682
Bây giờ chúng ta hãy khái quát nó thành một danh sách các số.

11899
11:33:55,682 --> 11:33:57,362
Một mảng có một ý nghĩa rất cụ thể.

11900
11:33:57,362 --> 11:34:00,092
Đó là ký ức liền kề nhau,\nquay lại, quay lại, quay lại.

11901
11:34:00,091 --> 11:34:03,721
Vào cuối ngày, tôi với tư cách là\n

11902
11:34:05,822 --> 11:34:09,781
Tôi thực sự không quan tâm nó được lưu trữ như thế nào.

11903
11:34:09,781 --> 11:34:12,091
Tôi không quan tâm nó được lưu trữ như thế nào\nkhi tôi viết mã

11904
11:34:12,091 --> 11:34:13,924
Tôi chỉ muốn làm việc vào cuối ngày.

11905
11:34:13,925 --> 11:34:16,052
Vì vậy, giả sử rằng trước tiên tôi\chèn số 1 của mình.

11906
11:34:16,052 --> 11:34:19,592
Và ai biết được, nó kết thúc ở vị trí 0X123

11907
11:34:21,302 --> 11:34:23,552
Có lẽ đã có thứ gì đó ở đây rồi.

11908
11:34:23,552 --> 11:34:25,592
Và chết tiệt, có lẽ đã có\nthứ gì đó ở đây rồi

11909
11:34:25,591 --> 11:34:28,576
nhưng có rất nhiều lựa chọn khác\nđể biết thứ này có thể đi đến đâu.

11910
11:34:28,576 --> 11:34:30,451
Và giả sử rằng, vì mục đích thảo luận

11911
11:34:30,451 --> 11:34:32,284
chỗ\ncó sẵn đầu tiên cho số tiếp theo

11912
11:34:32,285 --> 11:34:38,094
tình cờ lại ở đây, tại địa điểm\n

11913
11:34:38,093 --> 11:34:40,051
Vì vậy, đó là nơi tôi sẽ\nđánh dấu số 2.

11914
11:34:40,052 --> 11:34:41,552
Và số 3 có thể kết thúc ở đâu?

11915
11:34:41,552 --> 11:34:44,342
Ồ, tôi không biết, có lẽ\nở dưới đó ở số 0X789.

11916
11:34:44,341 --> 11:34:48,511
Vấn đề là tôi không biết\nlà gì hoặc thực sự quan tâm đến điều gì

11917
11:34:48,512 --> 11:34:50,672
mọi thứ khác nằm trong bộ nhớ của máy tính.

11918
11:34:50,671 --> 11:34:54,722
Tôi chỉ quan tâm rằng có sẵn\nít nhất 3 địa điểm ở đó

11919
11:34:54,722 --> 11:34:57,781
Tôi có thể đặt số 1, số 2 và số 3 của mình.

11920
11:34:57,781 --> 11:35:01,502
Nhưng điều đáng chú ý là bây giờ\nchúng ta không sử dụng mảng

11921
11:35:01,502 --> 11:35:05,851
chúng ta không thể ngây thơ cho rằng\n

11922
11:35:06,991 --> 11:35:10,441
Thêm 2 vào chỉ mục và bùm\nbạn đang ở số tiếp theo, tiếp theo.

11923
11:35:10,442 --> 11:35:14,852
Bây giờ bạn phải để lại những thứ này\n

11924
11:35:14,851 --> 11:35:17,161
để dẫn từ người này sang người khác.

11925
11:35:17,161 --> 11:35:19,351
Và đôi khi, nó có thể ở\ngần, cách một vài byte.

11926
11:35:19,351 --> 11:35:23,292
Có lẽ, nó cách xa cả gigabyte\n

11927
11:35:25,021 --> 11:35:30,252
Giống như những con trỏ này\ngo như bạn đã đề xuất ở đâu?

11928
11:35:30,752 --> 11:35:32,822
Tất cả những gì tôi có quyền truy cập ở đây là byte.

11929
11:35:32,822 --> 11:35:34,891
Tôi đã lưu trữ\n1, 2 và 3.

11930
11:35:37,961 --> 11:35:40,851
Vì vậy, hãy để tôi, bạn đặt con trỏ\nngay bên cạnh những con số này.

11931
11:35:40,851 --> 11:35:44,891
Vậy nên ít nhất hãy để tôi lên kế hoạch trước, để\n

11932
11:35:44,891 --> 11:35:47,951
nhớ lại tuần trước, với\nký ức nào đó, bây giờ tôi không hỏi nó

11933
11:35:47,951 --> 11:35:49,856
dành chỗ cho số đó.

11934
11:35:49,857 --> 11:35:51,732
Hãy để tôi bắt đầu tập thói quen hỏi

11935
11:35:51,732 --> 11:35:56,832
malloc để có đủ chỗ cho số\n

11936
11:35:56,832 --> 11:35:59,542
Vì vậy, tôi sẽ hung hãn hơn một chút\n khi yêu cầu thêm bộ nhớ.

11937
11:36:00,822 --> 11:36:02,622
Và đây là một ví dụ về sự đánh đổi.

11938
11:36:02,622 --> 11:36:06,402
Hầu như mọi lúc trong CS, khi bạn bắt đầu\n

11939
11:36:06,402 --> 11:36:10,662
Hoặc nếu bạn cố gắng tiết kiệm dung lượng,\nbạn có thể phải mất thời gian.

11940
11:36:10,661 --> 11:36:12,161
Đó là sự đánh đổi ở đó.

11941
11:36:14,391 --> 11:36:15,942
Hãy để tôi tóm tắt điều này đi.

11942
11:36:15,942 --> 11:36:19,057
Và dù ở bên cạnh hay bên dưới, tôi\n

11943
11:36:19,057 --> 11:36:20,182
vì mục đích thảo luận.

11944
11:36:20,182 --> 11:36:22,152
Vì vậy, mũi tên đẹp hơn một chút.

11945
11:36:22,152 --> 11:36:25,062
Tôi đã yêu cầu malloc\nbây giờ có dung lượng gấp đôi

11946
11:36:25,061 --> 11:36:27,072
có vẻ như hơn mức tôi cần trước đây.

11947
11:36:27,072 --> 11:36:31,016
Nhưng tôi sẽ sử dụng đoạn thứ hai này\n

11948
11:36:31,016 --> 11:36:33,641
Và tôi sẽ sử dụng đoạn\nof bộ nhớ này để tham khảo phần tiếp theo

11949
11:36:33,641 --> 11:36:35,451
về cơ bản là ghép\nthứ này lại với nhau.

11950
11:36:35,451 --> 11:36:37,511
Vậy hộp đầu tiên nên có những gì?

11951
11:36:37,512 --> 11:36:41,082
Vâng, tôi xác nhận số, 0X456.

11952
11:36:41,082 --> 11:36:43,781
Và nó được viết bằng hex vì\nit đại diện cho một địa chỉ bộ nhớ.

11953
11:36:43,781 --> 11:36:47,801
Nhưng điều này tương đương với việc vẽ\n

11954
11:36:47,802 --> 11:36:51,552
Để kiểm tra một chút ở đây, ô\nnên có những gì trong ô thứ hai này

11955
11:36:51,552 --> 11:36:55,422
nếu mục tiêu là ghép những thứ này lại với nhau theo thứ tự 1, 2, 3 thì sao?

11956
11:36:55,421 --> 11:36:57,593
Hãy thoải mái hét lên điều này.

11957
11:36:59,052 --> 11:37:00,472
GIỌNG 1: Được rồi, nó hoạt động tốt.

11958
11:37:01,396 --> 11:37:04,271
Và bạn không thể làm điều đó bằng tay\n

11959
11:37:04,271 --> 11:37:08,511
Vậy 0X789 nên vào đây vì đó\n

11960
11:37:08,512 --> 11:37:11,772
Và rồi, chúng ta thực sự không có nhiều khả năng ở đây.

11961
11:37:11,771 --> 11:37:14,441
Điều này phải có một giá trị, phải không.

11962
11:37:14,442 --> 11:37:19,312
Bởi vì vào cuối ngày, đó\n

11963
11:37:19,311 --> 11:37:22,651
Vậy giá trị nào nên có ở đây,\nnếu đây là phần cuối của danh sách này?

11964
11:37:23,652 --> 11:37:25,752
LOA 1: Vậy nó có thể là 0X123.

11965
11:37:25,752 --> 11:37:29,531
Hàm ý rằng\nit sẽ là một danh sách theo chu kỳ.

11966
11:37:29,531 --> 11:37:32,051
Điều đó không sao, nhưng\ncó thể có vấn đề.

11967
11:37:32,052 --> 11:37:36,102
Nếu bất kỳ ai trong số các bạn vô tình\n

11968
11:37:36,101 --> 11:37:39,161
bởi vì bạn có một vòng lặp vô hạn,\n

11969
11:37:39,161 --> 11:37:43,811
để tạo cho mình xác suất ngẫu nhiên\ncủa một vòng lặp vô hạn.

11970
11:37:43,811 --> 11:37:46,398
Điều gì có thể đơn giản hơn\nvà tránh được điều đó?

11971
11:37:48,612 --> 11:37:50,322
LOA 1: Vậy chỉ là ký tự null.

11972
11:37:50,322 --> 11:37:53,021
Không phải N-U-L, gây nhầm lẫn,\nis ở cuối chuỗi.

11973
11:37:53,021 --> 11:37:56,031
Nhưng N-U-L-L, như chúng tôi đã giới thiệu vào tuần trước.

11974
11:37:58,061 --> 11:38:00,881
Vì vậy đây chỉ là một giá trị đặc biệt\nmà các lập trình viên cách đây hàng chục năm

11975
11:38:00,881 --> 11:38:04,991
đã quyết định rằng nếu bạn lưu trữ địa chỉ\n

11976
11:38:04,991 --> 11:38:07,902
Sẽ không bao giờ có\nđiều gì hữu ích ở mức 0x0.

11977
11:38:07,902 --> 11:38:11,082
Vì vậy, nó là một giá trị canh gác\n, chỉ là một giá trị đặc biệt

11978
11:38:12,281 --> 11:38:14,351
Không còn nơi nào để đi nữa.

11979
11:38:14,351 --> 11:38:17,951
Bạn có thể quay lại\n của mình

11980
11:38:17,951 --> 11:38:19,871
Nhưng có lẽ chúng ta nên\nđủ thông minh để

11981
11:38:19,872 --> 11:38:23,862
hãy nhớ danh sách bắt đầu từ đâu\nđể bạn có thể phát hiện các chu kỳ.

11982
11:38:23,862 --> 11:38:26,421
Ngược lại, nếu bạn bắt đầu lặp quanh\ncấu trúc này.

11983
11:38:26,921 --> 11:38:29,121
Nhưng những địa chỉ này, những người thực sự\nquan tâm đến cuối ngày

11984
11:38:30,402 --> 11:38:32,302
Thực sự bây giờ nó trông như thế này.

11985
11:38:32,302 --> 11:38:35,260
Và thực sự, đây là cách mà hầu hết mọi người\n

11986
11:38:35,260 --> 11:38:36,552
nếu có một cuộc thảo luận tại nơi làm việc.

11987
11:38:36,552 --> 11:38:38,344
Nói về những dữ liệu\ncấu trúc nào chúng ta nên

11988
11:38:38,343 --> 11:38:40,271
sử dụng để giải quyết một số vấn đề\trong thế giới thực.

11989
11:38:40,271 --> 11:38:42,521
Nói chung, chúng tôi không quan tâm\nvề địa chỉ.

11990
11:38:42,521 --> 11:38:45,111
Chúng tôi quan tâm rằng trong mã chúng tôi có thể truy cập chúng.

11991
11:38:45,112 --> 11:38:48,072
Nhưng xét về mặt khái niệm thì điều này có lẽ là như vậy

11992
11:38:48,072 --> 11:38:49,720
cách đúng đắn để suy nghĩ về điều này.

11993
11:38:49,720 --> 11:38:51,678
Được rồi, hãy để tôi tạm dừng\nở đây và xem liệu có

11994
11:38:51,678 --> 11:38:55,901
bất kỳ câu hỏi nào về ý tưởng sáng tạo này\n

11995
11:38:55,902 --> 11:39:00,022
không chỉ những con số như 1,\n2, 3 mà còn có lượng dữ liệu gấp đôi.

11996
11:39:00,021 --> 11:39:02,591
Để bạn có\nmẩu bánh mì nhỏ ở dạng con trỏ

11997
11:39:02,591 --> 11:39:05,991
điều đó có thể dẫn bạn từ cái này sang cái khác.

11998
11:39:05,991 --> 11:39:08,155
Bạn có câu hỏi nào về các danh sách liên kết này không?

11999
11:39:14,913 --> 11:39:19,506
ĐỐI TƯỢNG: Vậy việc này có tốn\nnhiều bộ nhớ hơn một mảng không?

12000
11:39:19,506 --> 11:39:21,631
LOA 1: Việc này chiếm\nnhiều bộ nhớ hơn một mảng

12001
11:39:21,631 --> 11:39:24,180
bởi vì bây giờ tôi cần khoảng trống\ncho những con trỏ này.

12002
11:39:24,180 --> 11:39:28,151
Và để rõ ràng, về mặt kỹ thuật, tôi không thực sự vẽ cái này theo tỷ lệ.

12003
11:39:28,152 --> 11:39:31,082
Cho đến giờ, trong lớp, chúng ta\nthường nghĩ về số nguyên

12004
11:39:31,082 --> 11:39:33,992
như 1, 2 và 3,\nlà 4 byte hoặc 32 bit.

12005
11:39:33,991 --> 11:39:37,021
Tôi đã khẳng định vào tuần trước rằng các con trỏ\không phải của máy tính hiện đại

12006
11:39:37,021 --> 11:39:40,051
có xu hướng là 8 byte hoặc 64 bit.

12007
11:39:40,052 --> 11:39:42,762
Vì vậy, về mặt kỹ thuật, chiếc hộp này thực sự phải lớn hơn một chút.

12008
11:39:42,762 --> 11:39:44,461
Nó chỉ trông có vẻ hơi ngu ngốc trong ảnh mà thôi.

12009
11:39:45,811 --> 11:39:48,811
Tuy nhiên, thực tế là bạn đang sử dụng\nnhiều dung lượng hơn.

12010
11:39:50,269 --> 11:39:51,601
GIỌNG 1: Ồ, sao-- xin lỗi.

12011
11:39:51,601 --> 11:39:55,451
Làm cách nào máy tính xác định\dữ liệu hữu ích từ dữ liệu đã sử dụng?

12012
11:39:55,451 --> 11:39:58,261
Vì vậy, ví dụ: giá trị rác\n hoặc giá trị không rác.

12013
11:39:58,262 --> 11:40:00,902
Bây giờ, hãy nghĩ rằng\đó là công việc của malloc.

12014
11:40:00,902 --> 11:40:04,292
Vì vậy, khi bạn yêu cầu malloc bộ nhớ,\nas chúng ta đã bắt đầu vào tuần trước

12015
11:40:04,292 --> 11:40:07,472
malloc theo dõi các\nđịa chỉ của bộ nhớ

12016
11:40:07,472 --> 11:40:10,442
nó đã được chuyển giao thành các giá trị hợp lệ.

12017
11:40:10,442 --> 11:40:12,932
Loại bộ nhớ khác mà bạn\nsử dụng, không chỉ từ vùng nhớ heap.

12018
11:40:12,932 --> 11:40:15,872
Bởi vì nhớ lại chúng ta đã thảo luận ngắn gọn rằng malloc sử dụng không gian

12019
11:40:15,872 --> 11:40:18,872
từ vùng heap được rút ra tại\n

12020
11:40:18,872 --> 11:40:22,702
Ngoài ra còn có bộ nhớ ngăn xếp\n

12021
11:40:22,701 --> 11:40:25,201
Và nơi chứa tất cả bộ nhớ\được sử dụng bởi các chức năng riêng lẻ.

12022
11:40:25,201 --> 11:40:27,534
Và điều đó đã được vẽ trong bức tranh\nđang tiến triển.

12023
11:40:27,535 --> 11:40:30,302
Đó chỉ là sự thể hiện phương hướng của một nghệ sĩ.

12024
11:40:30,302 --> 11:40:33,662
Về cơ bản, trình biên dịch\ncũng sẽ trợ giúp

12025
11:40:33,661 --> 11:40:37,349
theo dõi giá trị nào\nhợp lệ hoặc không nằm trong ngăn xếp.

12026
11:40:37,349 --> 11:40:39,391
Hoặc thực sự là\ncode cơ bản mà bạn đã viết

12027
11:40:39,391 --> 11:40:40,724
sẽ theo dõi điều đó cho bạn.

12028
11:40:40,724 --> 11:40:43,691
Vì vậy, nó được quản lý cho bạn tại thời điểm đó.

12029
11:40:44,792 --> 11:40:46,522
Xin lỗi, tôi phải mất một chút thời gian để bắt kịp.

12030
11:40:46,521 --> 11:40:48,691
Vì vậy, bây giờ chúng ta hãy dịch\nđiều này sang mã thực tế.

12031
11:40:48,692 --> 11:40:52,262
Làm cách nào chúng tôi có thể thực hiện ý tưởng này\n

12032
11:40:52,262 --> 11:40:53,641
Và đó là một thuật ngữ của NCS của chúng tôi.

12033
11:40:53,641 --> 11:40:57,692
Bất cứ khi nào bạn có một số cấu trúc dữ liệu\n

12034
11:40:57,692 --> 11:41:00,429
N-O-D-E, là thuật ngữ chung cho điều đó.

12035
11:41:00,428 --> 11:41:02,261
Vì vậy, mỗi cái này\ncó thể được coi là một nút.

12036
11:41:03,311 --> 11:41:06,103
À, một vài tuần trước, chúng tôi đã thấy\n

12037
11:41:06,103 --> 11:41:07,741
như một sinh viên hay một ứng cử viên.

12038
11:41:07,741 --> 11:41:12,421
Và một sinh viên, hay đúng hơn là một con người,\n

12039
11:41:12,421 --> 11:41:14,161
Và chúng tôi đã sử dụng một vài cú pháp ở đây.

12040
11:41:14,161 --> 11:41:17,371
Thứ nhất, chúng tôi sử dụng từ khóa struct\ntừ khóa này cung cấp cho chúng tôi cấu trúc dữ liệu.

12041
11:41:17,372 --> 11:41:21,902
Chúng tôi sử dụng typedef, xác định người\nname là dữ liệu mới của chúng tôi

12042
11:41:21,902 --> 11:41:24,332
type đại diện cho toàn bộ cấu trúc đó.

12043
11:41:24,332 --> 11:41:26,432
Vậy có lẽ chúng ta có\nthành phần phù hợp ở đây

12044
11:41:26,432 --> 11:41:28,982
để xây dựng thứ này được gọi là nút.

12045
11:41:28,982 --> 11:41:32,102
Và để cho rõ ràng, điều gì nên\n

12046
11:41:32,917 --> 11:41:35,042
Rõ ràng nó sẽ không phải là một cái tên\hay một con số.

12047
11:41:35,042 --> 11:41:39,732
Nhưng có lẽ một nút nên có những gì trong những trường đó?

12048
11:41:41,107 --> 11:41:44,082
GIỌNG 1: Vậy một số giống như một\nsố và một con trỏ ở một dạng nào đó.

12049
11:41:44,082 --> 11:41:46,332
Vì vậy, hãy dịch mã này sang mã thực tế.

12050
11:41:46,332 --> 11:41:51,092
Vì vậy, hãy đổi tên người thành nút\nđể nắm bắt được khái niệm này ở đây.

12051
11:41:52,347 --> 11:41:54,222
Nếu nó chỉ là một int thì không sao.

12052
11:41:54,222 --> 11:41:56,461
Chúng ta chỉ có thể nói int number,\cũng không phải int n, hoặc bất cứ điều gì

12053
11:41:56,461 --> 11:41:58,862
bạn muốn gọi trường cụ thể đó.

12054
11:41:58,862 --> 11:42:00,554
Điều tiếp theo là một chút không rõ ràng.

12055
11:42:00,553 --> 11:42:02,761
Và đây là nơi ban đầu mọi thứ có vẻ hơi kỳ lạ

12056
11:42:02,762 --> 11:42:05,312
nhưng nhìn lại, tất cả đều phải ăn khớp với nhau.

12057
11:42:05,311 --> 11:42:11,112
Hãy để tôi đề xuất rằng, lý tưởng nhất là chúng ta\n

12058
11:42:11,112 --> 11:42:13,412
Và tôi có thể gọi từ\ntiếp theo là bất cứ tên gì tôi muốn.

12059
11:42:13,411 --> 11:42:17,591
Tiếp theo chỉ có nghĩa là những gì xảy ra sau\n

12060
11:42:17,591 --> 11:42:19,981
Vì vậy, rất nhiều người CS sẽ\nchỉ sử dụng next để thể hiện

12061
11:42:22,741 --> 11:42:25,921
Hãy nhớ lại rằng trình biên dịch C và C khá đơn giản.

12062
11:42:25,921 --> 11:42:29,141
Họ chỉ nhìn mã từ trên xuống dưới, từ trái sang phải.

12063
11:42:29,141 --> 11:42:31,322
Và bất cứ khi nào họ gặp\na từ họ chưa bao giờ

12064
11:42:31,322 --> 11:42:32,995
đã thấy trước đó, những điều tồi tệ sẽ xảy ra.

12065
11:42:32,995 --> 11:42:34,412
Giống như, bạn không thể biên dịch mã của mình.

12066
11:42:34,411 --> 11:42:36,401
Bạn nhận được một số thông báo\nlỗi khó hiểu hoặc tương tự.

12067
11:42:36,402 --> 11:42:39,391
Và điều đó có vẻ\nsắp xảy ra ở đây.

12068
11:42:39,391 --> 11:42:42,451
Bởi vì nếu trình biên dịch đang đọc\nmã này từ trên xuống dưới

12069
11:42:42,451 --> 11:42:44,822
nó sẽ nói, ồ,\bên trong cấu trúc này

12070
11:42:44,822 --> 11:42:46,622
phải là một biến được gọi tiếp theo.

12071
11:42:49,682 --> 11:42:52,951
Bởi vì nó thực sự\nkhông tìm ra cho đến khi 2 dòng

12072
11:42:52,951 --> 11:42:55,201
sau đó, sau dấu chấm phẩy đó.

12073
11:42:55,201 --> 11:42:57,811
Vì vậy, cách để tránh điều này, điều\nchúng ta chưa từng thấy trước đây

12074
11:42:57,811 --> 11:43:02,701
là bạn có thể tạm thời đặt tên này\n

12075
11:43:02,701 --> 11:43:08,041
Và sau đó, ở dưới đây bên trong\n

12076
11:43:08,042 --> 11:43:09,692
Và sau đó, bạn để phần còn lại một mình.

12077
11:43:09,692 --> 11:43:14,102
Đây là một cách giải quyết\ncó thể thực hiện được vì bây giờ bạn

12078
11:43:14,101 --> 11:43:17,222
dạy trình biên dịch, từ\ndòng đầu tiên, ở đây có

12079
11:43:17,222 --> 11:43:19,442
một cấu trúc dữ liệu được gọi là nút cấu trúc.

12080
11:43:19,442 --> 11:43:22,902
Ở dưới đây bạn đang rút ngắn tên\n

12081
11:43:23,402 --> 11:43:26,485
Nó chỉ thuận tiện hơn một chút\n

12082
11:43:26,485 --> 11:43:30,241
Nhưng bạn phải viết struct\n

12083
11:43:30,241 --> 11:43:33,211
Nhưng không sao cả vì nó\đã tồn tại rồi

12084
11:43:33,211 --> 11:43:35,373
bây giờ, kể từ dòng mã đầu tiên đó.

12085
11:43:35,374 --> 11:43:37,082
Vậy đó là điểm khác biệt cơ bản duy nhất

12086
11:43:37,082 --> 11:43:40,382
giữa những gì chúng tôi đã làm tuần trước\nvới một người hoặc một ứng viên.

12087
11:43:40,381 --> 11:43:45,371
Bây giờ chúng ta phải sử dụng cách giải quyết\nstruct này, về mặt cú pháp.

12088
11:43:46,652 --> 11:43:50,491
KHÁN GIẢ: Vì vậy [KHÔNG NGHE ĐƯỢC] hãy thích\n

12089
11:43:51,451 --> 11:43:56,551
LOA 1: Tại sao lại là biến tiếp theo\n

12090
11:43:58,631 --> 11:44:01,351
Vì vậy hãy nghĩ về bức tranh\nchúng ta đang cố gắng vẽ.

12091
11:44:01,351 --> 11:44:05,222
Về mặt kỹ thuật thì đúng vậy, mỗi\thu hẹp này tôi đã cố tình vẽ

12092
11:44:07,982 --> 11:44:10,802
Họ cần trỏ đến\ntoàn bộ cấu trúc dữ liệu trong bộ nhớ.

12093
11:44:10,802 --> 11:44:13,082
Bởi vì máy tính\cuối cùng và trình biên dịch

12094
11:44:13,082 --> 11:44:16,952
ngược lại, cần phải biết rằng điều này\n

12095
11:44:18,521 --> 11:44:21,851
Bên trong một nút là một số\nvà một con trỏ khác.

12096
11:44:21,851 --> 11:44:24,252
Vì vậy, khi bạn vẽ những\mũi tên này, nó sẽ là

12097
11:44:24,252 --> 11:44:26,862
không đúng khi chỉ vào con số.

12098
11:44:26,862 --> 11:44:29,239
Bởi vì điều đó ném đi\nthông tin mà

12099
11:44:29,239 --> 11:44:31,572
sẽ khiến trình biên dịch\ntự hỏi, được rồi, tôi đang ở một con số.

12100
11:44:31,572 --> 11:44:32,682
Con trỏ ở chỗ quái nào thế?

12101
11:44:32,682 --> 11:44:34,932
Bạn phải nói với nó rằng\nit đang trỏ vào toàn bộ nút

12102
11:44:34,932 --> 11:44:38,338
nên nó biết con trỏ tương ứng cách đó vài byte.

12103
11:44:40,665 --> 11:44:42,112
KHÁN GIẢ: Bạn thế nào [KHÔNG NGHE ĐƯỢC].

12104
11:44:42,112 --> 11:44:43,444
NGƯỜI GIỌNG 1: Câu hỏi thực sự hay.

12105
11:44:43,444 --> 11:44:46,731
Có vẻ như giống như\nsao chép mảng trước đó

12106
11:44:46,732 --> 11:44:49,942
cần gấp đôi bộ nhớ,\n

12107
11:44:49,942 --> 11:44:52,612
Vì vậy, về mặt kỹ thuật, gấp đôi\ncộng 1 cho số mới.

12108
11:44:52,612 --> 11:44:56,002
Ở đây cũng vậy, có vẻ như chúng ta cũng đang\nsử dụng nhiều bộ nhớ gấp đôi.

12109
11:44:56,002 --> 11:44:58,881
Và theo nhận xét của tôi trước đó, đó là\n

12110
11:44:58,881 --> 11:45:02,752
bởi vì những con trỏ này có kích thước 8 byte, và\n

12111
11:45:04,762 --> 11:45:08,391
Trong ngữ cảnh của mảng, bạn\n

12112
11:45:08,391 --> 11:45:10,231
Vì vậy, vâng, bạn cần\nbộ nhớ nhiều gấp đôi.

12113
11:45:10,232 --> 11:45:13,082
Nhưng sau đó bạn đã nhanh chóng\ngiải phóng mảng ban đầu.

12114
11:45:13,082 --> 11:45:16,372
Vậy là bạn đã không tiêu thụ lâu dài,\n

12115
11:45:16,372 --> 11:45:19,772
Sự khác biệt ở đây cũng\nlà, như chúng ta sẽ thấy sau đây

12116
11:45:19,771 --> 11:45:23,151
hóa ra nó sẽ như vậy\n

12117
11:45:23,152 --> 11:45:25,101
để chèn số mới vào đây.

12118
11:45:25,101 --> 11:45:28,101
Bởi vì tôi sẽ không phải\n thực hiện một số lượng lớn việc sao chép.

12119
11:45:28,101 --> 11:45:31,281
Và mặc dù tôi có thể vẫn còn\n

12120
11:45:31,281 --> 11:45:33,561
sẽ mất một khoảng thời gian, tôi

12121
11:45:33,561 --> 11:45:36,951
sẽ không cần phải yêu cầu\n

12122
11:45:36,951 --> 11:45:40,671
Và một số thao tác nhất định trong máy tính,\n

12123
11:45:40,671 --> 11:45:42,481
bộ nhớ ngược, có xu hướng chậm hơn.

12124
11:45:42,482 --> 11:45:44,340
Vì vậy, chúng ta cũng tránh được\ntình huống đó.

12125
11:45:44,339 --> 11:45:46,131
Tuy nhiên, sẽ có\nmột số nhược điểm.

12126
11:45:47,182 --> 11:45:51,241
Nhưng lát nữa chúng ta sẽ thấy điều gì đó\n

12127
11:45:51,741 --> 11:45:56,222
Vậy từ đây, nếu chúng ta quay trở lại\n

12128
11:45:56,222 --> 11:45:59,302
bây giờ chúng ta hãy bắt đầu xây dựng một\ndanh sách liên kết với một số mã thực tế.

12129
11:45:59,302 --> 11:46:03,682
Bạn thực hiện như thế nào trong C\nbiểu diễn một danh sách liên kết trong mã?

12130
11:46:03,682 --> 11:46:06,262
Chà, vào thời điểm hiện tại, mọi chuyện thực ra sẽ đơn giản như thế này.

12131
11:46:06,262 --> 11:46:09,412
Bạn khai báo một biến,\ngọi là danh sách chẳng hạn.

12132
11:46:09,411 --> 11:46:12,451
Bản thân nó lưu trữ\nđịa chỉ của một nút.

12133
11:46:14,701 --> 11:46:17,362
Vì vậy, nếu bạn muốn lưu trữ\na danh sách liên kết trong bộ nhớ

12134
11:46:17,362 --> 11:46:19,879
bạn chỉ cần tạo một danh sách biến\nđược gọi hoặc bất cứ thứ gì khác.

12135
11:46:19,879 --> 11:46:21,711
Và bạn chỉ cần nói rằng\nbiến này đang diễn ra

12136
11:46:21,711 --> 11:46:25,911
để trỏ vào nút đầu tiên trong a\n

12137
11:46:25,911 --> 11:46:29,751
Bởi vì malloc cuối cùng cũng sẽ hoạt động\n

12138
11:46:29,752 --> 11:46:33,752
lấy tại một\nnode cụ thể nào đó trong bộ nhớ.

12139
11:46:34,252 --> 11:46:36,171
Vì vậy chúng ta hãy thực sự thực hiện\nviệc này dưới dạng hình ảnh.

12140
11:46:36,171 --> 11:46:39,171
Khi bạn viết một dòng\ncode, giống như tôi vừa làm ở đây--

12141
11:46:39,171 --> 11:46:43,161
và tôi không khởi tạo nó thành\n

12142
11:46:44,211 --> 11:46:48,201
Nó tồn tại trong bộ nhớ dưới dạng một cái hộp,\n

12143
11:46:48,201 --> 11:46:50,911
Nhưng tôi đã cố tình\ném Oscar vào trong đó.

12144
11:46:54,112 --> 11:46:55,444
LOA 1: Đó là một giá trị rác rưởi.

12145
11:46:55,444 --> 11:46:59,881
Tôi đã được cấp phát\nbiến trong bộ nhớ, được gọi là list.

12146
11:46:59,881 --> 11:47:03,951
Cái nào sẽ cho tôi 64 bit\n

12147
11:47:04,951 --> 11:47:07,701
Nhưng nếu bản thân tôi chưa\nsử dụng toán tử gán

12148
11:47:07,701 --> 11:47:11,311
nó sẽ không trở nên kỳ diệu\n

12149
11:47:11,811 --> 11:47:13,951
Nó thậm chí sẽ không cung cấp cho tôi một nút.

12150
11:47:13,951 --> 11:47:18,631
Đây thực sự sẽ là một\n

12151
11:47:18,631 --> 11:47:20,241
Vậy giải pháp ở đây sẽ là gì?

12152
11:47:20,241 --> 11:47:23,241
Giả sử tôi đang bắt đầu\ntạo danh sách liên kết của mình

12153
11:47:23,241 --> 11:47:24,771
nhưng tôi chưa có nút nào.

12154
11:47:24,771 --> 11:47:28,783
Điều gì sẽ là điều hợp lý\n

12155
11:47:31,319 --> 11:47:32,612
GIỌNG 1: Vậy là vô giá trị, đúng không.

12156
11:47:32,612 --> 11:47:34,342
Khi nghi ngờ về\ncon trỏ, nói chung là

12157
11:47:34,341 --> 11:47:36,091
một điều tốt để\khởi tạo mọi thứ thành null

12158
11:47:36,091 --> 11:47:37,641
vì vậy ít nhất nó không phải là một giá trị rác.

12159
11:47:39,900 --> 11:47:41,692
Nhưng đó là một giá trị\nđặc biệt mà bạn có thể kiểm tra

12160
11:47:41,692 --> 11:47:43,622
for với một điều kiện, hoặc tương tự.

12161
11:47:43,622 --> 11:47:47,602
Vì vậy đây có thể là cách\n tốt hơn để tạo danh sách liên kết

12162
11:47:47,601 --> 11:47:51,601
ngay cả trước khi bạn chèn bất kỳ\nsố nào vào chính sự việc đó.

12163
11:47:52,101 --> 11:47:55,316
Vậy sau đó, chúng ta có thể tiếp tục như thế nào\n

12164
11:47:55,317 --> 11:47:56,692
Vì vậy, bây giờ câu chuyện trông như thế này.

12165
11:47:56,692 --> 11:47:59,632
Oscar đã biến mất vì bên trong\nhộp này toàn là số 0.

12166
11:47:59,631 --> 11:48:03,531
Chỉ vì nó đẹp và sạch sẽ, và\n

12167
11:48:03,531 --> 11:48:08,072
À, nếu tôi muốn cộng số 1\n

12168
11:48:08,072 --> 11:48:10,072
Chà, có lẽ tôi có thể\nbắt đầu với đoạn mã như thế này.

12169
11:48:10,072 --> 11:48:11,781
Mượn cảm hứng từ tuần trước.

12170
11:48:11,781 --> 11:48:16,402
Hãy yêu cầu malloc có đủ\nkhông gian cho kích thước của một nút.

12171
11:48:16,402 --> 11:48:20,542
Và điều này liên quan đến câu hỏi của bạn trước đó,\n

12172
11:48:20,542 --> 11:48:23,842
Tôi không chỉ cần không gian cho int và\n

12173
11:48:24,921 --> 11:48:27,631
Và tôi đã đặt cho thứ đó một cái tên, node.

12174
11:48:27,631 --> 11:48:30,411
Vì vậy, kích thước của nút được tính toán\nand thực hiện phép tính số học cho tôi.

12175
11:48:30,411 --> 11:48:32,871
Và trả lại cho tôi đúng số byte.

12176
11:48:32,872 --> 11:48:36,412
Sau đó, nó lưu trữ địa chỉ\ncủa đoạn bộ nhớ đó

12177
11:48:36,411 --> 11:48:38,361
trong cái mà tôi tạm gọi là n.

12178
11:48:38,362 --> 11:48:40,641
Chỉ để đại diện cho một nút chung mới.

12179
11:48:42,351 --> 11:48:45,561
Bởi vì cũng giống như tuần trước khi tôi\n

12180
11:48:45,561 --> 11:48:47,841
và tôi đã lưu nó trong một con trỏ int*.

12181
11:48:47,841 --> 11:48:50,241
Tuần này, nếu tôi yêu cầu\nbộ nhớ cho một nút

12182
11:48:50,241 --> 11:48:52,822
Tôi đang lưu trữ nó trong một con trỏ nút*.

12183
11:48:52,822 --> 11:48:56,002
Về mặt kỹ thuật, không có gì mới\nngoại trừ thuật ngữ mới này

12184
11:48:56,002 --> 11:48:58,502
nghệ thuật trong cấu trúc dữ liệu được gọi là nút.

12185
11:48:59,002 --> 11:49:00,351
Vậy điều đó có ích gì cho tôi?

12186
11:49:00,351 --> 11:49:03,141
Về cơ bản nó vẽ một\nhình ảnh như thế này trong bộ nhớ.

12187
11:49:03,141 --> 11:49:07,171
Tôi vẫn còn biến danh sách của mình từ\n

12188
11:49:07,671 --> 11:49:09,129
Và đó là lý do tại sao tôi đã vẽ nó trống.

12189
11:49:09,129 --> 11:49:11,541
Bây giờ tôi cũng có một\nbiến tạm thời được gọi là

12190
11:49:11,542 --> 11:49:15,052
n mà tôi khởi tạo thành\ngiá trị trả về của malloc.

12191
11:49:15,052 --> 11:49:17,132
Điều này đã cho tôi một trong những nút này trong bộ nhớ.

12192
11:49:17,131 --> 11:49:19,612
Nhưng tôi cũng đã vẽ nó với\nggiá trị rác

12193
11:49:19,612 --> 11:49:21,332
bởi vì tôi không biết int ở đó là gì.

12194
11:49:21,332 --> 11:49:22,790
Tôi không biết con trỏ ở đó là gì.

12195
11:49:22,790 --> 11:49:27,082
Đó là giá trị rác vì malloc làm như vậy\n

12196
11:49:27,082 --> 11:49:28,732
Có một chức năng khác cho việc đó.

12197
11:49:28,732 --> 11:49:31,582
Nhưng riêng malloc chỉ nói,\nchắc chắn rồi, hãy sử dụng đoạn bộ nhớ này.

12198
11:49:31,582 --> 11:49:33,391
Giải quyết bất cứ điều gì có ở đó.

12199
11:49:33,391 --> 11:49:36,381
Vậy làm cách nào tôi có thể bắt đầu\khởi tạo giá trị này thành các giá trị đã biết?

12200
11:49:36,381 --> 11:49:40,921
Chà, giả sử tôi muốn chèn\n

12201
11:49:40,921 --> 11:49:44,693
Một danh sách có kích thước 1, tôi có thể\nlàm điều gì đó như thế này.

12202
11:49:44,694 --> 11:49:47,402
Và đây là nơi bạn phải\n

12203
11:49:47,402 --> 11:49:51,542
Điều kiện của tôi ở đây là yêu cầu\n

12204
11:49:51,542 --> 11:49:54,692
Tức là, nếu malloc\ngcho tôi bộ nhớ hợp lệ

12205
11:49:54,692 --> 11:49:58,172
và tôi không cần phải bỏ hẳn\n

12206
11:49:58,171 --> 11:50:02,072
Nếu n không bằng null, nhưng\nis bằng địa chỉ hợp lệ

12207
11:50:02,072 --> 11:50:03,552
Tôi sẽ tiếp tục và làm điều này.

12208
11:50:03,552 --> 11:50:06,302
Và đây là cú pháp trông khó hiểu.

12209
11:50:06,302 --> 11:50:09,632
Nhưng có ai muốn đâm không\n

12210
11:50:13,862 --> 11:50:18,002
Bạn có thể giải thích dòng mã\ninner đó đang làm gì? *N.

12211
11:50:27,283 --> 11:50:29,641
Nơi n trỏ tới\nđặt bằng 1.

12212
11:50:29,641 --> 11:50:33,542
Hoặc sử dụng tiếng địa phương của việc đi\nđó, đi đến địa chỉ ở n

12213
11:50:33,542 --> 11:50:35,961
và đặt trường số của nó thành 1.

12214
11:50:35,961 --> 11:50:37,961
Dù bạn muốn nghĩ thế nào đi nữa cũng không sao cả.

12215
11:50:37,961 --> 11:50:40,411
Nhưng * lại là toán tử\ndereference ở đây.

12216
11:50:40,411 --> 11:50:42,211
Và chúng tôi đang thực hiện\ndấu ngoặc đơn mà chúng tôi

12217
11:50:42,211 --> 11:50:45,722
trước đây chưa cần phải làm vì chúng ta\n

12218
11:50:45,722 --> 11:50:47,491
cấu trúc lại với nhau cho đến ngày nay.

12219
11:50:47,491 --> 11:50:49,862
Điều này chỉ có nghĩa là đến đó trước.

12220
11:50:49,862 --> 11:50:52,201
Sau đó, khi bạn\nở đó, hãy truy cập số.

12221
11:50:52,201 --> 11:50:54,311
Bạn không muốn làm việc này trước việc kia.

12222
11:50:54,311 --> 11:50:56,371
Vì vậy đây chỉ là việc thực thi\thứ tự các hoạt động.

12223
11:50:56,372 --> 11:50:58,782
Các dấu ngoặc đơn giống như môn toán cấp lớp.

12224
11:50:59,281 --> 11:51:00,692
Vì vậy, dòng mã này rất khó hiểu.

12225
11:51:01,463 --> 11:51:03,421
Đó không phải là điều mà hầu hết mọi người đều dễ dàng nhớ được.

12226
11:51:03,421 --> 11:51:07,231
Rất may là có cú pháp đó\n

12227
11:51:08,338 --> 11:51:10,171
Và điều này, mặc dù\nit mới đối với bạn hôm nay

12228
11:51:10,171 --> 11:51:12,301
cuối cùng sẽ cảm thấy\na quen thuộc hơn một chút.

12229
11:51:12,302 --> 11:51:15,692
Bởi vì bây giờ đây là ký hiệu\nviết tắt của việc nói, bắt đầu từ n.

12230
11:51:15,692 --> 11:51:17,891
Đến đó bằng cách đi theo mũi tên.

12231
11:51:17,891 --> 11:51:20,012
Và khi bạn đến đó,\nhãy thay đổi trường số.

12232
11:51:22,201 --> 11:51:24,721
Vì vậy hầu hết mọi người sẽ không\nviết mã như thế này.

12233
11:51:25,512 --> 11:51:26,912
Đó là một vài lần nhấn phím bổ sung.

12234
11:51:26,911 --> 11:51:30,781
Cái này trông giống của nghệ sĩ hơn\n

12235
11:51:30,781 --> 11:51:35,012
Và hầu hết mọi người CS sẽ nghĩ về điều gì\n

12236
11:51:37,775 --> 11:51:42,132
Hình ảnh bây giờ, sau khi đặt số thành\n

12237
11:51:42,131 --> 11:51:43,921
Vậy là vẫn còn thiếu một bước.

12238
11:51:43,921 --> 11:51:46,201
Và tất nhiên, đó là\khởi tạo, có vẻ như

12239
11:51:46,201 --> 11:51:50,561
con trỏ trong nút mới này\nvào một cái gì đó được gọi là null.

12240
11:51:50,561 --> 11:51:52,216
Vậy tôi cá là chúng ta có thể làm như thế này.

12241
11:51:52,216 --> 11:51:54,091
Với một dòng\nmã khác, tôi sẽ tiếp tục

12242
11:51:54,091 --> 11:52:00,361
để nói nếu n không bằng null,\n

12243
11:52:00,362 --> 11:52:04,022
Hoặc mô phạm hơn, đi\nto n, đi theo mũi tên

12244
11:52:04,021 --> 11:52:07,921
rồi cập nhật trường tiếp theo\n

12245
11:52:07,921 --> 11:52:10,171
Và một lần nữa, đây chỉ là cách ghi chép sổ sách tốt đẹp.

12246
11:52:10,171 --> 11:52:13,351
Về mặt kỹ thuật,\nchúng ta có thể không cần thiết lập

12247
11:52:13,351 --> 11:52:16,391
cái này thành null nếu chúng ta định giữ\n

12248
11:52:16,391 --> 11:52:19,591
Nhưng tôi đang làm từng bước một nên\n

12249
11:52:19,591 --> 11:52:23,281
Và không có lỗi nào trong\nmã của tôi vào thời điểm này.

12250
11:52:24,752 --> 11:52:27,211
Còn một điều cuối cùng tôi\nsẽ phải làm ở đây.

12251
11:52:27,211 --> 11:52:32,432
Nếu mục tiêu cuối cùng là chèn\n

12252
11:52:32,432 --> 11:52:36,342
bước cuối cùng mà có lẽ tôi nên làm ở đây là gì?

12253
11:52:38,031 --> 11:52:40,741
ĐỐI TƯỢNG: Đặt giá trị con trỏ thành null.

12254
11:52:41,491 --> 11:52:45,451
Bây giờ tôi cần cập nhật\n thực tế

12255
11:52:45,451 --> 11:52:48,511
list, để trỏ đến nút hoàn toàn mới này.

12256
11:52:48,512 --> 11:52:52,798
Bây giờ nó đã được khởi tạo hoàn hảo dưới dạng\n

12257
11:52:52,798 --> 11:52:54,881
Vâng, về mặt kỹ thuật, điều này đã chỉ đến đó rồi.

12258
11:52:54,881 --> 11:52:57,572
Nhưng tôi cố tình mô tả điều này\gần hơn là tạm thời.

12259
11:52:57,572 --> 11:53:02,101
Tôi chỉ cần cái này để lấy lại nó từ\n

12260
11:53:02,101 --> 11:53:04,711
Đây là biến\n\n dài hạn mà tôi quan tâm.

12261
11:53:04,711 --> 11:53:06,961
Vì vậy tôi sẽ muốn làm\nđiều gì đó đơn giản như thế này.

12262
11:53:09,002 --> 11:53:11,345
Và điều này có vẻ hơi lạ\nkhi danh sách đó bằng n.

12263
11:53:11,345 --> 11:53:13,262
Nhưng một lần nữa, hãy nghĩ về\nnhững gì bên trong chiếc hộp này.

12264
11:53:13,262 --> 11:53:15,470
Tại thời điểm này, giá trị này là null\nvì không có liên kết

12265
11:53:15,470 --> 11:53:17,012
danh sách ở đầu câu chuyện của chúng tôi.

12266
11:53:17,012 --> 11:53:21,391
N là địa chỉ bắt đầu và\n

12267
11:53:21,391 --> 11:53:24,781
Vì vậy, lý do là\nnếu bạn đặt danh sách bằng n

12268
11:53:24,781 --> 11:53:27,661
điều đó có tác dụng\nsao chép địa chỉ này lên đây.

12269
11:53:27,661 --> 11:53:30,764
Hoặc thực sự chỉ là sao chép\narrow vào cùng một vị trí

12270
11:53:30,764 --> 11:53:32,432
để bây giờ bức ảnh trông như thế này.

12271
11:53:32,432 --> 11:53:35,822
Và chết tiệt, nếu đây chỉ là tạm thời\n

12272
11:53:35,822 --> 11:53:37,351
Và bây giờ, đây là hình ảnh.

12273
11:53:37,351 --> 11:53:39,512
Vì vậy, chắc chắn là một số\no bước khó chịu

12274
11:53:39,512 --> 11:53:42,002
để đi qua bằng lời nói như thế này.

12275
11:53:42,002 --> 11:53:44,162
Nhưng đó chỉ là malloc để\ng cấp cho mình một nút

12276
11:53:44,161 --> 11:53:49,411
khởi tạo 2 trường bên trong\n

12277
11:53:50,252 --> 11:53:52,391
Tôi không phải sao chép bất cứ điều gì.

12278
11:53:52,391 --> 11:53:55,614
Tôi vừa phải chèn\nthứ gì đó vào trường hợp này.

12279
11:53:55,614 --> 11:53:58,322
Hãy để tôi tạm dừng ở đây để xem có\n

12280
11:53:58,322 --> 11:54:02,271
Và chúng ta sẽ sớm thấy tất cả\n

12281
11:54:02,271 --> 11:54:06,447
ĐỐI TƯỢNG: Vì vậy, nếu\ncâu lệnh [KHÔNG NGHE ĐƯỢC]..

12282
11:54:07,072 --> 11:54:10,491
Tôi đã vẽ chúng một cách riêng biệt\nchỉ vì mục đích lồng tiếng

12283
11:54:10,491 --> 11:54:12,502
làm từng việc một cách rất có phương pháp.

12284
11:54:12,502 --> 11:54:14,572
Trong mã thực, như chúng ta sẽ\nchuyển sang bây giờ

12285
11:54:14,572 --> 11:54:16,701
Tôi đã có thể và lẽ ra\nvừa làm việc đó

12286
11:54:16,701 --> 11:54:20,481
tất cả nằm trong một điều kiện sau\n

12287
11:54:20,482 --> 11:54:22,792
Tôi có thể đặt số thành giá trị như 1.

12288
11:54:22,792 --> 11:54:25,897
Và tôi có thể đặt con trỏ\nitself thành giá trị như null.

12289
11:54:26,512 --> 11:54:30,082
Vậy thì hãy dịch\n đoạn mã này thành một đoạn mã tương tự nào đó

12290
11:54:30,082 --> 11:54:34,822
điều đó cho phép chúng tôi xây dựng một liên kết\n

12291
11:54:35,631 --> 11:54:37,381
Nhưng bây giờ, sử dụng nguyên thủy mới này.

12292
11:54:37,381 --> 11:54:39,621
Vì vậy tôi sẽ\nquay lại Mã VS ở đây.

12293
11:54:39,622 --> 11:54:42,952
Bây giờ tôi sẽ tiếp tục và xóa\n

12294
11:54:44,752 --> 11:54:49,951
Và bây giờ, bên trong chức năng chính của tôi,\n

12295
11:54:49,951 --> 11:54:53,661
Trước tiên tôi sẽ tự cung cấp cho mình một danh sách có kích thước 0.

12296
11:54:53,661 --> 11:54:56,091
Và tôi sẽ gọi danh sách nút* đó.

12297
11:54:56,091 --> 11:54:59,091
Và tôi sẽ khởi tạo nó\n

12298
11:54:59,091 --> 11:55:02,241
Nhưng bây giờ tôi cũng sẽ phải\n

12299
11:55:03,451 --> 11:55:06,981
Vì vậy, hãy nhớ lại rằng tôi có thể làm điều gì đó\nnhư typedef, struct node.

12300
11:55:06,982 --> 11:55:09,802
Bên trong nút cấu trúc này, tôi\nsẽ có một số,

12301
11:55:09,802 --> 11:55:11,492
Tôi sẽ gọi số kiểu int.

12302
11:55:11,491 --> 11:55:13,641
Và tôi sẽ có\na cấu trúc được gọi là nút

12303
11:55:13,641 --> 11:55:16,951
với dấu * cho biết con trỏ\ntiếp theo được gọi tiếp theo.

12304
11:55:16,951 --> 11:55:20,631
Và tôi sẽ gọi toàn bộ\nthứ này một cách ngắn gọn hơn, nút

12305
11:55:22,311 --> 11:55:25,401
Bây giờ là một phần dành riêng cho các bạn\n

12306
11:55:27,082 --> 11:55:29,932
Về mặt kỹ thuật, tôi có thể\nlàm điều gì đó như thế này.

12307
11:55:29,932 --> 11:55:33,442
Không sử dụng typedef và không chỉ sử dụng nút từ.

12308
11:55:33,442 --> 11:55:37,162
Cú pháp này ở đây thực ra\ntạo cho tôi một dữ liệu mới

12309
11:55:37,161 --> 11:55:40,311
gõ gọi, bằng lời nói, nút cấu trúc.

12310
11:55:40,311 --> 11:55:42,921
Và tôi có thể sử dụng điều này xuyên suốt\nmã của tôi nói về nút struct.

12311
11:55:43,942 --> 11:55:45,322
Điều đó chỉ gây ra một chút tẻ nhạt.

12312
11:55:45,322 --> 11:55:48,197
Và sẽ tốt hơn nếu chỉ giới thiệu\n

12313
11:55:49,232 --> 11:55:51,712
Vậy điều mà typedef\nđã và đang làm cho chúng ta là

12314
11:55:51,711 --> 11:55:55,252
một lần nữa, chúng ta hãy sáng tạo ra\ntừ của riêng mình thậm chí còn ngắn gọn hơn.

12315
11:55:55,252 --> 11:55:58,521
Và điều này chỉ có tác dụng\ngọi toàn bộ điều này

12316
11:55:58,521 --> 11:56:02,241
nút mà không cần, sau đó, tới\n

12317
11:56:04,161 --> 11:56:07,531
Vì vậy bây giờ thứ này tồn tại trong\n

12318
11:56:10,252 --> 11:56:12,921
Và để làm điều này, tôi sẽ tự cung cấp cho mình một biến tạm thời.

12319
11:56:12,921 --> 11:56:14,822
Tôi sẽ gọi nó là n vì sự nhất quán.

12320
11:56:14,822 --> 11:56:18,021
Tôi sẽ sử dụng malloc để tự đặt cho mình kích thước của một nút

12321
11:56:19,561 --> 11:56:21,021
Sau đó, tôi sẽ\nkiểm tra an toàn một chút.

12322
11:56:21,021 --> 11:56:23,951
Nếu n bằng null thì tôi sẽ đi\n

12323
11:56:23,951 --> 11:56:25,701
Tôi sắp thoát\n ra khỏi chương trình này

12324
11:56:25,701 --> 11:56:28,441
bởi vì không có gì hữu ích\nđể làm vào thời điểm này.

12325
11:56:28,442 --> 11:56:31,052
Nhưng rất có thể máy tính của tôi\nsẽ không hết bộ nhớ.

12326
11:56:31,052 --> 11:56:34,232
Vì vậy tôi giả định rằng chúng ta có thể giữ\n

12327
11:56:34,232 --> 11:56:38,872
Nếu n không bằng null, và điều đó\n

12328
11:56:40,851 --> 11:56:42,411
Tôi sẽ xây dựng điều này ngược lại.

12329
11:56:44,188 --> 11:56:45,771
Không sao, chúng ta hãy tiếp tục và làm điều này.

12330
11:56:48,082 --> 11:56:52,972
Và sau đó n [mũi tên tiếp theo] bằng null.

12331
11:56:52,972 --> 11:56:59,902
Và bây giờ, cập nhật danh sách để trỏ\nđến nút mới, danh sách bằng n.

12332
11:56:59,902 --> 11:57:02,062
Vì vậy tại thời điểm này trong\ncâu chuyện, về cơ bản chúng ta đã

12333
11:57:02,061 --> 11:57:06,811
đã tạo ra bức ảnh\nđầu tiên trông như thế này.

12334
11:57:06,811 --> 11:57:11,362
Đây là mã tương ứng thông qua\n

12335
11:57:11,362 --> 11:57:14,342
Giả sử bây giờ chúng ta muốn thêm\nsố 2 vào danh sách.

12336
11:57:21,391 --> 11:57:23,811
Chà, tôi không cần\nkhai báo lại vì tôi có thể sử dụng

12337
11:57:23,811 --> 11:57:25,591
các biến tạm thời tương tự trước đó.

12338
11:57:25,591 --> 11:57:30,791
Vì vậy lần này tôi chỉ định nói n\n

12339
11:57:30,792 --> 11:57:32,542
Một lần nữa, tôi sẽ kiểm tra độ an toàn của mình.

12340
11:57:32,542 --> 11:57:36,772
Vậy nếu n bằng null thì hãy\n

12341
11:57:36,771 --> 11:57:41,301
Nhưng bây giờ tôi phải cẩn thận hơn một chút.

12342
11:57:41,302 --> 11:57:43,641
Về mặt kỹ thuật,\ntôi vẫn cần những gì

12343
11:57:43,641 --> 11:57:48,021
phải làm gì trước khi thoát khỏi\nchương trình của mình để thực sự phù hợp?

12344
11:57:48,021 --> 11:57:51,361
Giải phóng bộ nhớ\đã thành công ở mức cao hơn một chút.

12345
11:57:51,362 --> 11:57:56,762
Vì vậy tôi nghĩ chỉ cần giải phóng những gì\n là đủ

12346
11:57:57,262 --> 11:58:03,742
Tuy nhiên, bây giờ, nếu mọi việc đều ổn, hãy\n

12347
11:58:03,741 --> 11:58:09,322
Và bây giờ, n [mũi tên tiếp theo] bằng null.

12348
11:58:09,322 --> 11:58:12,381
Và bây giờ, hãy tiếp tục\nvà thêm nó vào danh sách.

12349
11:58:12,381 --> 11:58:20,391
Nếu tôi tiếp tục và\nliệt kê mũi tên tiếp theo bằng n

12350
11:58:20,391 --> 11:58:24,141
Tôi nghĩ những gì chúng ta vừa làm bây giờ\nlà xây dựng cái tương đương

12351
11:58:24,141 --> 11:58:27,141
này trong bộ nhớ của máy tính.

12352
11:58:27,141 --> 11:58:29,661
Bằng cách đi tới trường tiếp theo của danh sách\ntrường này

12353
11:58:29,661 --> 11:58:33,561
đồng nghĩa với nút 1\n, hộp dưới cùng.

12354
11:58:33,561 --> 11:58:37,021
Và lưu trữ địa chỉ của n,\n

12355
11:58:37,021 --> 11:58:39,871
Và tôi đang vứt đi, trong\n

12356
11:58:42,362 --> 11:58:47,569
Hãy để tôi xuống đây và nói, thêm\n

12357
11:58:49,822 --> 11:58:52,762
Và rõ ràng, trong một chương trình thực tế, chúng ta\n

12358
11:58:52,762 --> 11:58:56,542
Và thực hiện việc này một cách linh hoạt hoặc một chức năng\n

12359
11:58:56,542 --> 11:58:59,601
Nhưng chỉ cần xem qua\nscú pháp ở đây là được.

12360
11:58:59,601 --> 11:59:03,182
Nếu n bằng null, vì lý do nào đó, hết\nbộ nhớ.

12361
11:59:03,182 --> 11:59:09,131
Hãy trả về 1, nhưng chúng ta\nnên giải phóng danh sách đó

12362
11:59:09,131 --> 11:59:12,932
và thậm chí cả nút thứ hai, danh sách [tiếp theo].

12363
11:59:12,932 --> 11:59:16,211
Nhưng tôi đã cố tình làm điều này một cách tồi tệ.

12364
11:59:16,711 --> 11:59:18,722
Bây giờ điều này tinh tế hơn một chút.

12365
11:59:18,722 --> 11:59:22,052
Và hãy để tôi loại bỏ phần đánh dấu\n

12366
11:59:22,052 --> 11:59:26,372
Nếu n bằng\nnull, và điều gì đó thực sự đúng

12367
11:59:26,372 --> 11:59:32,522
đã xảy ra lỗi, chúng đã hết bộ nhớ,\n

12368
11:59:32,521 --> 11:59:35,252
Và một lần nữa, không phải là tôi\ngiải phóng các biến đó.

12369
11:59:35,252 --> 11:59:39,101
Tôi đang giải phóng các địa chỉ\nat trong các biến đó.

12370
11:59:39,101 --> 11:59:41,371
Nhưng ở đây cũng có\nlỗi với mã của tôi.

12371
11:59:45,061 --> 11:59:49,165
Dòng này đây, 43,\nsự giải phóng đó cụ thể là gì?

12372
11:59:49,832 --> 11:59:52,382
ĐỐI TƯỢNG: Bạn đang giải phóng danh sách 2 lần.

12373
11:59:52,381 --> 11:59:54,121
GIỌNG 1: Tôi đang giải phóng, không phải vậy.

12374
11:59:54,631 --> 11:59:56,221
Tôi không giải phóng danh sách 2 lần.

12375
11:59:56,222 --> 11:59:59,012
Về mặt kỹ thuật, tôi sẽ giải phóng\ndanh sách một lần và liệt kê lần tiếp theo.

12376
11:59:59,012 --> 12:00:01,082
Nhưng hãy để tôi hỏi câu hỏi\nrõ ràng hơn.

12377
12:00:01,082 --> 12:00:03,902
Hiện tại tôi đang giải phóng những gì với\ndòng 43?

12378
12:00:08,911 --> 12:00:10,921
Bởi vì nếu 1 ở đầu danh sách

12379
12:00:10,921 --> 12:00:14,011
danh sách chứa địa chỉ\ncủa nút số 1 đó.

12380
12:00:14,012 --> 12:00:15,762
Và vì vậy điều này giải phóng nút đó.

12381
12:00:15,762 --> 12:00:18,732
Dòng mã này,\nbạn có thể suy nghĩ bằng trực giác, OK

12382
12:00:18,732 --> 12:00:21,092
có lẽ nó đang giải phóng nút số 2.

12383
12:00:22,891 --> 12:00:24,601
Valgrind có thể giúp bạn nắm bắt điều này.

12384
12:00:24,601 --> 12:00:27,002
Nhưng bằng cách nhìn vào nó, nó\nkhông nhất thiết phải rõ ràng.

12385
12:00:27,002 --> 12:00:31,472
Bạn không bao giờ nên chạm vào ký ức\nmà bạn đã giải phóng.

12386
12:00:31,472 --> 12:00:34,412
Và vì vậy, việc tôi làm theo lệnh này là rất tệ.

12387
12:00:34,411 --> 12:00:37,111
Bởi vì tôi đang nói với hệ điều hành nên tôi không biết.

12388
12:00:37,112 --> 12:00:39,631
Tôi không cần địa chỉ danh sách nữa.

12389
12:00:40,891 --> 12:00:43,141
Và sau đó, theo đúng nghĩa đen là một dòng sau,\n

12390
12:00:43,141 --> 12:00:45,211
Hãy để tôi đến\nđịa chỉ đó một lát

12391
12:00:45,211 --> 12:00:47,881
và nhìn vào trường\n tiếp theo của nút đầu tiên đó.

12392
12:00:48,701 --> 12:00:51,191
Bạn đã từ bỏ\nquyền kiểm soát nút.

12393
12:00:51,192 --> 12:00:54,211
Vì vậy, về mặt logic, đây là một cách khắc phục dễ dàng\ntrong trường hợp này.

12394
12:00:54,211 --> 12:00:56,851
Nhưng trước tiên chúng ta nên giải phóng\nnút thứ hai

12395
12:00:56,851 --> 12:01:00,542
và sau đó là cái đầu tiên\nđể chúng tôi thực hiện việc đó

12396
12:01:00,542 --> 12:01:02,522
về cơ bản là theo thứ tự ngược lại.

12397
12:01:02,521 --> 12:01:04,438
Và một lần nữa, Valgrind sẽ\ngiúp bạn nắm bắt được điều đó.

12398
12:01:04,438 --> 12:01:07,063
Nhưng đó chính là điều người ta\ncần phải cẩn thận khi

12399
12:01:08,082 --> 12:01:10,592
Bạn không thể chạm vào bộ nhớ\sau khi bạn giải phóng nó.

12400
12:01:12,451 --> 12:01:17,971
Để tôi tiếp tục cập nhật\ntrường số của n thành 3.

12401
12:01:17,972 --> 12:01:20,982
Nút tiếp theo của n là null.

12402
12:01:20,982 --> 12:01:22,772
Và sau đó, giống như\ntrang trình bày trước đó

12403
12:01:22,771 --> 12:01:28,502
Tôi nghĩ tôi có thể làm list\nnext, next bằng n.

12404
12:01:28,502 --> 12:01:32,372
Và điều đó bây giờ có tác dụng\n

12405
12:01:32,372 --> 12:01:34,472
về cơ bản, cấu trúc dữ liệu này.

12406
12:01:36,302 --> 12:01:38,342
Giống như, trong một thế giới tốt đẹp hơn, chúng ta\ncó một vòng lặp và một số hàm

12407
12:01:38,341 --> 12:01:39,901
đang tự động hóa quá trình này.

12408
12:01:39,902 --> 12:01:44,162
Tuy nhiên, hiện tại, chúng tôi chỉ đang làm điều đó\n

12409
12:01:44,161 --> 12:01:48,901
Vì vậy, tại thời điểm này, thật không may,\n

12410
12:01:48,902 --> 12:01:53,671
Nó không còn dễ dàng như int\ni bằng 0, i nhỏ hơn 3, i .

12411
12:01:53,671 --> 12:02:00,902
Bởi vì bạn không thể\nlàm điều gì đó như thế này.

12412
12:02:00,902 --> 12:02:06,002
Bởi vì số học con trỏ\nkhông còn có tác dụng nữa

12413
12:02:06,002 --> 12:02:10,232
khi chính bạn là người đang khâu vá\n

12414
12:02:10,232 --> 12:02:12,932
Trong tất cả các ví dụ trước đây của chúng tôi\nvới mảng, bạn đã

12415
12:02:12,932 --> 12:02:16,302
đã tin tưởng rằng tất cả byte trong\n

12416
12:02:16,302 --> 12:02:19,015
Vì vậy nó hoàn toàn hợp lý cho\ntrình biên dịch và máy tính

12417
12:02:19,014 --> 12:02:21,932
chỉ để tìm ra, ồ, nếu bạn\n

12418
12:02:21,932 --> 12:02:23,612
[1], đã hết một địa điểm.

12419
12:02:23,612 --> 12:02:25,592
[2], đã hết một địa điểm.

12420
12:02:25,591 --> 12:02:28,511
Bây giờ điều này ít rõ ràng hơn.

12421
12:02:28,512 --> 12:02:32,132
Bởi vì mặc dù bạn có thể muốn\n

12422
12:02:32,131 --> 12:02:36,752
danh sách, hoặc thứ hai, hoặc thứ ba, bạn\n

12423
12:02:38,072 --> 12:02:41,521
Thay vào đó, bạn phải\nđi theo tất cả các mũi tên đó.

12424
12:02:41,521 --> 12:02:44,822
Vì vậy với danh sách liên kết, bạn không thể sử dụng\n

12425
12:02:44,822 --> 12:02:47,792
bởi vì một nút có thể ở đây,\nover ở đây, ở đây, ở đây.

12426
12:02:47,792 --> 12:02:51,031
Bạn không thể chỉ sử dụng một số bù đắp đơn giản.

12427
12:02:51,031 --> 12:02:53,822
Vì vậy, tôi nghĩ mã của chúng ta\nsẽ phải phức tạp hơn một chút.

12428
12:02:53,822 --> 12:02:57,302
Và điều này ban đầu có vẻ đáng sợ\nnhưng đây chỉ là một ứng dụng

12429
12:02:57,302 --> 12:02:59,641
của một số định nghĩa cơ bản ở đây.

12430
12:02:59,641 --> 12:03:06,961
Hãy để tôi thực hiện một vòng lặp for\n

12431
12:03:08,612 --> 12:03:13,262
Tôi sẽ tiếp tục làm việc này, vì vậy\n

12432
12:03:13,262 --> 12:03:15,842
Và trên mỗi lần lặp\ncủa vòng lặp này, tôi sẽ

12433
12:03:15,841 --> 12:03:20,581
để cập nhật TMP thành\nbất kỳ mũi tên TMP nào tiếp theo.

12434
12:03:20,582 --> 12:03:23,192
Và tôi sẽ nhắc bạn sau\nvà giải thích chi tiết hơn.

12435
12:03:23,192 --> 12:03:27,211
Nhưng khi tôi in thứ gì đó ở đây\nbằng printf, tôi vẫn có thể sử dụng %i.

12436
12:03:27,211 --> 12:03:29,521
Bởi vì cuối cùng nó vẫn là một con số\n.

12437
12:03:29,521 --> 12:03:34,121
Nhưng cái tôi muốn in ra là\n

12438
12:03:34,122 --> 12:03:36,514
Vì vậy, có lẽ đây là vòng lặp\nfor-xấu nhất mà chúng tôi từng thấy.

12439
12:03:36,514 --> 12:03:38,972
Bởi vì nó là sự pha trộn, không chỉ\ný tưởng về vòng lặp for, mà

12440
12:03:38,972 --> 12:03:40,982
bản thân nó đã hơi khó hiểu vài tuần trước.

12441
12:03:40,982 --> 12:03:43,507
Nhưng bây giờ, tôi đang sử dụng con trỏ\thay vì số nguyên.

12442
12:03:43,506 --> 12:03:45,631
Nhưng tôi không vi phạm\nđịnh nghĩa của vòng lặp for.

12443
12:03:45,631 --> 12:03:48,421
Hãy nhớ lại rằng vòng lặp for có 3\nthứ chính trong ngoặc đơn.

12444
12:03:48,421 --> 12:03:50,281
Bạn muốn khởi tạo cái gì đầu tiên?

12445
12:03:50,281 --> 12:03:53,222
Bạn muốn\ntiếp tục kiểm tra lại điều kiện nào?

12446
12:03:53,222 --> 12:03:56,921
Và bạn muốn thực hiện cập nhật gì\n

12447
12:03:56,921 --> 12:03:59,341
Vì vậy, với định nghĩa\ncơ bản đó, đây

12448
12:03:59,341 --> 12:04:01,831
đang cung cấp cho tôi một biến\ntạm thời có tên là TMP

12449
12:04:01,832 --> 12:04:04,002
được khởi tạo ở\nphần đầu của vòng lặp.

12450
12:04:04,002 --> 12:04:07,591
Vì vậy, nó giống như việc tôi\nchỉ tay vào nút số 1.

12451
12:04:07,591 --> 12:04:11,011
Sau đó, tôi đặt câu hỏi,\nTMP không bằng null phải không?

12452
12:04:11,012 --> 12:04:13,652
Ồ, hy vọng là không phải vì\ntôi đang trỏ vào một nút hợp lệ

12453
12:04:15,192 --> 12:04:17,012
Vì vậy, tất nhiên, nó\nchưa bằng null.

12454
12:04:17,012 --> 12:04:19,512
Sẽ không có giá trị rỗng cho đến khi chúng ta đến\ncuối danh sách.

12455
12:04:21,012 --> 12:04:22,742
Tôi đã bắt đầu biến TMP này.

12456
12:04:22,741 --> 12:04:27,752
Tôi đi theo mũi tên và đi tới\ntrường số họ đang ở.

12457
12:04:28,832 --> 12:04:32,492
Vòng lặp for nói,\nthay đổi TMP thành bất cứ thứ gì

12458
12:04:32,491 --> 12:04:36,572
đang ở TMP, bằng cách đi theo mũi tên\nvà lấy trường tiếp theo.

12459
12:04:36,572 --> 12:04:39,741
Vậy thì điều đó có kết quả là\n

12460
12:04:39,741 --> 12:04:42,241
Không, tất nhiên là nó không bằng\nnull vì nút thứ hai

12461
12:04:43,531 --> 12:04:45,402
Null vẫn ở cuối.

12462
12:04:45,402 --> 12:04:47,192
Thế là tôi in ra số 2.

12463
12:04:47,192 --> 12:04:51,152
Bước tiếp theo, tôi cập nhật TMP một lần nữa\nlần nữa.

12464
12:04:51,152 --> 12:04:53,711
Vậy thì điều đó chưa bằng null.

12465
12:04:53,711 --> 12:04:55,951
Vì vậy tôi tiếp tục và in ra nút số 3.

12466
12:04:55,951 --> 12:05:01,601
Rồi lần cuối cùng, tôi cập nhật TMP lên\n

12467
12:05:01,601 --> 12:05:05,461
Nhưng sau 1, 2, 3, trường\ncuối cùng tiếp theo đó là rỗng.

12468
12:05:05,461 --> 12:05:09,271
Và vì thế, tôi hoàn toàn thoát khỏi\nvòng lặp for này.

12469
12:05:09,271 --> 12:05:12,211
Vì vậy, nếu tôi thực hiện việc này dưới dạng\nhình ảnh, tất cả chúng ta đều

12470
12:05:12,211 --> 12:05:15,781
đang làm, nếu bây giờ tôi sử dụng ngón tay của mình\nđể biểu thị biến TMP.

12471
12:05:15,781 --> 12:05:19,561
Tôi khởi tạo TMP thành bất cứ thứ gì\nlist, vì vậy nó trỏ vào đây.

12472
12:05:19,561 --> 12:05:22,261
Rõ ràng đó không phải là null\nnên tôi in ra bất cứ thứ gì

12473
12:05:22,262 --> 12:05:26,582
đó có phải là TMP không, hãy làm theo số mũi tên\nin và tôi in nó ra.

12474
12:05:26,582 --> 12:05:28,772
Sau đó tôi cập nhật TMP để trỏ vào đây.

12475
12:05:28,771 --> 12:05:30,558
Sau đó tôi cập nhật TMP để trỏ vào đây.

12476
12:05:30,559 --> 12:05:31,891
Sau đó tôi cập nhật TMP để trỏ vào đây.

12477
12:05:34,961 --> 12:05:39,152
Vì vậy, một lần nữa, phải thừa nhận là khó hiểu hơn nhiều\n

12478
12:05:40,091 --> 12:05:46,336
Nhưng đó chỉ là một cách sử dụng khác của cú pháp vòng lặp for.

12479
12:05:46,836 --> 12:05:50,622
ĐỐI TƯỢNG: Làm sao chuyện đó lại xảy ra\n

12480
12:05:50,622 --> 12:05:52,500
Bởi vì đối với tôi có vẻ như nó đề cập đến-

12481
12:05:53,542 --> 12:05:56,542
Làm thế nào mà tôi thực sự đang in\n

12482
12:05:57,921 --> 12:05:59,601
Trình biên dịch đang giúp tôi ở đây.

12483
12:05:59,601 --> 12:06:02,211
Bởi vì tôi đã dạy nó ngay từ đầu chương trình của mình

12484
12:06:05,211 --> 12:06:08,991
Trình biên dịch biết rằng một nút có\n

12485
12:06:10,911 --> 12:06:16,891
Bởi vì tôi đang lặp lại bằng nút*\n

12486
12:06:16,891 --> 12:06:19,641
trình biên dịch biết rằng bất cứ lúc nào tôi đang trỏ vào thứ gì đó

12487
12:06:19,641 --> 12:06:21,421
Tôi đang chỉ vào toàn bộ nút.

12488
12:06:21,421 --> 12:06:24,502
Không quan trọng cụ thể là ở đâu trong\n

12489
12:06:24,502 --> 12:06:26,692
Cuối cùng, nó trỏ\na vào toàn bộ nút.

12490
12:06:26,692 --> 12:06:30,802
Và thực tế là tôi sử dụng số mũi tên\nTMP có nghĩa là OK

12491
12:06:30,802 --> 12:06:31,972
điều chỉnh ngón tay của bạn một chút.

12492
12:06:31,972 --> 12:06:35,991
Vì vậy, theo đúng nghĩa đen, bạn đang chỉ vào\n

12493
12:06:35,991 --> 12:06:40,402
Vậy là đủ thông tin cho\n

12494
12:06:41,042 --> 12:06:44,211
Các câu hỏi khác sau đó\không phải cách tiếp cận này tại đây.

12495
12:06:46,762 --> 12:06:51,322
LOA 1: Làm cách nào để sử dụng vòng lặp for\n

12496
12:06:51,322 --> 12:06:56,122
Bạn sẽ làm điều gì đó như thế này,\nnếu tôi có thể, trong tập vấn đề 5.

12497
12:06:56,122 --> 12:06:59,211
Chúng tôi sẽ cung cấp cho bạn một số\nnền tảng để thực hiện việc này.

12498
12:06:59,211 --> 12:07:02,182
Tuy nhiên, trong các tài liệu của tuần tới\nchúng tôi sẽ hướng dẫn bạn điều đó.

12499
12:07:02,182 --> 12:07:04,775
Nhưng hãy để tôi không làm hỏng nó.

12500
12:07:06,192 --> 12:07:08,559
ĐỐI TƯỢNG: Vậy nên tôi có\ncâu hỏi về dòng 49.

12501
12:07:09,141 --> 12:07:11,159
ĐỐI TƯỢNG: Dòng 49\ncó thể ở dòng 43 không?

12502
12:07:12,201 --> 12:07:15,381
Dòng 49 có được chấp nhận không, ngay cả\nnếu chúng tôi đã giải phóng nó sớm hơn.

12503
12:07:15,381 --> 12:07:18,081
Chúng tôi đã không giải phóng nó ở dòng\n43, trong trường hợp này, đúng vậy.

12504
12:07:18,082 --> 12:07:22,281
Bạn chỉ có thể đến dòng 49,\nnếu n không bằng null.

12505
12:07:22,281 --> 12:07:24,472
Và bạn không quay lại dòng 45.

12506
12:07:25,341 --> 12:07:29,661
Tôi chỉ thực hiện việc giải phóng đó, nếu tôi\n

12507
12:07:32,512 --> 12:07:33,887
KHÁN GIẢ: Tôi có một câu hỏi nhanh.

12508
12:07:36,862 --> 12:07:40,131
GIỌNG 1: Đúng Bạn đang hỏi\n

12509
12:07:40,131 --> 12:07:41,839
điều đó có nghĩa là bạn\nkhông cần phải giải phóng nó phải không?

12510
12:07:41,839 --> 12:07:44,241
Bạn không bao giờ phải giải phóng con trỏ.

12511
12:07:44,241 --> 12:07:49,042
Bạn chỉ nên giải phóng các địa chỉ\n

12512
12:07:49,042 --> 12:07:51,412
Vì vậy, công bằng mà nói thì tôi vẫn chưa hoàn thành\nchương trình.

12513
12:07:51,411 --> 12:07:53,361
Nhưng bạn không giải phóng các biến.

12514
12:07:53,362 --> 12:07:55,222
Bạn không giải phóng như các lĩnh vực.

12515
12:07:55,222 --> 12:07:58,351
Bạn đang giải phóng các địa chỉ\n cụ thể, bất kể chúng có thể là gì.

12516
12:07:58,351 --> 12:08:01,252
Vậy điều cuối cùng, và tôi\nđang trì hoãn việc hiển thị cái này

12517
12:08:01,252 --> 12:08:02,932
bởi vì nó cũng hơi khó hiểu.

12518
12:08:02,932 --> 12:08:06,052
Đây là cách bạn có thể giải phóng,\nhiện tại, toàn bộ danh sách được liên kết.

12519
12:08:06,052 --> 12:08:08,724
Trong thế giới của mảng,\nhãy nhớ lại, điều đó thật dễ dàng.

12520
12:08:09,682 --> 12:08:11,402
Bạn trả về 0 và bạn đã hoàn tất.

12521
12:08:12,622 --> 12:08:14,482
Bởi vì, một lần nữa,\nmáy tính không biết

12522
12:08:14,482 --> 12:08:17,182
những gì bạn đã ghép lại với nhau\nsử dụng tất cả các con trỏ này

12523
12:08:17,182 --> 12:08:18,622
khắp bộ nhớ của máy tính.

12524
12:08:18,622 --> 12:08:20,662
Bạn cần phải đi theo những mũi tên đó.

12525
12:08:20,661 --> 12:08:23,401
Vì vậy, một cách để làm điều này\nsẽ như sau.

12526
12:08:23,402 --> 12:08:28,402
Mặc dù bản thân danh sách không rỗng,\n

12527
12:08:29,722 --> 12:08:32,454
Tôi sẽ tự tạo cho mình một\nbiến tạm thời có tên là TMP.

12528
12:08:32,453 --> 12:08:34,911
Và đó là một TMP khác vì\nit ở một phạm vi khác.

12529
12:08:34,911 --> 12:08:38,691
Thay vào đó, nó nằm trong vòng lặp while\n

12530
12:08:38,692 --> 12:08:44,122
Tôi sẽ khởi tạo TMP thành\nlà địa chỉ của nút tiếp theo.

12531
12:08:44,122 --> 12:08:46,641
Chỉ để tôi có thể đi trước một\nmột bước.

12532
12:08:47,932 --> 12:08:51,811
Bởi vì bây giờ, tôi có thể mạnh dạn\ngiải phóng chính danh sách đó

12533
12:08:51,811 --> 12:08:53,451
điều đó không có nghĩa là toàn bộ danh sách.

12534
12:08:53,451 --> 12:08:56,151
Một lần nữa, tôi đang giải phóng địa chỉ\n trong danh sách,

12535
12:08:56,152 --> 12:08:58,891
là địa chỉ của nút số 1.

12536
12:08:59,872 --> 12:09:02,461
Đó chỉ là địa chỉ\ncủa nút số 1.

12537
12:09:02,461 --> 12:09:05,362
Vì vậy nếu lần đầu tiên tôi sử dụng TMP\nđể chỉ ra số

12538
12:09:05,362 --> 12:09:10,792
2 hơi ở giữa ảnh,\n

12539
12:09:10,792 --> 12:09:12,772
vào lúc này, vào danh sách miễn phí.

12540
12:09:12,771 --> 12:09:15,351
Đó là địa chỉ của nút đầu tiên.

12541
12:09:15,351 --> 12:09:19,641
Bây giờ tôi sẽ nói, được rồi, một lần\n

12542
12:09:19,641 --> 12:09:24,561
Tôi có thể cập nhật danh sách\nitself theo nghĩa đen là TMP.

12543
12:09:27,932 --> 12:09:33,622
Nếu bạn nghĩ về bức ảnh này, TMP\n

12544
12:09:35,031 --> 12:09:38,421
Vậy TMP, được đại diện bởi tay phải của tôi\n

12545
12:09:38,421 --> 12:09:43,011
Hoàn toàn an toàn và hợp lý để\ngiải phóng ngay danh sách đó hay còn gọi là.

12546
12:09:43,012 --> 12:09:44,632
địa chỉ của nút số 1.

12547
12:09:44,631 --> 12:09:47,362
Điều đó có tác dụng\nvứt bỏ nút số 1

12548
12:09:47,362 --> 12:09:50,152
báo cho máy tính biết bạn có thể\ntái sử dụng bộ nhớ đó cho mình.

12549
12:09:50,152 --> 12:09:53,632
Dòng mã cuối cùng tôi viết\n

12550
12:09:53,631 --> 12:09:58,042
2, tại thời điểm đó vòng lặp của tôi tiếp tục\n

12551
12:09:58,042 --> 12:10:01,072
Và chỉ một lần ngón tay của tôi\nchỉ vào hư không theo đúng nghĩa đen

12552
12:10:01,072 --> 12:10:03,832
biểu tượng null, về bản chất,\nsẽ lặp lại trong một khoảng thời gian

12553
12:10:03,832 --> 12:10:06,472
lặp lại khi tôi chuyển trở lại, thoát ra.

12554
12:10:06,472 --> 12:10:09,112
Và không còn gì để được giải thoát nữa.

12555
12:10:09,112 --> 12:10:12,171
Vậy một lần nữa, những gì bạn sẽ thấy,\cuối cùng, trong tập bài tập 5

12556
12:10:12,171 --> 12:10:16,171
nói thêm về điều đó sau, đây là một cơ hội\n

12557
12:10:17,211 --> 12:10:20,061
Nhưng một lần nữa, mặc dù phải thừa nhận rằng cú pháp khá khó hiểu

12558
12:10:20,061 --> 12:10:23,781
chúng tôi vẫn đang sử dụng những điều cơ bản như\ncác vòng lặp for hoặc vòng lặp while này.

12559
12:10:23,781 --> 12:10:27,442
Bây giờ chúng tôi chỉ mới bắt đầu\ntheo dõi các địa chỉ rõ ràng

12560
12:10:27,442 --> 12:10:31,222
hơn là để máy tính làm tất cả các phép tính cho chúng ta

12561
12:10:31,222 --> 12:10:33,116
như trước đây chúng tôi đã được hưởng lợi.

12562
12:10:33,116 --> 12:10:36,241
Vào cuối chuyện này, tôi\n

12563
12:10:36,241 --> 12:10:39,722
Và tôi nghĩ chúng ta đã sẵn sàng để đi.

12564
12:10:40,222 --> 12:10:43,442
Bây giờ bạn có câu hỏi về mã danh sách liên kết này?

12565
12:10:43,442 --> 12:10:46,192
Và một lần nữa, chúng ta sẽ giải quyết vấn đề này\n

12566
12:10:46,692 --> 12:10:51,095
KHÁN GIẢ: Bạn có thể giải thích lúc đó\n

12567
12:10:51,762 --> 12:10:55,432
Chúng tôi có thể giải thích vòng lặp while\nhere này để giải phóng danh sách không.

12568
12:10:55,432 --> 12:10:58,061
Vì vậy, hãy lưu ý rằng, trước tiên, tôi chỉ đặt ra câu hỏi hiển nhiên.

12569
12:10:58,902 --> 12:11:02,872
Bởi vì nếu vậy thì\nkhông có việc gì phải làm.

12570
12:11:02,872 --> 12:11:06,942
Tuy nhiên, trong khi danh sách không phải là\nnull, theo dòng 58

12571
12:11:08,021 --> 12:11:12,401
Tôi muốn tạo một biến tạm thời\n

12572
12:11:12,402 --> 12:11:15,022
mũi tên danh sách tiếp theo đang trỏ vào.

12573
12:11:17,741 --> 12:11:21,171
Mũi tên danh sách tiếp theo là bất cứ thứ gì\nthứ này ở đây.

12574
12:11:21,171 --> 12:11:23,951
Vì vậy, nếu tay phải của tôi đại diện\nbiến tạm thời

12575
12:11:23,951 --> 12:11:27,951
Theo nghĩa đen, tôi đang chỉ vào thứ\ngiống như chính danh sách đó.

12576
12:11:27,951 --> 12:11:31,121
Dòng mã tiếp theo,\nrecall, đã giải phóng danh sách.

12577
12:11:31,122 --> 12:11:33,882
Và không giống như trong thế giới\nars của chúng ta, khoảng nửa giờ

12578
12:11:33,881 --> 12:11:36,581
trước đây, nơi mà điều đó chỉ có nghĩa\ngiải phóng toàn bộ danh sách chết tiệt

12579
12:11:36,582 --> 12:11:41,171
bây giờ bạn đã nắm quyền kiểm soát\n

12580
12:11:41,171 --> 12:11:43,031
theo những cách mà bạn không làm với mảng.

12581
12:11:43,031 --> 12:11:46,332
Máy tính biết cách giải phóng\ntoàn bộ mảng vì bạn

12582
12:11:46,332 --> 12:11:48,162
malloc toàn bộ cùng một lúc.

12583
12:11:48,161 --> 12:11:52,061
Bây giờ bạn đang sắp xếp từng nút trong danh sách\nliên kết.

12584
12:11:52,061 --> 12:11:54,911
Và hệ điều hành\nkhông theo dõi giúp bạn

12585
12:11:56,292 --> 12:11:59,952
Vì vậy, khi bạn giải phóng danh sách,\nbạn thực sự đang giải phóng

12586
12:11:59,951 --> 12:12:03,911
giá trị của biến danh sách,\n

12587
12:12:03,911 --> 12:12:07,301
Sau đó, dòng mã cuối cùng của tôi, tôi sẽ\n

12588
12:12:07,302 --> 12:12:11,982
list bây giờ bỏ qua\nbộ nhớ trống và trỏ vào 2.

12589
12:12:14,561 --> 12:12:17,981
Vì vậy, một lần nữa, đó chỉ là một\ncách sử dụng mang tính mô phạm

12590
12:12:17,982 --> 12:12:21,942
cú pháp mới này của ký hiệu ngôi sao,\n

12591
12:12:21,942 --> 12:12:25,902
để thực hiện tương đương với việc đi\nxuống tất cả các mũi tên này.

12592
12:12:25,902 --> 12:12:28,122
Theo sau tất cả những mẩu bánh mì này.

12593
12:12:28,122 --> 12:12:31,422
Nhưng phải thừa nhận rằng\nmột số người phải làm quen với điều đó.

12594
12:12:31,421 --> 12:12:33,926
Cú pháp, bạn chỉ phải làm một tuần.

12595
12:12:33,927 --> 12:12:35,802
Nhưng một lần nữa, tuần tới\nin Python chúng ta sẽ bắt đầu

12596
12:12:35,802 --> 12:12:37,632
để trừu tượng hóa nhiều\nsự phức tạp này.

12597
12:12:37,631 --> 12:12:39,502
Nhưng sự phức tạp\nnày sẽ không biến mất.

12598
12:12:39,502 --> 12:12:42,252
Chỉ là một người khác, chẳng hạn như\ntác giả của Python

12599
12:12:42,252 --> 12:12:44,389
sẽ tự động hóa công cụ này cho chúng tôi.

12600
12:12:44,389 --> 12:12:46,182
Mục tiêu của tuần này là\nhiểu được nó là gì

12601
12:12:46,182 --> 12:12:49,461
có thể nói là chúng ta sẽ nhận được\nmiễn phí vào tuần tới.

12602
12:12:49,961 --> 12:12:54,292
Các câu hỏi về danh sách độ dài này.

12603
12:12:55,932 --> 12:12:58,745
ĐỐI TƯỢNG: Vòng lặp while\n cũng rất cần thiết

12604
12:12:58,745 --> 12:13:00,209
để giải phóng [KHÔNG NGHE ĐƯỢC].

12605
12:13:01,252 --> 12:13:03,834
Hãy để tôi tóm tắt lại là liệu chúng ta có thể giải phóng điều này bằng vòng lặp for không?

12606
12:13:04,760 --> 12:13:06,112
Đó chỉ là vấn đề về phong cách.

12607
12:13:06,112 --> 12:13:09,152
Làm điều đó thanh lịch hơn một chút\n

12608
12:13:09,152 --> 12:13:11,154
Nhưng những người khác sẽ\nkhông đồng ý một cách hợp lý.

12609
12:13:11,154 --> 12:13:13,862
Bất cứ điều gì bạn có thể làm trong chốc lát\n

12610
12:13:14,872 --> 12:13:17,211
Thực hiện các vòng lặp while, hãy nhớ lại,\na có hơi khác một chút.

12611
12:13:17,211 --> 12:13:19,853
Nhưng họ sẽ luôn\nlàm ít nhất một việc.

12612
12:13:19,853 --> 12:13:22,311
Nhưng vòng lặp for và while\nhoạt động giống nhau trong trường hợp này.

12613
12:13:25,482 --> 12:13:27,881
Được rồi, chúng ta hãy\nthay đổi mọi thứ một chút ở đây.

12614
12:13:27,881 --> 12:13:29,963
Chỉ để xem\nnhững cạm bẫy bây giờ có thể là gì

12615
12:13:29,963 --> 12:13:31,722
mà không cần đi sâu vào mã.

12616
12:13:31,722 --> 12:13:35,711
Thật vậy, chúng tôi sẽ cố gắng cứu một số\n

12617
12:13:35,711 --> 12:13:40,002
Nhưng thay vào đó, hãy tưởng tượng rằng chúng ta\n

12618
12:13:40,002 --> 12:13:43,182
Tôi có thể đề nghị, để đổi lấy một\nmột vài tình nguyện viên, một số ngón tay xốp

12619
12:13:43,182 --> 12:13:45,099
có lẽ để mang đến trò chơi tiếp theo.

12620
12:13:45,099 --> 12:13:46,932
Liệu chúng ta có thể nhận được\nkhông ai tình nguyện trước không?

12621
12:13:47,591 --> 12:13:50,591
Bạn sẽ là danh sách\nđược liên kết của chúng tôi ngay từ đầu.

12622
12:13:52,061 --> 12:13:54,322
GIỌNG 1: Pedro, lên đi.

12623
12:13:54,322 --> 12:13:55,572
Được rồi, cảm ơn Pedro.

12624
12:13:58,661 --> 12:14:00,661
Và nếu bạn muốn\nđứng một cách đại khái ở đây.

12625
12:14:00,661 --> 12:14:03,210
Nhưng bạn là một con trỏ rỗng nên\nchỉ cần trỏ xuống đất

12626
12:14:03,211 --> 12:14:04,412
như thể bạn đang chỉ vào số 0.

12627
12:14:04,911 --> 12:14:07,508
Vì vậy, Pedro là danh sách liên kết của chúng tôi\ncó kích thước 0, theo hình ảnh

12628
12:14:07,508 --> 12:14:10,800
có thể trông giống như thế này\n

12629
12:14:10,800 --> 12:14:15,481
Bây giờ giả sử chúng ta muốn tiếp tục\n

12630
12:14:15,482 --> 12:14:17,682
Chúng ta có thể nhờ một tình nguyện viên\n ghi hình ở đây không?

12631
12:14:18,182 --> 12:14:19,349
Bạn nhảy ra khỏi chỗ ngồi.

12632
12:14:21,889 --> 12:14:23,682
Được rồi, bạn thực sự muốn\nngón tay xốp, tôi nói.

12633
12:14:36,752 --> 12:14:39,271
Đây là số\n2 cho trường số của bạn.

12634
12:14:40,502 --> 12:14:43,597
Và tiếp tục, hãy nói rằng có\n

12635
12:14:44,222 --> 12:14:46,961
Vậy là Caleb đã bị bắt,\nnếu bạn muốn, ở đây.

12636
12:14:46,961 --> 12:14:51,286
Vì vậy bây giờ nếu chúng ta muốn chèn Caleb và\n

12637
12:14:51,286 --> 12:14:52,411
à chúng ta cần phải làm gì?

12638
12:14:52,411 --> 12:14:53,822
Tôi đã khởi tạo cho bạn thành 2.

12639
12:14:53,822 --> 12:14:55,802
Và chỉ tay xuống đất có nghĩa là

12640
12:14:55,802 --> 12:14:58,112
bạn được khởi tạo thành\nnull cho trường tiếp theo của mình.

12641
12:14:58,112 --> 12:14:59,881
Pedro, điều anh nên-- hoàn hảo.

12642
12:15:02,101 --> 12:15:03,676
Vì vậy, Pedro hiện đang chỉ vào danh sách.

12643
12:15:03,677 --> 12:15:05,802
Vì vậy, bây giờ danh sách của chúng ta trông giống như thế này.

12644
12:15:07,652 --> 12:15:10,152
Vì vậy, một vài điều đầu tiên trong số này\nsẽ khá đơn giản.

12645
12:15:10,152 --> 12:15:13,662
Hãy chèn thêm một cái nữa, nếu có ai\n

12646
12:15:13,661 --> 12:15:15,161
Đây, ở ngay giữa thì sao.

12647
12:15:16,351 --> 12:15:19,159
Và chỉ để dự đoán thôi,\nchúng ta hãy tìm người khác nhé.

12648
12:15:19,160 --> 12:15:20,702
Được rồi, bạn bè của bạn đang chỉ vào bạn.

12649
12:15:20,701 --> 12:15:22,831
Bạn có muốn xuống trước không?

12650
12:15:22,832 --> 12:15:25,334
Đây là một vùng ký ức, nếu bạn muốn.

12651
12:15:30,661 --> 12:15:32,291
Và treo ở đó chỉ một lát.

12652
12:15:32,792 --> 12:15:34,351
Vậy là chúng ta vừa mới đánh bại Hannah.

12653
12:15:34,351 --> 12:15:37,621
Và Hannah, còn Hannah thì sao,\giả sử bạn đã đến đó

12654
12:15:37,622 --> 12:15:39,282
chỉ ở một số vị trí ngẫu nhiên.

12655
12:15:39,781 --> 12:15:43,442
Vậy bây giờ chúng ta nên làm gì, nếu\n

12656
12:15:44,042 --> 12:15:46,020
Vậy Pedro, bạn có\ntự cập nhật không?

12657
12:15:47,391 --> 12:15:48,781
Caleb, anh phải làm gì?

12658
12:15:49,281 --> 12:15:52,173
Và Hannah bạn nên làm gì?

12659
12:15:52,173 --> 12:15:55,381
Tôi sẽ làm vậy, bây giờ nó chỉ dành cho bạn thôi, nên\n

12660
12:15:55,881 --> 12:15:58,771
Vì vậy, một lần nữa chứng minh sự thật\n

12661
12:15:58,771 --> 12:16:01,291
chúng tôi đã có mảng sạch đẹp\nback, back, back

12662
12:16:01,292 --> 12:16:03,862
liền nhau, những kẻ này\ncố tình tràn khắp sân khấu.

12663
12:16:10,921 --> 12:16:12,737
Và chọn địa điểm yêu thích của bạn trong bộ nhớ.

12664
12:16:16,802 --> 12:16:19,030
Vậy bây giờ Jonathan đang ở đằng kia.

12665
12:16:20,072 --> 12:16:21,929
Vì vậy, 5, chúng tôi muốn trỏ\nHannah vào số 5.

12666
12:16:21,928 --> 12:16:23,761
Vậy tất nhiên là bạn sẽ chỉ vào đó.

12667
12:16:23,762 --> 12:16:25,137
Và bạn nên chỉ vào đâu?

12668
12:16:25,137 --> 12:16:26,982
Xuống để đại diện cho null.

12669
12:16:29,035 --> 12:16:30,702
Nhưng bây giờ mọi thứ trở nên thú vị một chút.

12670
12:16:30,701 --> 12:16:33,481
Và ở đây, chúng ta sẽ tận dụng cơ hội\nđể mà không cần đến mã

12671
12:16:33,482 --> 12:16:36,572
chỉ ra thứ tự thực hiện các thao tác thực sự quan trọng như thế nào.

12672
12:16:36,572 --> 12:16:40,802
Giả sử tiếp theo tôi muốn\nphân bổ số 1.

12673
12:16:40,802 --> 12:16:42,992
Và tôi muốn chèn\nsố 1 vào danh sách này.

12674
12:16:43,491 --> 12:16:45,101
Đây là những gì mã sẽ trông như thế nào.

12675
12:16:45,101 --> 12:16:48,661
Nhưng nếu chúng ta thực hiện điều này-- liệu\nchúng ta có thể tuyển thêm một tình nguyện viên nữa không?

12676
12:16:48,661 --> 12:16:50,471
Còn chiếc áo len ở cuối\n thì sao.

12677
12:17:01,457 --> 12:17:03,332
Còn Lauren,\ntại sao bạn không đi đúng hướng

12678
12:17:03,332 --> 12:17:04,952
ở đây, phía trước, nếu bạn không phiền.

12679
12:17:07,262 --> 12:17:09,332
Vì vậy tôi đã khởi tạo\nLauren thành số 1.

12680
12:17:09,332 --> 12:17:11,942
Và con trỏ của bạn sẽ\nnull, trỏ xuống đất.

12681
12:17:11,942 --> 12:17:14,485
Bạn thuộc về đâu nếu chúng ta\nduy trì trật tự được sắp xếp?

12682
12:17:14,485 --> 12:17:15,902
Có vẻ như ngay từ đầu.

12683
12:17:18,902 --> 12:17:23,582
Vậy là Pedro đã đoán là sẽ chỉ vào Lauren.

12684
12:17:23,582 --> 12:17:27,812
Nhưng làm sao bạn biết phải chỉ vào đâu?

12685
12:17:28,982 --> 12:17:30,882
GIỌNG 1: Pedro đang hủy bỏ\nnhững gì anh ấy đã làm cách đây không lâu.

12686
12:17:31,862 --> 12:17:35,232
Và điều đó thật hoàn hảo khi Pedro\n

12687
12:17:35,732 --> 12:17:39,432
Bạn thực sự vừa mồ côi tất cả những thứ này\n

12688
12:17:39,932 --> 12:17:44,281
Bởi vì nếu Pedro là biến số duy nhất của chúng ta\n

12689
12:17:44,281 --> 12:17:47,281
đây là mối nguy hiểm khi sử dụng con trỏ,\n

12690
12:17:47,281 --> 12:17:48,661
và xây dựng cấu trúc dữ liệu của riêng bạn.

12691
12:17:48,661 --> 12:17:50,619
Thời điểm bạn chỉ\ntạm thời, nếu bạn có thể

12692
12:17:50,620 --> 12:17:53,972
với Lauren, tôi không biết anh ấy đang chỉ vào đâu.

12693
12:17:53,972 --> 12:17:58,741
Tôi không biết làm cách nào để quay lại Caleb,\n

12694
12:18:01,771 --> 12:18:03,781
Tôi nghĩ chúng ta cần Lauren\n đưa ra quyết định trước.

12695
12:18:05,131 --> 12:18:06,301
GIỌNG 1: Vậy là chỉ vào Caleb.

12696
12:18:06,601 --> 12:18:09,184
Bởi vì bạn đang chỉ\ntheo nghĩa đen là người mà Pedro đang chỉ vào.

12697
12:18:09,184 --> 12:18:10,971
Pedro, bây giờ bạn có thể làm gì an toàn?

12698
12:18:11,472 --> 12:18:13,211
Vì vậy, thứ tự hoạt động có vấn đề.

12699
12:18:13,211 --> 12:18:17,311
Và nếu chúng ta vừa thực hiện dòng này\n

12700
12:18:17,311 --> 12:18:20,222
Đó giống như bản năng đầu tiên của Pedro, những điều tồi tệ sẽ xảy ra.

12701
12:18:20,222 --> 12:18:22,182
Và chúng tôi mồ côi phần còn lại của danh sách.

12702
12:18:22,182 --> 12:18:25,832
Nhưng nếu chúng ta suy nghĩ một cách logic và\n

12703
12:18:25,832 --> 12:18:29,322
hiện chúng tôi đã cập nhật danh sách để xem\n

12704
12:18:30,391 --> 12:18:32,966
Chúng ta có thêm một ngón tay xốp\nở đây cho số 3.

12705
12:18:49,216 --> 12:18:52,851
Nếu bạn muốn đi có thể vào giữa\n

12706
12:18:52,851 --> 12:18:56,752
Vì vậy, ở đây mục tiêu cũng là\nduy trì thứ tự được sắp xếp.

12707
12:18:56,752 --> 12:19:01,881
Vậy hãy hỏi khán giả xem ai hoặc cái gì\n

12708
12:19:01,881 --> 12:19:04,391
Vì vậy, chúng tôi không làm hỏng và\bớt một số bộ nhớ.

12709
12:19:04,391 --> 12:19:07,722
Và nếu chúng ta thực hiện ký ức mồ côi thì đây là\n

12710
12:19:08,591 --> 12:19:10,901
Máy Mac, PC,\nđiện thoại của bạn có thể bắt đầu chậm lại

12711
12:19:10,902 --> 12:19:14,092
nếu bạn tiếp tục yêu cầu bộ nhớ nhưng\n

12712
12:19:14,091 --> 12:19:15,911
Vì vậy, chúng tôi muốn làm điều này đúng.

12713
12:19:20,502 --> 12:19:22,182
NGƯỜI 1: 3 nên chỉ vào 4.

12714
12:19:22,182 --> 12:19:25,572
Vậy 3, bạn có muốn chỉ vào 4 không?

12715
12:19:27,281 --> 12:19:32,442
Và làm sao bạn biết,\nMiriam, phải chỉ vào ai?

12716
12:19:36,131 --> 12:19:39,701
Bởi vì nếu bạn nhìn vào nơi danh sách này\n hiện đang được xây dựng

12717
12:19:39,701 --> 12:19:42,551
và bạn có thể gian lận trên bảng\nở đây, 2 đang trỏ đến 4.

12718
12:19:42,552 --> 12:19:46,122
Nếu bạn chỉ vào người mà Caleb,\nsố 2, đang chỉ

12719
12:19:46,122 --> 12:19:48,942
điều đó thực sự dẫn bạn đến Hannah ở vị trí thứ 4.

12720
12:19:48,942 --> 12:19:53,082
Vậy bây giờ bước tiếp theo\nđể ghép những thứ này lại với nhau là gì?

12721
12:19:57,792 --> 12:20:00,385
Vậy nên Caleb, tôi nghĩ bây giờ\nanh đã an toàn để tách riêng.

12722
12:20:00,385 --> 12:20:02,302
Bởi vì ai đó đã\nchỉ vào Hannah rồi.

12723
12:20:02,302 --> 12:20:03,427
Chúng tôi không mồ côi ai cả.

12724
12:20:03,427 --> 12:20:05,322
Vì vậy bây giờ, nếu chúng ta theo dõi\ncác đường dẫn, chúng ta đã

12725
12:20:05,322 --> 12:20:10,351
đã giúp Pedro dẫn đến 1,\nđến 2, đến 3, đến 4, đến 5.

12726
12:20:10,351 --> 12:20:12,851
Chúng tôi cần lấy lại các con số, nhưng\nbạn có thể giữ lại các ngón tay xốp.

12727
12:20:12,851 --> 12:20:15,019
Cảm ơn các tình nguyện viên của chúng tôi ở đây.

12728
12:20:17,741 --> 12:20:20,739
LOA 1: Bạn chỉ cần\nnhập số vào đây.

12729
12:20:21,572 --> 12:20:22,739
NGƯỜI GIỌNG 1: Cảm ơn tất cả mọi người.

12730
12:20:22,739 --> 12:20:26,682
Vì vậy điều này chỉ để nói rằng khi bạn\n

12731
12:20:26,682 --> 12:20:29,245
và trong bộ vấn đề, sẽ rất dễ bị thua

12732
12:20:29,245 --> 12:20:30,662
cảnh rừng đối với cây cối.

12733
12:20:30,661 --> 12:20:32,701
Bởi vì mã thực sự dày đặc.

12734
12:20:32,701 --> 12:20:37,721
Nhưng một lần nữa, ý tưởng thực sự là làm bong bóng\n

12735
12:20:37,722 --> 12:20:40,781
Và nếu bạn nghĩ về cấu trúc dữ liệu ở cấp độ này.

12736
12:20:40,781 --> 12:20:42,898
Nếu bạn tắt chương trình\nsau một lớp học như CS50

12737
12:20:42,898 --> 12:20:45,481
và việc bạn viết nội dung gì đó lên bảng trắng\nvới một người bạn hoặc đồng nghiệp

12738
12:20:45,482 --> 12:20:48,512
hầu hết mọi người đều suy nghĩ và nói chuyện ở cấp độ này.

12739
12:20:48,512 --> 12:20:51,031
Và họ chỉ cho rằng,\nừ, nếu chúng ta quay lại và xem xét

12740
12:20:51,031 --> 12:20:54,371
trong sách giáo khoa hoặc ghi chú trên lớp, chúng tôi\n

12741
12:20:54,372 --> 12:20:56,222
Nhưng điều quan trọng\là cuộc trò chuyện.

12742
12:20:57,601 --> 12:21:02,561
Mặc dù vậy, trong tuần này, chúng ta sẽ\n

12743
12:21:02,561 --> 12:21:06,572
Vì vậy, khi phân tích thuật toán\nan như thế này

12744
12:21:06,572 --> 12:21:08,641
Hãy xem xét những điều sau đây.

12745
12:21:08,641 --> 12:21:15,961
Thời gian chạy của\n bây giờ có thể là bao nhiêu

12746
12:21:17,582 --> 12:21:19,292
Chúng ta đã nói về mảng trước đó.

12747
12:21:19,292 --> 12:21:22,292
Và chúng tôi vẫn có một số khả năng\ntìm kiếm nhị phân ngay khi

12748
12:21:23,131 --> 12:21:26,311
Nhưng ngay khi chúng ta có danh sách liên kết,\n

12749
12:21:27,661 --> 12:21:29,369
Và vì thế bạn không thể\giả định rằng bạn có thể

12750
12:21:29,370 --> 12:21:32,162
nhảy số học đến giữa\n

12751
12:21:32,982 --> 12:21:36,572
Bạn gần như phải làm theo tất cả\n

12752
12:21:36,572 --> 12:21:39,362
Vậy làm thế nào điều đó có thể thông báo những gì chúng ta thấy?

12753
12:21:41,076 --> 12:21:43,951
Mặc dù tôi vẫn tiếp tục vẽ tất cả những thứ này\n

12754
12:21:44,461 --> 12:21:46,254
Và tất cả con người chúng ta\trong phòng có thể dễ dàng

12755
12:21:46,254 --> 12:21:49,842
tìm ra vị trí của số 1, vị trí của số 2,\n

12756
12:21:49,841 --> 12:21:54,091
giống như với tủ khóa và mảng của chúng tôi,\n

12757
12:21:54,091 --> 12:21:57,991
Và điều quan trọng với danh sách\nđược liên kết là địa chỉ duy nhất

12758
12:21:57,991 --> 12:22:01,891
về cơ bản chúng tôi đã ghi nhớ\n

12759
12:22:01,891 --> 12:22:05,472
Anh ấy là mối liên kết tới tất cả\ncác nút khác.

12760
12:22:05,472 --> 12:22:07,472
Và lần lượt, mỗi người dẫn đến người tiếp theo.

12761
12:22:07,472 --> 12:22:12,132
Nhưng nếu không có Pedro, chúng ta sẽ thua\n

12762
12:22:12,131 --> 12:22:14,432
Vì vậy, khi bạn bắt đầu với\na danh sách liên kết, nếu bạn

12763
12:22:14,432 --> 12:22:18,211
muốn tìm một phần tử như via\n

12764
12:22:18,211 --> 12:22:19,682
Theo tất cả các mũi tên.

12765
12:22:19,682 --> 12:22:21,692
Theo dõi tất cả\ncác chỉ dẫn trên sân khấu

12766
12:22:21,692 --> 12:22:23,822
để đến được nút được đề cập.

12767
12:22:23,822 --> 12:22:27,182
Và chỉ khi bạn nhấn null\nbạn mới có thể kết luận, vâng, nó ở đó.

12768
12:22:28,982 --> 12:22:31,922
Vì vậy, nếu một\nmáy tính, về cơ bản

12769
12:22:31,921 --> 12:22:36,451
chỉ có thể nhìn thấy số 1 hoặc số\n

12770
12:22:36,451 --> 12:22:39,752
hoặc số 5, từng cái một, làm sao chúng ta có thể

12771
12:22:39,752 --> 12:22:43,171
nghĩ về thời gian chạy tìm kiếm?

12772
12:22:43,171 --> 12:22:45,091
Và quả thực đó là Big O của n.

12773
12:22:45,891 --> 12:22:48,391
Chà, trong trường hợp xấu nhất, số\nbạn có thể đang tìm kiếm

12774
12:22:49,961 --> 12:22:53,192
Và vì vậy, rõ ràng là bạn sẽ\n

12775
12:22:53,192 --> 12:22:55,425
Và tôi đã vẽ những thứ này\nvới những chiếc hộp bên trên.

12776
12:22:55,425 --> 12:22:57,842
Bởi vì, một lần nữa, mặc dù\nbạn và tôi có thể nhìn thấy ngay lập tức

12777
12:22:57,841 --> 12:23:00,091
ví dụ trong đó số 5 là số 5, máy tính

12778
12:23:00,091 --> 12:23:03,961
chỉ có thể tìm ra điều đó bằng cách bắt đầu\n

12779
12:23:03,961 --> 12:23:05,881
Vì vậy, cũng có một sự đánh đổi khác.

12780
12:23:05,881 --> 12:23:09,511
Có vẻ như chỉ sau một đêm,\nchúng ta đã mất khả năng

12781
12:23:09,512 --> 12:23:14,672
để thực hiện một thuật toán rất mạnh mẽ từ\n

12782
12:23:15,302 --> 12:23:19,292
Bởi vì trong bức ảnh này\nkhông có cách nào để nhảy về mặt toán học

12783
12:23:19,292 --> 12:23:21,857
tới nút ở giữa, trừ khi\nbạn nhớ nó ở đâu.

12784
12:23:21,857 --> 12:23:23,732
Và sau đó, hãy nhớ\nmọi nút khác ở đâu.

12785
12:23:23,732 --> 12:23:25,524
Và tại thời điểm đó,\nbạn sẽ quay lại một mảng.

12786
12:23:25,523 --> 12:23:29,862
Danh sách liên kết, theo thiết kế, chỉ\nnhớ nút tiếp theo trong danh sách.

12787
12:23:30,362 --> 12:23:32,851
Làm thế nào về một cái gì đó như chèn?

12788
12:23:32,851 --> 12:23:35,671
Trong trường hợp xấu nhất,\ncó lẽ bao nhiêu bước

12789
12:23:35,671 --> 12:23:38,822
có thể cần phải chèn\nthứ gì đó vào danh sách liên kết không?

12790
12:23:44,372 --> 12:23:45,713
May mắn thay, nó không tệ đến thế.

12791
12:23:45,713 --> 12:23:46,921
Nó không tệ như n bình phương.

12792
12:23:46,921 --> 12:23:49,201
Điều đó thường có nghĩa là\nlàm n việc, n lần.

12793
12:23:49,201 --> 12:23:53,741
Và tôi nghĩ chúng ta có thể tiếp tục theo\nđiều đó, nhưng đó không phải là một ý kiến ​​tồi.

12794
12:23:55,313 --> 12:23:56,521
GIỌNG 1: Tại sao lại là n?

12795
12:23:56,521 --> 12:24:00,269
KHÁN GIẢ: Bởi vì [KHÔNG NGHE ĐƯỢC].

12796
12:24:00,851 --> 12:24:03,131
Vì vậy, để tóm tắt, bạn đang đề xuất n.

12797
12:24:03,131 --> 12:24:04,994
Bởi vì để tìm ra\nsự việc sẽ đi đến đâu, bạn

12798
12:24:04,995 --> 12:24:06,912
phải duyệt qua\ncó thể là toàn bộ danh sách.

12799
12:24:06,911 --> 12:24:09,701
Bởi vì nếu tôi chèn\nsố 6 hoặc số 99

12800
12:24:09,701 --> 12:24:12,252
về mặt số\nthuộc về số cuối cùng

12801
12:24:12,252 --> 12:24:15,311
Tôi chỉ có thể tìm thấy vị trí của nó\nbằng cách tìm kiếm tất cả chúng.

12802
12:24:15,311 --> 12:24:16,849
Tuy nhiên, tại thời điểm này, trong thuật ngữ này.

12803
12:24:16,849 --> 12:24:18,641
Và thực sự, tại điểm\ncủa câu chuyện, bạn

12804
12:24:18,641 --> 12:24:22,072
nên bắt đầu đặt câu hỏi về những điều này\n

12805
12:24:22,072 --> 12:24:25,841
Bởi vì câu trả lời hầu như luôn luôn phụ thuộc, phải không.

12806
12:24:25,841 --> 12:24:28,461
Nếu tôi vừa có một liên kết tới\ndanh sách trông như thế này

12807
12:24:28,461 --> 12:24:31,722
câu hỏi đầu tiên dành cho\nngười hỏi câu hỏi này

12808
12:24:31,722 --> 12:24:34,781
sẽ là, danh sách\n cần phải được sắp xếp, phải không?

12809
12:24:34,781 --> 12:24:37,173
Tôi đã vẽ nó theo thứ tự\nvà nó có thể hàm ý nhiều điều như vậy.

12810
12:24:37,173 --> 12:24:39,131
Vì vậy đó là một giả định hợp lý đã được đưa ra.

12811
12:24:39,131 --> 12:24:41,801
Nhưng nếu tôi không quan tâm đến\nviệc duy trì thứ tự sắp xếp

12812
12:24:41,802 --> 12:24:45,672
Tôi thực sự có thể chèn vào một\ndanh sách liên kết trong thời gian không đổi.

12813
12:24:46,211 --> 12:24:49,110
Tôi chỉ có thể tiếp tục chèn vào\n

12814
12:24:49,902 --> 12:24:51,792
Và mặc dù\ndanh sách ngày càng dài hơn

12815
12:24:51,792 --> 12:24:55,752
số bước cần thiết để chèn\n

12816
12:25:00,222 --> 12:25:02,382
Tuy nhiên, nếu bạn muốn giữ nó\nđược sắp xếp, vâng, đó là

12817
12:25:02,381 --> 12:25:03,792
thực sự sẽ là Big O của n.

12818
12:25:03,792 --> 12:25:05,322
Nhưng một lần nữa, những kiểu\nof này, bây giờ, những giả định

12819
12:25:05,322 --> 12:25:06,529
sẽ bắt đầu có vấn đề.

12820
12:25:06,529 --> 12:25:09,222
Vì vậy hãy để chúng ta\thảo luận nói rằng đó là Big O of n

12821
12:25:09,222 --> 12:25:11,141
nếu chúng ta muốn duy trì thứ tự được sắp xếp.

12822
12:25:11,141 --> 12:25:14,292
Nhưng còn trong trường hợp\nkhông quan tâm thì sao.

12823
12:25:14,292 --> 12:25:16,110
Nó thực sự có thể là Big O trên 1.

12824
12:25:16,110 --> 12:25:19,152
Và bây giờ đây là những loại quyết định\n

12825
12:25:19,152 --> 12:25:20,682
Còn trong trường hợp tốt nhất ở đây thì sao?

12826
12:25:20,682 --> 12:25:22,722
Nếu chúng ta đang nghĩ về\nký hiệu Omega lớn

12827
12:25:22,722 --> 12:25:25,114
thì thành thật mà nói, chúng ta chỉ có thể gặp may mắn trong trường hợp tốt nhất.

12828
12:25:25,114 --> 12:25:27,822
Và phần tử chúng tôi đang tìm kiếm\n

12829
12:25:27,822 --> 12:25:32,052
Hoặc chết tiệt, chúng ta chỉ chèn một cách mù quáng vào\n

12830
12:25:32,052 --> 12:25:33,982
mà chúng ta muốn giữ mọi thứ trong đó.

12831
12:25:34,482 --> 12:25:39,900
Vậy ngoài ra, làm cách nào chúng ta có thể cải thiện hơn nữa thiết kế này?

12832
12:25:39,900 --> 12:25:41,442
Chúng ta không cần dừng lại ở danh sách liên kết.

12833
12:25:41,442 --> 12:25:43,572
Bởi vì, thành thật mà nói, đó\nkhông phải là một chiến thắng rõ ràng.

12834
12:25:43,572 --> 12:25:46,421
Giống như danh sách liên kết cho phép chúng ta\nsử dụng nhiều bộ nhớ hơn

12835
12:25:46,421 --> 12:25:49,911
bởi vì chúng tôi không cần đồ sộ\n

12836
12:25:50,781 --> 12:25:54,792
Nhưng họ vẫn cần Big O\nn thời gian để tìm ra điểm kết thúc của nó

12837
12:25:56,112 --> 12:25:59,351
Chúng tôi đang sử dụng ít nhất gấp đôi\nbộ nhớ cho con trỏ chết tiệt.

12838
12:25:59,351 --> 12:26:01,601
Vì vậy, đó có vẻ như là một bước lùi.

12839
12:26:01,601 --> 12:26:03,582
Đó không thực sự là một bước tiến.

12840
12:26:05,322 --> 12:26:09,639
Đây là nơi chúng ta có thể tăng tốc\n

12841
12:26:09,639 --> 12:26:11,472
ngay cả khi bạn chưa\nsử dụng kỹ thuật này

12842
12:26:11,472 --> 12:26:15,612
chúng tôi dường như có khả năng\n

12843
12:26:16,601 --> 12:26:19,002
Và bất cứ điều gì bạn có thể\nhình dung ra việc vẽ bằng mũi tên

12844
12:26:19,002 --> 12:26:21,622
có vẻ như bạn có thể triển khai bằng mã\n.

12845
12:26:21,622 --> 12:26:24,102
Vậy điều gì sẽ xảy ra nếu chúng ta tận dụng\na chiều thứ hai.

12846
12:26:24,101 --> 12:26:26,618
Thay vì chỉ xâu chuỗi\ncác thứ lại với nhau theo chiều ngang

12847
12:26:26,618 --> 12:26:28,451
về cơ bản là từ trái sang phải,\mặc dù chúng

12848
12:26:28,451 --> 12:26:30,101
đang nảy xung quanh trên màn hình.

12849
12:26:30,101 --> 12:26:33,252
Điều gì sẽ xảy ra nếu chúng ta bắt đầu tận dụng\n

12850
12:26:33,252 --> 12:26:36,881
Và xây dựng những cấu trúc\nthú vị hơn trong bộ nhớ máy tính.

12851
12:26:36,881 --> 12:26:39,671
Ồ hóa ra\nbộ nhớ của máy tính

12852
12:26:39,671 --> 12:26:42,612
chúng ta có thể tạo một cái cây,\ntương tự như cây gia phả.

12853
12:26:42,612 --> 12:26:46,362
Nếu bạn đã từng nhìn thấy hoặc vẽ về một gia đình\n

12854
12:26:50,442 --> 12:26:53,652
Vì vậy, nhánh mọc ngược của một cây mọc lên, thường

12855
12:26:53,652 --> 12:26:56,531
khi nó được vẽ, hãy hướng xuống\n thay vì hướng lên trên giống như một cái cây thông thường.

12856
12:26:56,531 --> 12:26:59,021
Nhưng đó cũng là thứ chúng tôi có thể\nchuyển thành mã.

12857
12:26:59,021 --> 12:27:02,721
Cụ thể, hãy làm một việc\ngọi là cây tìm kiếm nhị phân.

12858
12:27:04,601 --> 12:27:07,152
Và ý tôi muốn nói\nđây là điều sau đây.

12859
12:27:07,961 --> 12:27:10,841
Đây là ví dụ về\narray từ tuần thứ 2

12860
12:27:10,841 --> 12:27:12,231
khi lần đầu tiên chúng ta nói về những điều đó.

12861
12:27:12,232 --> 12:27:13,932
Và chúng tôi có tủ đựng đồ trên sân khấu.

12862
12:27:13,932 --> 12:27:19,961
Và hãy nhớ lại điều hay\nvề một mảng, nếu là 1 thì nó đã được sắp xếp.

12863
12:27:19,961 --> 12:27:23,021
Và 2, tất cả các số của nó\nang thực sự liền kề nhau

12864
12:27:23,021 --> 12:27:25,011
theo định nghĩa là một mảng.

12865
12:27:25,012 --> 12:27:26,752
Chúng ta chỉ có thể làm một số phép tính đơn giản.

12866
12:27:26,752 --> 12:27:31,461
Ví dụ: nếu có 7 phần tử\n

12867
12:27:31,961 --> 12:27:34,811
3 và 1/2, làm tròn xuống\nbằng cách cắt bớt, tức là 3.

12868
12:27:36,161 --> 12:27:39,414
Điều đó mang lại cho tôi yếu tố ở giữa,\về mặt thuật toán, trong thứ này.

12869
12:27:39,415 --> 12:27:41,832
Và mặc dù tôi phải\ncẩn thận về việc làm tròn, sử dụng

12870
12:27:41,832 --> 12:27:45,912
số học đơn giản, tôi có thể làm rất nhanh,\n

12871
12:27:45,911 --> 12:27:48,371
tìm cho bạn phần giữa\nnửa bên trái, của nửa bên trái

12872
12:27:48,372 --> 12:27:49,664
của nửa bên phải, hoặc bất cứ điều gì.

12873
12:27:49,663 --> 12:27:50,961
Đó là sức mạnh của mảng.

12874
12:27:50,961 --> 12:27:52,902
Và đó là điều đã mang lại cho chúng tôi tìm kiếm nhị phân.

12875
12:27:52,902 --> 12:27:54,421
Và tìm kiếm nhị phân hoạt động như thế nào?

12876
12:27:54,421 --> 12:27:55,671
Vâng, chúng tôi đã nhìn vào giữa.

12877
12:27:55,671 --> 12:27:57,311
Và sau đó, chúng tôi đi sang trái hoặc phải.

12878
12:27:57,311 --> 12:28:02,561
Và sau đó, chúng tôi lại rẽ sang trái hoặc sang phải,\n

12879
12:28:02,561 --> 12:28:07,691
Sẽ thật tuyệt nếu\nbằng cách nào đó chúng ta bảo tồn được những lợi thế mới

12880
12:28:07,692 --> 12:28:10,520
ngày nay của trí nhớ động\nallocation, mang lại cho chúng ta

12881
12:28:10,519 --> 12:28:13,061
khả năng chỉ cần thêm một phần tử khác, thêm một phần tử khác

12882
12:28:14,232 --> 12:28:16,782
Nhưng vẫn giữ được sức mạnh của tìm kiếm nhị phân.

12883
12:28:16,781 --> 12:28:21,582
Bởi vì log của n tốt hơn nhiều so với\n

12884
12:28:21,582 --> 12:28:24,461
Ngay cả danh bạ điện thoại\được chứng minh nhiều tuần trước.

12885
12:28:24,461 --> 12:28:28,491
Vậy điều gì sẽ xảy ra nếu tôi vẽ bức tranh\ntương tự này theo không gian 2 chiều.

12886
12:28:28,491 --> 12:28:32,441
Và tôi giữ nguyên cách phối màu,\n

12887
12:28:32,442 --> 12:28:35,982
Bây giờ những thứ này trông như thế nào?

12888
12:28:35,982 --> 12:28:38,532
Có lẽ, giống như những thứ mà bây giờ chúng ta có thể gọi là nút, phải không.

12889
12:28:38,531 --> 12:28:42,512
Nút chỉ là một thuật ngữ chung\nđể chỉ việc lưu trữ một số dữ liệu.

12890
12:28:42,512 --> 12:28:45,682
Điều gì sẽ xảy ra nếu dữ liệu mà các nút này\nare lưu trữ là số.

12891
12:28:47,211 --> 12:28:51,341
Nhưng điều gì sẽ xảy ra nếu chúng ta kết nối những thứ này\n

12892
12:28:51,341 --> 12:28:56,711
Theo đó, hiện tại mỗi nút không có một\ncon trỏ mà có tới 2.

12893
12:28:56,711 --> 12:28:59,811
Có lẽ là 0, giống như những chiếc lá\na ở phía dưới có màu xanh lục.

12894
12:28:59,811 --> 12:29:02,932
Nhưng các nút khác ở bên trong\ncó thể có tới 2.

12895
12:29:02,932 --> 12:29:04,732
Có thể nói như vậy là có 2 đứa con.

12896
12:29:04,732 --> 12:29:06,902
Và thực sự, tiếng địa phương\nở đây chính xác là như vậy.

12897
12:29:06,902 --> 12:29:08,812
Đây sẽ được gọi là\ngốc của cây.

12898
12:29:08,811 --> 12:29:11,752
Hoặc đây sẽ là cha mẹ,\nđối với những đứa trẻ này.

12899
12:29:11,752 --> 12:29:14,391
Những đứa xanh sẽ là\ncháu, hãy tôn trọng những đứa này.

12900
12:29:14,391 --> 12:29:19,012
Những người màu xanh lá cây sẽ là anh em\ntrong sự tôn trọng lẫn nhau.

12901
12:29:19,851 --> 12:29:22,144
Vì vậy, tất cả các thuật ngữ giống nhau mà bạn\ncó thể sử dụng trong thế giới thực

12902
12:29:22,144 --> 12:29:25,402
áp dụng trong thế giới dữ liệu\ncấu trúc và cây CS.

12903
12:29:25,402 --> 12:29:30,292
Nhưng điều này thật thú vị vì tôi nghĩ\n

12904
12:29:30,292 --> 12:29:32,781
cấu trúc trong bộ nhớ của máy tính.

12905
12:29:33,322 --> 12:29:37,521
Chà, giả sử rằng chúng ta đã xác định nút\na không còn chỉ là

12906
12:29:37,521 --> 12:29:39,591
cái này, một số trong trường tiếp theo.

12907
12:29:39,591 --> 12:29:42,351
Điều gì sẽ xảy ra nếu chúng ta cho mình thêm một chút không gian ở đây?

12908
12:29:42,351 --> 12:29:47,211
Và tự đặt cho mình một con trỏ có tên\n

12909
12:29:47,211 --> 12:29:49,561
Cả hai đều là một\ncon trỏ tới một nút cấu trúc.

12910
12:29:49,561 --> 12:29:53,511
Ý tưởng tương tự như trước đây, nhưng bây giờ chúng ta\n

12911
12:29:53,512 --> 12:29:56,692
khi chỉ hướng này và\nhướng này, không chỉ hướng này.

12912
12:29:56,692 --> 12:29:58,762
Không chỉ một hướng duy nhất, mà là 2.

12913
12:29:58,762 --> 12:30:02,662
Vì vậy, bạn có thể tưởng tượng, trong mã, việc xây dựng\n

12914
12:30:02,661 --> 12:30:06,051
Về bản chất, điều đó tạo ra\nsơ đồ này ở đây.

12915
12:30:07,732 --> 12:30:09,772
Giả sử tôi muốn tìm số 3.

12916
12:30:09,771 --> 12:30:12,322
Tôi muốn tìm kiếm\nsố 3 trong cây này.

12917
12:30:12,322 --> 12:30:15,682
Có vẻ như, giống như Pedro\n

12918
12:30:15,682 --> 12:30:18,572
trong thế giới của cây cối,\ncó thể nói là gốc rễ

12919
12:30:18,572 --> 12:30:20,572
là sự khởi đầu của cấu trúc dữ liệu của bạn.

12920
12:30:20,572 --> 12:30:26,211
Bạn có thể giữ lại và ghi nhớ toàn bộ điều này\n

12921
12:30:26,752 --> 12:30:29,811
Một biến có thể treo\non trên toàn bộ cây này.

12922
12:30:29,811 --> 12:30:32,002
Vậy làm thế nào tôi có thể tìm thấy số 3?

12923
12:30:32,002 --> 12:30:36,141
Chà, nếu tôi nhìn vào nút gốc và\n

12924
12:30:37,732 --> 12:30:40,052
Hoặc nếu nó lớn hơn\nthì tôi có thể đi theo hướng này.

12925
12:30:40,052 --> 12:30:42,232
Vì vậy tôi bảo toàn\ntài sản đó của danh bạ điện thoại

12926
12:30:42,232 --> 12:30:44,482
hoặc chỉ là các loại mảng nói chung.

12927
12:30:45,802 --> 12:30:48,810
Nếu tôi đang tìm 3 thì tôi có thể\ngõ sang bên phải của 2

12928
12:30:48,809 --> 12:30:50,601
vì con số đó\nsẽ lớn hơn.

12929
12:30:50,601 --> 12:30:53,161
Nếu tôi sang trái thì nó\nsẽ nhỏ hơn.

12930
12:30:53,161 --> 12:30:55,911
Và đây là một ví dụ\n về đệ quy thực sự.

12931
12:30:55,911 --> 12:30:59,572
Đệ quy theo nghĩa vật lý\ngiống như kim tự tháp của Mario.

12932
12:30:59,572 --> 12:31:01,732
Đó là đệ quy để tìm thấy.

12933
12:31:02,781 --> 12:31:04,731
Tôi khẳng định toàn bộ thứ này là một cái cây.

12934
12:31:04,732 --> 12:31:08,272
Cụ thể là tìm kiếm nhị phân\ncây, nghĩa là mọi nút

12935
12:31:08,271 --> 12:31:11,361
có 2, hoặc có thể 1, hoặc có thể 0 con.

12936
12:31:14,211 --> 12:31:19,641
Và đó là trường hợp mọi người còn lại\n

12937
12:31:19,641 --> 12:31:22,612
Và mọi quyền con\nis đều lớn hơn gốc.

12938
12:31:22,612 --> 12:31:25,582
Định nghĩa đó chắc chắn\ncó tác dụng với 2, 4 và 6.

12939
12:31:25,582 --> 12:31:30,412
Nhưng nó cũng hoạt động đệ quy cho\n

12940
12:31:30,411 --> 12:31:32,391
Lưu ý, nếu bạn nghĩ\nđây là gốc

12941
12:31:32,391 --> 12:31:34,461
nó thực sự lớn hơn\nso với đứa trẻ bên trái này.

12942
12:31:34,461 --> 12:31:36,561
Và nó nhỏ hơn đứa trẻ bên phải này.

12943
12:31:36,561 --> 12:31:39,081
Và nếu bạn thậm chí nhìn vào\nnhững chiếc lá, có thể nói như vậy.

12944
12:31:40,491 --> 12:31:44,169
Nút gốc này lớn hơn\nit nút con bên trái nếu nó tồn tại.

12945
12:31:44,169 --> 12:31:45,502
Vì vậy, đó là một tuyên bố vô nghĩa.

12946
12:31:45,502 --> 12:31:47,692
Và nó nhỏ hơn con bên phải của nó.

12947
12:31:47,692 --> 12:31:50,482
Hoặc chắc chắn là nó không lớn hơn,\nnên điều đó cũng vô nghĩa.

12948
12:31:50,482 --> 12:31:54,242
Vậy là chúng ta chưa vi phạm định nghĩa\n

12949
12:31:54,241 --> 12:31:57,711
Và bây giờ, có bao nhiêu bước\n

12950
12:31:57,711 --> 12:32:02,061
có vẻ như bất kỳ số nào trong cây tìm kiếm\nnhị phân?

12951
12:32:04,012 --> 12:32:05,882
Và chiều cao của thứ này thực tế là 3.

12952
12:32:05,881 --> 12:32:08,631
Và đặc biệt là câu chuyện rất dài,\n

12953
12:32:08,631 --> 12:32:10,792
với logarit của bạn từ năm qua.

12954
12:32:10,792 --> 12:32:14,601
Log cơ số 2 là số lần bạn\n

12955
12:32:14,601 --> 12:32:16,341
và một nửa, cho đến khi bạn giảm xuống còn 1.

12956
12:32:16,341 --> 12:32:19,309
Điều này giống như một logarit theo hướng ngược lại.

12957
12:32:19,309 --> 12:32:20,601
Đây là rất nhiều yếu tố.

12958
12:32:20,601 --> 12:32:22,972
Và chúng ta đang có, chúng ta đang\ncó cho đến khi chúng ta giảm xuống còn 1.

12959
12:32:22,972 --> 12:32:27,125
Vì vậy, chiều cao của cây này, có thể nói, là log cơ số 2 của n.

12960
12:32:27,125 --> 12:32:30,292
Điều đó có nghĩa là ngay cả trong trường hợp xấu nhất,\n

12961
12:32:30,292 --> 12:32:32,167
nó nằm tận\ndưới cùng của những chiếc lá.

12962
12:32:32,811 --> 12:32:37,701
Nó sẽ mất log cơ số 2\nof n bước hoặc log của n bước

12963
12:32:37,701 --> 12:32:41,311
để tìm, tối đa, bất kỳ\không có con số nào trong số đó.

12964
12:32:41,311 --> 12:32:46,101
Vì vậy, một lần nữa, tìm kiếm nhị phân đã quay trở lại.

12965
12:32:46,101 --> 12:32:48,116
Nhưng chúng ta đã phải trả giá, phải không?

12966
12:32:48,116 --> 12:32:49,491
Đây không còn là danh sách liên kết nữa.

12967
12:32:50,673 --> 12:32:53,631
Nhưng chúng tôi đã lấy lại được tìm kiếm nhị phân,\n

12968
12:32:53,631 --> 12:32:56,256
Đó là nơi cả lớp\nbắt đầu tạo ra sự khác biệt đó.

12969
12:32:56,256 --> 12:33:01,502
Nhưng chúng ta đã phải trả cái giá nào để giữ lại\n

12970
12:33:04,552 --> 12:33:06,532
Nó không còn được sắp xếp từ trái sang phải nữa, nhưng cái này

12971
12:33:06,531 --> 12:33:09,502
là một yêu cầu được sắp xếp, theo\n

12972
12:33:09,502 --> 12:33:13,491
Ở đâu, một lần nữa, con\nis lại nhỏ hơn gốc.

12973
12:33:13,491 --> 12:33:15,921
Và con bên phải lớn hơn gốc.

12974
12:33:15,921 --> 12:33:19,341
Vậy là nó đã được sắp xếp, nhưng nó được sắp xếp trong\n

12975
12:33:22,741 --> 12:33:24,152
ĐỐI TƯỢNG: nút [KHÔNG NGHE ĐƯỢC] bây giờ.

12976
12:33:24,944 --> 12:33:29,312
Giờ đây, mỗi nút không chỉ cần một\nsố mà cần 2, 3 mẩu dữ liệu.

12977
12:33:31,112 --> 12:33:32,866
Vì vậy, một lần nữa, lại có sự đánh đổi đó.

12978
12:33:32,866 --> 12:33:34,741
Ở đâu, nếu bạn muốn\ntiết kiệm thời gian, bạn đã

12979
12:33:34,741 --> 12:33:37,561
phải cho đi thứ gì đó nếu\nbạn bắt đầu nhường chỗ.

12980
12:33:37,561 --> 12:33:40,028
Và bạn bắt đầu sử dụng nhiều\ndung lượng hơn, bạn có thể tăng tốc thời gian.

12981
12:33:40,862 --> 12:33:42,122
Luôn luôn có một cái giá phải trả.

12982
12:33:42,122 --> 12:33:47,882
Và nó rất thường xuyên xảy ra trong không gian hoặc thời gian,\n

12983
12:33:47,881 --> 12:33:49,511
số lượng lỗi bạn phải giải quyết.

12984
12:33:49,512 --> 12:33:51,542
Ý tôi là, tất cả những nguồn tài nguyên này đều có hạn

12985
12:33:51,542 --> 12:33:53,315
rằng bạn phải sắp xếp chúng.

12986
12:33:53,315 --> 12:33:55,982
Vì vậy, nếu bây giờ chúng ta xem xét đoạn mã\nmà chúng ta có thể thực hiện điều này

12987
12:33:57,601 --> 12:34:00,551
Và làm thế nào chúng ta thực sự có thể\nsử dụng thứ gì đó như thế này?

12988
12:34:00,552 --> 12:34:03,002
Chà, chúng ta hãy xem,\ncó lẽ, một chương trình cuối cùng.

12989
12:34:03,002 --> 12:34:07,122
Và xem ở đây, trước khi chúng ta chuyển đổi\n

12990
12:34:07,122 --> 12:34:11,552
Hãy để tôi tiếp tục ở đây và để tôi chỉ\n

12991
12:34:11,552 --> 12:34:15,692
Vì vậy, trong giây lát, hãy để tôi sao chép\nover tệp có tên là tree.c.

12992
12:34:15,692 --> 12:34:18,550
Chúng tôi sẽ có trên\ntrang web của khóa học.

12993
12:34:18,550 --> 12:34:20,342
Và tôi sẽ hướng dẫn bạn\nmột số logic

12994
12:34:20,341 --> 12:34:25,271
ở đây tôi đã viết cho cây.c.

12995
12:34:25,771 --> 12:34:27,281
Vậy chúng ta có gì ở đây đầu tiên?

12996
12:34:27,281 --> 12:34:31,921
Vì vậy đây là cách triển khai\n

12997
12:34:31,921 --> 12:34:36,341
Và như trước đây, tôi đã chơi đùa và\n

12998
12:34:37,771 --> 12:34:41,611
Đây là định nghĩa của tôi về một nút cho a\n

12999
12:34:41,612 --> 12:34:44,491
từ những gì tôi đã đề xuất trên\nbảng cách đây một lúc.

13000
12:34:44,491 --> 12:34:47,191
Dưới đây là 2 nguyên mẫu cho\n2 hàm mà tôi sẽ

13001
12:34:47,192 --> 12:34:49,262
cho bạn xem trong giây lát,\nđiều đó cho phép tôi giải phóng

13002
12:34:49,262 --> 12:34:52,652
toàn bộ cây, mỗi lần một nút.

13003
12:34:52,652 --> 12:34:55,382
Và sau đó cũng cho phép tôi\nin cây theo thứ tự.

13004
12:34:55,381 --> 12:34:57,781
Vì vậy, mặc dù chúng\nkhông được sắp xếp từ trái sang phải

13005
12:34:57,781 --> 12:35:00,932
Tôi cá là nếu tôi thông minh\ntôi in con nào đầu tiên

13006
12:35:00,932 --> 12:35:04,152
Tôi có thể xây dựng lại ý tưởng\nin cây này một cách chính xác.

13007
12:35:04,152 --> 12:35:06,632
Vậy làm cách nào tôi có thể triển khai cây tìm kiếm nhị phân\na?

13008
12:35:07,921 --> 12:35:10,502
Đây là cách tôi có thể\nbiểu diễn một cây có kích thước 0.

13009
12:35:10,502 --> 12:35:13,442
Nó chỉ là một con trỏ null có tên là cây.

13010
12:35:13,442 --> 12:35:15,542
Đây là cách tôi có thể thêm\na số vào danh sách đó.

13011
12:35:15,542 --> 12:35:19,561
Vì vậy, ví dụ ở đây, tôi\nsẽ phân bổ không gian cho một nút.

13012
12:35:19,561 --> 12:35:21,691
Lưu trữ nó trong một biến\n tạm thời có tên là n.

13013
12:35:21,692 --> 12:35:23,552
Đây là tôi chỉ đang kiểm tra an toàn.

13014
12:35:23,552 --> 12:35:25,262
Đảm bảo n không bằng null.

13015
12:35:25,262 --> 12:35:29,612
Và sau đó, đây là tôi đang khởi tạo cái này\n

13016
12:35:29,612 --> 12:35:32,342
Sau đó, khởi tạo left\nchild của nút đó thành null.

13017
12:35:32,341 --> 12:35:34,991
Và nút con bên phải của\nnút null đó là null.

13018
12:35:34,991 --> 12:35:40,152
Và sau đó, khởi tạo cây\n

13019
12:35:40,152 --> 12:35:43,322
Vì vậy, tại thời điểm này trong câu chuyện, có\n

13020
12:35:43,322 --> 12:35:46,222
chứa số\n2 không có con.

13021
12:35:46,722 --> 12:35:49,112
Hãy thêm thủ công\nvào phần này thêm một chút nữa.

13022
12:35:49,112 --> 12:35:52,262
Hãy thêm một số khác vào\ndanh sách bằng cách sắp xếp một nút khác.

13023
12:35:52,262 --> 12:35:55,622
Tôi không cần khai báo n là nút*\n

13024
12:35:56,262 --> 12:35:58,202
Đây là một kiểm tra an toàn nhỏ.

13025
12:35:58,201 --> 12:36:02,761
Tôi sẽ không bận tâm đến việc của tôi,\n

13026
12:36:07,285 --> 12:36:09,452
Chúng tôi cũng muốn có một bộ nhớ trống,\nđiều mà tôi chưa làm ở đây

13027
12:36:09,451 --> 12:36:11,131
nhưng tôi sẽ để dành điều đó cho lúc khác.

13028
12:36:11,131 --> 12:36:13,471
Ở đây, tôi sẽ\khởi tạo số thành 1.

13029
12:36:13,472 --> 12:36:17,582
Tôi sẽ khởi tạo các phần tử con\n

13030
12:36:17,582 --> 12:36:19,292
Và bây giờ, tôi sẽ làm điều này.

13031
12:36:19,292 --> 12:36:23,762
Khởi tạo\ncon trái của cây là n.

13032
12:36:23,762 --> 12:36:26,704
Vì vậy, điều cơ bản\nlàm ở đây là nếu điều này

13033
12:36:26,703 --> 12:36:29,911
là nút gốc của tôi, hình chữ nhật đơn\n

13034
12:36:29,911 --> 12:36:32,011
không có con, không trái cũng không phải.

13035
12:36:32,012 --> 12:36:33,961
Đây là nút mới của tôi với số 1.

13036
12:36:33,961 --> 12:36:36,101
Tôi muốn nó trở thành đứa trẻ bên trái mới.

13037
12:36:36,101 --> 12:36:39,631
Vậy dòng mã trên\nmàn hình ở đó, cây bên trái bằng n

13038
12:36:39,631 --> 12:36:44,201
giống như ghép 2 cái này lại với nhau\n

13039
12:36:44,701 --> 12:36:47,581
Những dòng mã tiếp theo,\nbạn có thể đoán được

13040
12:36:47,582 --> 12:36:50,042
có phải tôi đang thêm\nsố khác vào danh sách không.

13041
12:36:51,211 --> 12:36:56,682
Vì vậy, đây là một cây đơn giản hơn với\n2, 1 và 3 tương ứng.

13042
12:36:56,682 --> 12:36:59,192
Và mã này, hãy để tôi vẫy\ntay, gần như giống nhau.

13043
12:36:59,192 --> 12:37:02,492
Ngoại trừ việc tôi\nupdate con bên phải của cây

13044
12:37:02,491 --> 12:37:04,472
là nút mới và thứ ba này.

13045
12:37:04,472 --> 12:37:07,862
Bây giờ chúng ta hãy chạy mã trước\nxem 2 hàm đó.

13046
12:37:12,991 --> 12:37:16,411
Vì vậy, nó có vẻ giống như cấu trúc dữ liệu\n

13047
12:37:16,411 --> 12:37:18,181
Nhưng thực sự tôi đã in cái này như thế nào?

13048
12:37:18,182 --> 12:37:20,072
Và cuối cùng,\ngiải phóng toàn bộ?

13049
12:37:20,072 --> 12:37:23,461
Hãy xem\nđịnh nghĩa của cây in đầu tiên.

13050
12:37:23,461 --> 12:37:26,432
Và đây là lúc\nmọi thứ trở nên thú vị.

13051
12:37:26,432 --> 12:37:30,271
Cây in không trả về gì\nvì vậy đó là hàm void.

13052
12:37:30,271 --> 12:37:36,002
Nhưng nó cần một con trỏ tới phần tử gốc\n

13053
12:37:37,171 --> 12:37:39,271
Nếu gốc bằng\nnull thì rõ ràng là có

13054
12:37:39,271 --> 12:37:40,591
không có gì để in, chỉ cần quay lại.

13055
12:37:42,451 --> 12:37:44,491
Nhưng đây chính là lúc mọi thứ có một chút kỳ diệu.

13056
12:37:44,491 --> 12:37:47,761
Nếu không, in con trái của bạn.

13057
12:37:50,491 --> 12:37:53,911
Sau đó, in đúng đứa con của bạn.

13058
12:37:53,911 --> 12:37:59,181
Đây là ví dụ về cái gì, thậm chí\n

13059
12:37:59,182 --> 12:38:00,802
Kỹ thuật lập trình gì ở đây?

13060
12:38:02,398 --> 12:38:05,853
Vì vậy, đây thực sự có lẽ là điều tốt nhất\n

13061
12:38:05,853 --> 12:38:08,061
Nó không thực sự hấp dẫn lắm\nvới trò Mario

13062
12:38:08,061 --> 12:38:10,191
bởi vì chúng tôi đã có một\nithực hiện dễ dàng như vậy với vòng lặp for

13063
12:38:11,031 --> 12:38:15,652
Nhưng đây là một ứng dụng hoàn hảo của\n

13064
12:38:17,391 --> 12:38:19,701
Nếu bạn chụp bất kỳ ảnh\ncủa bất kỳ nhánh nào, tất cả đều

13065
12:38:19,701 --> 12:38:22,072
trông vẫn giống một cái cây,\nchỉ là một cái cây nhỏ hơn.

13066
12:38:22,072 --> 12:38:23,911
Điều đó có lợi cho sự đệ quy.

13067
12:38:23,911 --> 12:38:28,491
Vì vậy đây là bước nhảy vọt của niềm tin nơi tôi\n

13068
12:38:28,491 --> 12:38:31,311
cây, nếu bạn muốn, qua\ncon tôi ở bên trái.

13069
12:38:31,311 --> 12:38:34,612
Sau đó, tôi sẽ in nút gốc\ncủa riêng mình ở giữa.

13070
12:38:34,612 --> 12:38:37,222
Sau đó, hãy tiếp tục\nin cây con bên phải của tôi.

13071
12:38:37,222 --> 12:38:41,662
Và bởi vì chúng ta có trường hợp cơ bản này\n

13072
12:38:41,661 --> 12:38:44,448
không cần phải làm gì cả, bạn\nsẽ không tái diễn mãi mãi.

13073
12:38:44,449 --> 12:38:47,031
Bạn sẽ không tự gọi mình\n lần nữa, lần nữa, lần nữa

13074
12:38:48,692 --> 12:38:52,882
Vì vậy, nó hoạt động và in\nsố 1, số 2 và số 3.

13075
12:38:52,881 --> 12:38:54,322
Và hãy để ý xem chúng ta có thể làm gì.

13076
12:38:54,322 --> 12:38:57,741
Nếu bạn muốn in cây vào\n

13077
12:38:57,741 --> 12:39:00,531
In cây bên phải của bạn\ntrước tiên, phần tử lớn hơn.

13078
12:39:01,432 --> 12:39:02,811
Sau đó, cây con nhỏ hơn của bạn.

13079
12:39:02,811 --> 12:39:05,451
Và nếu tôi tạo cây\nhere và ./tree, thì bây giờ

13080
12:39:05,451 --> 12:39:07,581
Tôi đã đảo ngược thứ tự của danh sách.

13081
12:39:08,671 --> 12:39:10,421
Bạn có thể làm điều đó với một\nfor-loop trong một mảng.

13082
12:39:10,421 --> 12:39:13,851
Nhưng bạn cũng có thể làm điều đó, ngay cả với\ncấu trúc 2 chiều này.

13083
12:39:13,851 --> 12:39:17,661
Cuối cùng chúng ta hãy xem\nhàm cây miễn phí này.

13084
12:39:17,661 --> 12:39:19,641
Và cái này gần như giống nhau.

13085
12:39:19,641 --> 12:39:22,881
Thứ tự không quan trọng lắm\n

13086
12:39:22,881 --> 12:39:24,502
Đây là những gì tôi đã làm với cây miễn phí.

13087
12:39:24,502 --> 12:39:27,459
Chà, nếu gốc của cây là\n

13088
12:39:28,042 --> 12:39:32,582
Nếu không, hãy tiếp tục và giải phóng\n của bạn

13089
12:39:32,582 --> 12:39:35,572
Sau đó hãy giải phóng đứa con bên phải của bạn\nvà tất cả con cháu của nó.

13090
12:39:37,381 --> 12:39:43,171
Và một lần nữa, miễn phí theo đúng nghĩa đen\n

13091
12:39:43,171 --> 12:39:45,051
Nó không giải phóng toàn bộ thứ chết tiệt đó.

13092
12:39:45,052 --> 12:39:47,332
Nó chỉ giải phóng theo đúng nghĩa đen\nnhững gì ở địa chỉ đó.

13093
12:39:47,332 --> 12:39:51,382
Tuy nhiên, tại sao việc\ntôi viết dòng 72 cuối cùng lại quan trọng?

13094
12:39:51,381 --> 12:39:53,932
Tại sao tôi lại giải phóng con trái\ncon phải

13095
12:39:53,932 --> 12:39:57,455
trước khi tôi tự giải thoát mình, có thể nói như vậy?

13096
12:39:59,163 --> 12:40:03,621
Nếu bạn tự giải thoát mình trước, nếu tôi có\n

13097
12:40:03,622 --> 12:40:08,302
bạn không được phép chạm vào bên trái\n

13098
12:40:08,302 --> 12:40:10,832
Bởi vì địa chỉ bộ nhớ\nkhông còn hiệu lực vào thời điểm đó.

13099
12:40:10,832 --> 12:40:12,772
Có lẽ bạn sẽ gặp một số\nlỗi bộ nhớ nào đó.

13100
12:40:13,792 --> 12:40:15,472
Valgrind chắc chắn sẽ không thích nó.

13101
12:40:15,472 --> 12:40:17,542
Nếu không thì những điều tồi tệ sẽ xảy ra.

13102
12:40:17,542 --> 12:40:19,372
Nhưng đây là một\nví dụ về đệ quy.

13103
12:40:19,372 --> 12:40:23,842
Và một lần nữa, chỉ là cách sử dụng đệ quy của cấu trúc dữ liệu thực tế.

13104
12:40:23,841 --> 12:40:26,601
Và điều thậm chí còn thú vị hơn ở đây\nis, nói một cách tương đối

13105
12:40:26,601 --> 12:40:29,121
giả sử chúng tôi muốn\ntìm kiếm thứ gì đó như thế này.

13106
12:40:29,122 --> 12:40:33,202
Tìm kiếm nhị phân thực sự trở nên khá đẹp\n

13107
12:40:33,891 --> 12:40:38,421
đây có thể là nguyên mẫu cho tìm kiếm\n

13108
12:40:38,421 --> 12:40:43,402
Bạn đưa cho tôi cái rễ của một cái cây, và\n

13109
12:40:43,402 --> 12:40:47,362
và bây giờ tôi có thể dễ dàng trả về true\n

13110
12:40:47,932 --> 12:40:49,912
Vâng, trước tiên chúng ta hãy đặt một câu hỏi.

13111
12:40:49,911 --> 12:40:52,876
Nếu cây bằng null,\nthì bạn chỉ cần trả về sai.

13112
12:40:52,877 --> 12:40:56,002
Vì không có cây thì không có\n

13113
12:40:57,341 --> 12:41:04,041
Ngược lại, số bạn đang tìm kiếm\n

13114
12:41:04,042 --> 12:41:06,052
chúng ta nên đi hướng nào?

13115
12:41:08,671 --> 12:41:11,781
Nào, hãy trả lại\ncâu trả lời cho câu hỏi này.

13116
12:41:11,781 --> 12:41:15,921
Tìm kiếm cây con bên trái,\ntheo con trái của tôi

13117
12:41:15,921 --> 12:41:17,451
tìm kiếm cùng một số.

13118
12:41:17,451 --> 12:41:19,731
Và bạn chỉ cần thừa nhận\nvẻ đẹp của đệ quy

13119
12:41:19,732 --> 12:41:22,882
rằng bạn đang cố gắng hết sức\nvà hãy để bản thân tìm ra điều đó

13120
12:41:24,082 --> 12:41:26,542
Thay vào đó chỉ là cái cây bên trái bị chặt đi.

13121
12:41:26,542 --> 12:41:30,802
Ngược lại, số bạn đang tìm kiếm\n

13122
12:41:30,802 --> 12:41:32,641
đi sang bên phải, như bạn có thể suy ra.

13123
12:41:32,641 --> 12:41:35,542
Vì vậy tôi chỉ có thể trả lời\ncâu trả lời cho câu hỏi này.

13124
12:41:35,542 --> 12:41:38,631
Tìm kiếm cây con bên phải của tôi\nvới cùng số đó.

13125
12:41:38,631 --> 12:41:40,502
Và có điều kiện thứ tư\nvà cuối cùng.

13126
12:41:40,502 --> 12:41:43,732
Kịch bản thứ tư mà chúng ta phải xem xét một cách rõ ràng là gì?

13127
12:41:45,262 --> 12:41:47,304
LOA 1: Nếu chính con số đó ở ngay đó.

13128
12:41:47,303 --> 12:41:50,961
Vì vậy, nếu không, con số tôi đang tìm\n

13129
12:41:50,961 --> 12:41:53,731
khi đó và chỉ khi đó,\nbạn mới có thể trả về true.

13130
12:41:53,732 --> 12:41:55,972
Và nếu bạn đang suy nghĩ\nnhanh chóng ở đây, có

13131
12:41:55,972 --> 12:41:59,632
có thể tối ưu hóa,\ncơ hội thiết kế tốt hơn.

13132
12:41:59,631 --> 12:42:01,131
Nghĩ lại ngay cả những ngày đầu của chúng tôi.

13133
12:42:01,131 --> 12:42:03,252
Chúng ta có thể làm gì tốt hơn một chút ở đây?

13134
12:42:06,622 --> 12:42:09,164
Bởi vì nếu có một cách hợp lý\không có 4 điều có thể xảy ra

13135
12:42:09,163 --> 12:42:12,021
bạn đang lãng phí thời gian khi hỏi\na câu hỏi vô ích thứ tư.

13136
12:42:13,341 --> 12:42:16,981
Vì vậy, ở đây, còn nhiều hơn cả\nví dụ về Mario vài tuần trước

13137
12:42:16,982 --> 12:42:19,582
chỉ có sự sang trọng này\có lẽ là đệ quy.

13138
12:42:21,442 --> 12:42:25,432
Đây là mã cho tìm kiếm nhị phân\n trên cây tìm kiếm nhị phân.

13139
12:42:25,432 --> 12:42:27,502
Và do đó, đệ quy có xu hướng hoạt động theo từng bước

13140
12:42:27,502 --> 12:42:32,182
với những loại cấu trúc dữ liệu này\n

13141
12:42:34,161 --> 12:42:39,841
Nếu có bất kỳ câu hỏi nào về tìm kiếm nhị phân\n

13142
12:42:40,709 --> 12:42:42,656
ĐỐI TƯỢNG: Khoảng như năm thứ ba.

13143
12:42:48,211 --> 12:42:54,171
Vì vậy, khi trả về giá trị Boolean, true\n

13144
12:42:54,171 --> 12:42:57,832
trong thư viện có tên Standard\nBool, S-T-D-B-O-O-L dot H.

13145
12:42:57,832 --> 12:42:59,961
Với một tệp tiêu đề mà bạn có thể sử dụng.

13146
12:42:59,961 --> 12:43:06,739
Trường hợp đó là sự thật,\n

13147
12:43:06,739 --> 12:43:08,031
Nhưng họ thực sự sẽ lập bản đồ, vâng.

13148
12:43:09,442 --> 12:43:11,872
Nhưng bạn không nên so sánh chúng một cách rõ ràng với 0 và 1.

13149
12:43:11,872 --> 12:43:14,872
Khi bạn sử dụng đúng và sai, bạn\n

13150
12:43:14,872 --> 12:43:18,857
ĐỐI TƯỢNG: Ý tôi là nếu\nit nằm trong mã trả về.

13151
12:43:19,732 --> 12:43:23,332
Vì vậy, nếu tôi đang sử dụng mã của chính mình từ\gần hơn, một hàm tránh

13152
12:43:23,332 --> 12:43:25,762
quay trở lại là hoàn toàn ổn.

13153
12:43:25,762 --> 12:43:28,432
Bạn không thể trả lại\nthứ gì đó một cách rõ ràng.

13154
12:43:28,432 --> 12:43:30,201
Vậy return chỉ có nghĩa là vậy thôi.

13155
12:43:31,762 --> 12:43:33,632
Bạn không thực sự\ntrả lại một giá trị.

13156
12:43:33,631 --> 12:43:37,252
Vì vậy, đó là một cách\nrút ngắn quá trình thực thi.

13157
12:43:37,252 --> 12:43:39,531
Nếu bạn không thích điều đó\nvà một số người sẽ cau mày

13158
12:43:39,531 --> 12:43:44,241
khi có mã trả về từ hàm\n

13159
12:43:45,531 --> 12:43:49,222
Nếu gốc không bằng\nnull, hãy thực hiện tất cả những điều này.

13160
12:43:49,222 --> 12:43:51,502
Sau đó, thụt lề cả ba\n dòng này bên dưới.

13161
12:43:52,972 --> 12:43:54,772
Tôi tình cờ viết nó\ntheo cách khác

13162
12:43:54,771 --> 12:43:58,471
rằng rõ ràng có một trường hợp cơ bản\n

13163
12:43:58,472 --> 12:44:01,402
Trong khi đó, bây giờ, nó hoàn toàn chỉ dành cho chúng ta.

13164
12:44:03,771 --> 12:44:07,441
Vì vậy, hãy đặt câu hỏi như\ntrước về thời gian chạy của ứng dụng này.

13165
12:44:07,442 --> 12:44:09,412
Có vẻ như\ntìm kiếm nhị phân đã quay trở lại.

13166
12:44:09,411 --> 12:44:15,081
Và bây giờ chúng ta có thể làm mọi việc theo logarit\n

13167
12:44:15,082 --> 12:44:17,421
Đây có phải là cây tìm kiếm nhị phân không?

13168
12:44:19,141 --> 12:44:21,862
Và một lần nữa, cây tìm kiếm\nnhị phân là một cây

13169
12:44:21,862 --> 12:44:28,599
nơi gốc lớn hơn bên trái\n

13170
12:44:29,391 --> 12:44:30,862
Vậy là bạn đang gật đầu.

13171
12:44:33,502 --> 12:44:35,512
Đây là cây tìm kiếm nhị phân.

13172
12:44:35,512 --> 12:44:37,872
Đây có phải là cây tìm kiếm nhị phân không?

13173
12:44:40,341 --> 12:44:43,191
Hoặc có vẻ như tôi chỉ nghe thấy sự chậm trễ\nviệc thay đổi phiếu bầu của mình.

13174
12:44:43,192 --> 12:44:45,562
Vì vậy, đây là một trong những câu hỏi mẹo.

13175
12:44:45,561 --> 12:44:47,961
Đây là tìm kiếm nhị phân\ntree vì tôi chưa

13176
12:44:47,961 --> 12:44:50,872
đã vi phạm định nghĩa\ncủa những gì tôi đưa ra cho bạn, đúng không.

13177
12:44:50,872 --> 12:44:56,961
Có ví dụ nào về con bên trái\n

13178
12:44:56,961 --> 12:44:59,961
Hoặc có ví dụ nào về quyền\n

13179
12:44:59,961 --> 12:45:02,379
Đó chỉ là cách ngược lại\ncủa việc mô tả điều tương tự.

13180
12:45:02,379 --> 12:45:04,552
Không, đây là cây tìm kiếm nhị phân.

13181
12:45:04,552 --> 12:45:07,692
Thật không may, có vẻ như,\n

13182
12:45:09,381 --> 12:45:11,451
Nhưng bạn có thể tưởng tượng\nđiều này sẽ xảy ra, đúng không.

13183
12:45:11,451 --> 12:45:14,121
Giả sử tôi đã không còn\nchu đáo như trước

13184
12:45:14,122 --> 12:45:17,452
bằng cách chèn 2, rồi 1, rồi 3.

13185
12:45:17,451 --> 12:45:19,641
Mà cân bằng mọi thứ một cách độc đáo.

13186
12:45:19,641 --> 12:45:22,341
Thay vào đó, giả sử rằng vì\nnhững gì người dùng đang nhập vào

13187
12:45:22,341 --> 12:45:25,461
hoặc bất cứ điều gì bạn nghĩ ra trong\n của mình

13188
12:45:27,741 --> 12:45:30,331
Giống như bạn đã tạo ra\nvấn đề cho chính mình.

13189
12:45:30,332 --> 12:45:33,772
Bởi vì nếu chúng ta làm theo cùng một logic\n

13190
12:45:33,771 --> 12:45:38,511
đây là cách bạn có thể triển khai\n

13191
12:45:38,512 --> 12:45:42,232
nếu bạn cứ mù quáng tuân theo định nghĩa đó.

13192
12:45:42,232 --> 12:45:44,512
Ý tôi là, cái này\nđược thiết kế tốt hơn như thế nào?

13193
12:45:44,512 --> 12:45:46,972
Nếu chúng ta xoay toàn bộ xung quanh.

13194
12:45:48,351 --> 12:45:50,542
Và những loại cây đó thực ra có tên.

13195
12:45:50,542 --> 12:45:52,881
Có những cây được gọi là AVL\ntrees trong khoa học máy tính.

13196
12:45:52,881 --> 12:45:54,531
Có những cây\nđen đỏ-đen trong khoa học máy tính.

13197
12:45:54,531 --> 12:45:56,781
Ngoài ra còn có những loại\ncây khác

13198
12:45:56,781 --> 12:45:59,991
thêm một số logic để cho bạn biết\nkhi nào bạn phải xoay chuyển sự việc

13199
12:45:59,991 --> 12:46:03,720
và xoay nó rồi cắt bỏ\n

13200
12:46:03,720 --> 12:46:05,512
Nhưng một cây tìm kiếm nhị phân\n, trong chính nó

13201
12:46:05,512 --> 12:46:09,152
có thể nói như vậy không đảm bảo rằng nó\nsẽ được cân bằng.

13202
12:46:09,152 --> 12:46:11,722
Và vì vậy, nếu bạn xem xét\ntrường hợp xấu nhất

13203
12:46:11,722 --> 12:46:13,342
thậm chí sử dụng cây tìm kiếm nhị phân.

13204
12:46:13,341 --> 12:46:15,441
Nếu bạn không thông minh về\nmã bạn đang viết

13205
12:46:15,442 --> 12:46:17,662
và bạn chỉ mù quáng\nlàm theo định nghĩa này

13206
12:46:17,661 --> 12:46:21,771
bạn có thể vô tình tạo một\n

13207
12:46:21,771 --> 12:46:24,531
cây về cơ bản\ntrông giống như một danh sách liên kết.

13208
12:46:24,531 --> 12:46:26,991
Bởi vì bạn thậm chí không sử dụng\nbất kỳ đứa con nào còn lại.

13209
12:46:26,991 --> 12:46:30,231
Thật không may, câu trả lời theo nghĩa đen cho câu hỏi

13210
12:46:30,232 --> 12:46:32,962
đây là\nthời gian tìm kiếm đang diễn ra là bao lâu?

13211
12:46:34,881 --> 12:46:37,461
Nhưng sẽ không như vậy nếu bạn không duy trì\nsự cân bằng của cây.

13212
12:46:37,461 --> 12:46:42,771
Cả hai, trong một số tìm kiếm nhất định, thực sự có thể\n

13213
12:46:44,434 --> 12:46:46,641
Nếu bằng cách nào đó bạn không tính đến\nvào tài khoản và chúng tôi cũng không

13214
12:46:46,641 --> 12:46:48,201
sẽ làm mã cho điều đó ở đây.

13215
12:46:48,201 --> 12:46:51,621
Đó là thứ ở cấp độ cao hơn mà bạn\ncó thể khám phá sau này.

13216
12:46:51,622 --> 12:46:55,412
Nó có thể biến thành thứ gì đó\nmà bạn có thể không có ý định.

13217
12:46:55,411 --> 12:46:57,503
Và bây giờ chúng ta đang nói về 2 chiều

13218
12:46:57,504 --> 12:46:59,211
đó thực sự là trách nhiệm của người lập trình

13219
12:46:59,211 --> 12:47:01,972
để xem xét những loại tình huống trái ngược nào có thể xảy ra.

13220
12:47:01,972 --> 12:47:04,342
Nơi sự vật được chuyển hóa\nthành một cấu trúc

13221
12:47:04,341 --> 12:47:07,831
mà bạn thực sự không muốn nó chuyển sang.

13222
12:47:08,332 --> 12:47:09,842
Chúng tôi chỉ có một vài cấu trúc để đi.

13223
12:47:09,841 --> 12:47:11,421
Hãy tiếp tục và nghỉ ngơi thêm 5 phút nữa tại đây.

13224
12:47:11,421 --> 12:47:12,891
Khi chúng ta quay lại,\nchúng ta sẽ nói chuyện ở cấp độ này

13225
12:47:12,891 --> 12:47:14,512
về một số ứng dụng cuối cùng của điều này.

13226
12:47:19,341 --> 12:47:22,731
Và như đã hứa, chúng tôi sẽ hoạt động\nở cấp độ cao hơn này.

13227
12:47:22,732 --> 12:47:26,002
Nếu chúng ta coi đó là điều hiển nhiên, thậm chí\n

13228
12:47:26,002 --> 12:47:28,794
để chơi với những kỹ thuật này,\n

13229
12:47:30,262 --> 12:47:33,112
Cả trong một chiều\nvà thậm chí cả 2 chiều

13230
12:47:33,112 --> 12:47:35,451
để xây dựng những thứ như danh sách và cây cối.

13231
12:47:35,451 --> 12:47:37,461
Vậy nếu chúng ta có những khối xây dựng này.

13232
12:47:37,461 --> 12:47:40,161
Những thứ như mảng,\nand danh sách và cây

13233
12:47:40,161 --> 12:47:44,271
điều gì sẽ xảy ra nếu chúng ta bắt đầu hợp nhất\n

13234
12:47:44,271 --> 12:47:46,381
của nhiều cấu trúc dữ liệu?

13235
12:47:46,381 --> 12:47:49,841
Chúng ta có thể bắt đầu thưởng thức những thứ tốt nhất\n không

13236
12:47:49,841 --> 12:47:51,191
thứ gọi là bảng băm.

13237
12:47:51,192 --> 12:47:55,022
Vì vậy, bảng băm là một công cụ cấu trúc dữ liệu kiểu Thụy Sĩ

13238
12:47:55,021 --> 12:47:56,791
trong đó nó được sử dụng rất phổ biến.

13239
12:47:56,792 --> 12:48:01,482
Bởi vì nó cho phép bạn liên kết\nkhóa với giá trị, có thể nói như vậy.

13240
12:48:01,482 --> 12:48:06,542
Vì vậy, ví dụ, nó cho phép bạn\n

13241
12:48:08,552 --> 12:48:11,402
Hoặc bất cứ thứ gì mà bạn phải\n lấy thứ gì đó làm đầu vào

13242
12:48:11,402 --> 12:48:13,781
và lấy đầu ra một\nthông tin tương ứng.

13243
12:48:13,781 --> 12:48:16,692
Bảng băm thường là một\ncấu trúc dữ liệu được lựa chọn.

13244
12:48:16,692 --> 12:48:17,942
Và đây là những gì nó trông như thế này.

13245
12:48:17,942 --> 12:48:20,281
Thoạt nhìn, nó thực sự trông giống như mảng\nan.

13246
12:48:20,281 --> 12:48:23,472
Nhưng để tiện thảo luận, tôi\nvẽ mảng này theo chiều dọc

13247
12:48:26,141 --> 12:48:31,201
Nhưng nó cho phép bạn, một bảng băm,\n

13248
12:48:32,222 --> 12:48:35,612
Vì vậy, ví dụ, thực sự có\n26 vị trí trong mảng này.

13249
12:48:35,612 --> 12:48:38,582
Vì tôi muốn, chẳng hạn, lưu trữ ban đầu

13250
12:48:38,582 --> 12:48:41,461
tên người chẳng hạn.

13251
12:48:41,461 --> 12:48:44,135
Và sẽ thật tuyệt nếu tên\nngười đó bắt đầu bằng chữ A

13252
12:48:44,135 --> 12:48:45,302
Tôi có một nơi để đi cho nó.

13253
12:48:46,262 --> 12:48:48,345
Và nếu nó bắt đầu bằng Z,\ntôi đặt chúng ở dưới cùng.

13254
12:48:48,345 --> 12:48:50,552
Để tôi có thể nhảy\nhanh chóng, một cách số học

13255
12:48:50,552 --> 12:48:52,952
sử dụng một chút\nAscii hoặc Unicode

13256
12:48:52,951 --> 12:48:56,021
chính xác đến địa điểm\nhọ muốn đến.

13257
12:48:56,021 --> 12:48:58,171
Vì vậy, ví dụ, đây là chỉ mục\nour mảng 0.

13258
12:48:59,612 --> 12:49:01,982
Tuy nhiên, nếu tôi nghĩ về điều này từ A đến Z

13259
12:49:01,982 --> 12:49:03,852
Tôi sẽ nghĩ đến\n26 địa điểm này

13260
12:49:03,851 --> 12:49:07,112
bây giờ trong ngữ cảnh của bảng băm,\n

13261
12:49:07,112 --> 12:49:09,491
Vì vậy, các nhóm\nbạn có thể đặt giá trị vào đó.

13262
12:49:09,491 --> 12:49:13,862
Vì vậy, ví dụ, giả sử rằng chúng ta\n

13263
12:49:15,072 --> 12:49:16,741
Và cái tên đó là Albus.

13264
12:49:16,741 --> 12:49:21,461
Vậy Albus bắt đầu bằng A. Albus có thể\n

13265
12:49:21,961 --> 12:49:23,669
Và sau đó, chúng tôi muốn\chèn một tên khác.

13266
12:49:23,669 --> 12:49:25,112
Người này tình cờ là Zacharias.

13267
12:49:25,112 --> 12:49:28,171
Bắt đầu từ Z nên nó sẽ đi hết\nđến cuối dữ liệu này

13268
12:49:28,171 --> 12:49:29,972
cấu trúc ở vị trí 25 a.k.a.

13269
12:49:30,872 --> 12:49:34,742
Và sau đó, có thể là một cái tên thứ ba như\n

13270
12:49:34,741 --> 12:49:36,792
theo\nvị trí đó trong bảng chữ cái.

13271
12:49:36,792 --> 12:49:39,542
Vậy điều này thật tuyệt vời vì\nin thời gian không đổi

13272
12:49:39,542 --> 12:49:43,502
Tôi có thể chèn và ngược lại\ntìm kiếm bất kỳ tên nào trong số này

13273
12:49:43,502 --> 12:49:45,182
dựa trên chữ cái đầu tiên của tên họ.

13274
12:49:45,182 --> 12:49:47,580
A, hoặc Z, hoặc H, trong trường hợp này.

13275
12:49:47,580 --> 12:49:50,372
Hãy tua nhanh về phía trước và cho rằng chúng ta\n

13276
12:49:50,372 --> 12:49:52,382
có thể trông quen thuộc\ntrong bảng băm này.

13277
12:49:52,381 --> 12:49:56,591
Thật tuyệt vời vì mỗi\ntên đều có vị trí riêng.

13278
12:49:56,591 --> 12:50:00,961
Nhưng nếu bạn đang nghĩ về những cái tên\n

13279
12:50:00,961 --> 12:50:03,192
cuối cùng chúng ta cũng gặp phải\nvấn đề với điều này, phải không.

13280
12:50:03,192 --> 12:50:06,961
Khi nào có thể xảy ra sự cố\nsử dụng bảng băm như thế này

13281
12:50:06,961 --> 12:50:09,572
nếu chúng ta muốn chèn thêm tên nữa?

13282
12:50:09,572 --> 12:50:11,771
Rốt cuộc chuyện gì sẽ xảy ra?

13283
12:50:12,271 --> 12:50:14,479
Đã có người có\nchữ cái đầu tiên rồi phải không.

13284
12:50:14,480 --> 12:50:17,342
Giống như tôi thậm chí còn chưa đề cập đến\nHarry chẳng hạn, hay bác Hagrid.

13285
12:50:17,341 --> 12:50:19,231
Chưa hết, Hermione đã sử dụng vị trí đó rồi.

13286
12:50:19,232 --> 12:50:21,512
Vì vậy, điều đó dẫn đến\ncâu hỏi, chuyện gì xảy ra?

13287
12:50:21,512 --> 12:50:25,082
Có lẽ, nếu chúng ta muốn chèn Harry\n

13288
12:50:26,192 --> 12:50:28,805
Nhưng nếu có một vị trí\nI, chúng ta sẽ đặt chúng ở đâu?

13289
12:50:28,805 --> 12:50:31,472
Và có cảm giác như tình hình\ncó thể diễn biến rất nhanh chóng.

13290
12:50:31,472 --> 12:50:34,412
Nhưng tôi đã cố tình\nvẽ cấu trúc dữ liệu này

13291
12:50:34,411 --> 12:50:37,471
mà tôi xác nhận là bảng băm\ntable, theo 2 hướng.

13292
12:50:39,601 --> 12:50:42,781
Nhưng điều này có thể gợi ý điều gì\nTôi đang sử dụng theo chiều ngang

13293
12:50:42,781 --> 12:50:45,781
mặc dù tôi đang vẽ hình chữ nhật\n

13294
12:50:47,239 --> 12:50:48,572
Có lẽ một mảng khác, công bằng mà nói.

13295
12:50:48,572 --> 12:50:51,739
Nhưng thành thật mà nói, mảng thực sự là một vấn đề\n

13296
12:50:52,292 --> 12:50:56,082
Nếu bạn muốn, chúng trông giống như phần mở đầu của một danh sách liên kết.

13297
12:50:56,082 --> 12:50:59,671
Tên ở đâu là số\n

13298
12:50:59,671 --> 12:51:01,682
theo chiều ngang bây giờ chỉ\nđể thảo luận.

13299
12:51:01,682 --> 12:51:05,281
Và đây có vẻ là một con trỏ\nchưa trỏ đến đâu cả.

13300
12:51:05,281 --> 12:51:10,561
Nhưng có vẻ như mảng là 26\n

13301
12:51:11,402 --> 12:51:14,156
Một số trong số đó đang trỏ vào\nnút đầu tiên trong danh sách được liên kết.

13302
12:51:14,156 --> 12:51:16,531
Vì vậy, đó thực sự là những gì một bảng băm\ncó thể nghĩ đến trong đầu bạn.

13303
12:51:16,531 --> 12:51:21,309
Sự kết hợp của một mảng, trong đó\các phần tử của nó là các danh sách được liên kết.

13304
12:51:21,309 --> 12:51:23,851
Và về lý thuyết, điều này mang lại cho bạn\nnhững điều tốt nhất của cả hai thế giới, đúng không.

13305
12:51:23,851 --> 12:51:26,911
Bạn có quyền truy cập ngẫu nhiên với\nxác suất cao, phải không.

13306
12:51:26,911 --> 12:51:30,101
Bạn có thể chuyển ngay tới\n

13307
12:51:30,101 --> 12:51:32,911
Tuy nhiên, nếu bạn gặp phải điều này\n

13308
12:51:34,351 --> 12:51:37,832
Nó bắt đầu phân cấp thành một\ndanh sách liên kết nhưng ít nhất phải là 26

13309
12:51:39,061 --> 12:51:42,151
Không phải một danh sách liên kết lớn\nmà sẽ là Big O của n.

13310
12:51:43,961 --> 12:51:46,112
Vì vậy, nếu Harry được đưa vào Hagrid.

13311
12:51:46,112 --> 12:51:50,262
Vâng, có thể nói, bạn phải xâu chuỗi chúng\nvới nhau theo cách này.

13312
12:51:50,262 --> 12:51:53,127
Nhưng ít nhất bạn cũng chưa\ntự dồn mình vào một góc.

13313
12:51:53,127 --> 12:51:56,252
Và trên thực tế, nếu chúng ta tua nhanh và\n

13314
12:51:56,252 --> 12:51:58,601
cấu trúc dữ liệu\nbắt đầu trông như thế này.

13315
12:51:58,601 --> 12:52:00,941
Vì vậy, chuỗi không quá dài.

13316
12:52:00,942 --> 12:52:03,752
Và một số trong số chúng thực sự\ncó kích thước 0 vì chỉ có

13317
12:52:03,752 --> 12:52:06,631
một số chữ cái không phổ biến của\nalphabet trong số những cái tên này.

13318
12:52:06,631 --> 12:52:08,581
Nhưng có vẻ tốt hơn là\nchỉ đưa mọi người vào

13319
12:52:08,582 --> 12:52:11,342
trong một mảng lớn hoặc\không có danh sách liên kết lớn nào.

13320
12:52:11,341 --> 12:52:15,671
Chúng tôi đang cố gắng cân bằng giao dịch này\n

13321
12:52:15,671 --> 12:52:17,891
Chà, làm thế nào chúng ta có thể trình bày\nđiều gì đó như thế này?

13322
12:52:17,891 --> 12:52:19,622
Đây là cách chúng ta có thể mô tả điều này.

13323
12:52:19,622 --> 12:52:22,802
Một nút trong ngữ cảnh của một\ndanh sách liên kết có thể là nút này.

13324
12:52:22,802 --> 12:52:26,342
Tôi có một mảng tên là\nword kiểu char.

13325
12:52:26,341 --> 12:52:30,541
Và nó đủ lớn để vừa với\n

13326
12:52:30,542 --> 12:52:32,372
Và cộng 1 tại sao, có lẽ vậy?

13327
12:52:33,241 --> 12:52:34,211
LOA 1: Ký tự null.

13328
12:52:34,211 --> 12:52:37,322
Vì vậy tôi cho rằng từ dài nhất đó\n

13329
12:52:37,951 --> 12:52:40,216
Và nó là con số lớn\nnhư 40, 100, sao cũng được.

13330
12:52:40,216 --> 12:52:43,291
Dù từ nào dài nhất\trong vũ trụ Harry Potter

13331
12:52:43,292 --> 12:52:45,921
is hoặc từ điển tiếng Anh is.

13332
12:52:45,921 --> 12:52:51,531
Từ dài nhất cộng thêm 1 là đủ\n

13333
12:52:51,531 --> 12:52:53,841
Và sau đó, mỗi nút này còn có gì nữa?

13334
12:52:53,841 --> 12:52:57,541
Vâng, nó có một con trỏ tới một nút khác.

13335
12:52:57,542 --> 12:52:59,872
Vì vậy đây là cách chúng ta có thể\nithực hiện khái niệm nút

13336
12:52:59,872 --> 12:53:04,192
trong bối cảnh lưu trữ\nkhông phải số nguyên mà là tên.

13337
12:53:05,841 --> 12:53:08,841
Nhưng làm thế nào để chúng ta quyết định\nbảng băm là gì?

13338
12:53:08,841 --> 12:53:12,621
Chà, nếu bây giờ chúng ta có định nghĩa về a\n

13339
12:53:12,622 --> 12:53:14,992
hoặc thậm chí trên toàn cầu, được gọi là bảng băm.

13340
12:53:14,991 --> 12:53:20,391
Bản thân nó là một con trỏ array\nof node*.

13341
12:53:20,391 --> 12:53:22,792
Đó là một mảng các con trỏ tới các nút.

13342
12:53:22,792 --> 12:53:24,772
Sự khởi đầu của danh sách liên kết

13343
12:53:26,432 --> 12:53:28,565
Tôi đã đề xuất bằng lời nói rằng đó là 26.

13344
12:53:28,565 --> 12:53:30,982
Nhưng thành thật mà nói, có thể nói rằng nếu bạn gặp nhiều\n va chạm.

13345
12:53:30,982 --> 12:53:33,105
Rất nhiều tên H đang cố gắng đi đến cùng một nơi.

13346
12:53:33,105 --> 12:53:35,272
Chà, có lẽ, chúng ta cần\nthông minh hơn và không chỉ nhìn

13347
12:53:35,271 --> 12:53:36,688
ở chữ cái đầu tiên của tên họ.

13348
12:53:36,688 --> 12:53:38,281
Nhưng, có lẽ, thứ nhất và thứ hai.

13349
12:53:38,281 --> 12:53:42,381
Vậy đó là H-A và H-E. Nhưng chờ đã, không,\n

13350
12:53:42,381 --> 12:53:45,322
Nhưng ít nhất chúng ta cũng bắt đầu giải quyết\nvấn đề ít hơn một chút

13351
12:53:45,322 --> 12:53:48,982
có tác động mạnh mẽ bằng cách mày mò\nthứ gì đó như số lượng thùng

13352
12:53:50,362 --> 12:53:55,042
Nhưng làm sao chúng ta có thể quyết định nơi ai đó\n

13353
12:53:55,042 --> 12:53:57,381
Chà, đó là một vấn đề cổ điển\nvề đầu vào và đầu ra.

13354
12:53:57,381 --> 12:54:00,741
Đầu vào của vấn đề sẽ\ngiống như tên.

13355
12:54:00,741 --> 12:54:02,781
Và thuật toán ở\nở giữa, tính đến ngày hôm nay

13356
12:54:02,781 --> 12:54:05,211
sẽ có một thứ\nđược gọi là hàm băm.

13357
12:54:05,211 --> 12:54:07,101
Hàm băm\nnói chung là thứ gì đó

13358
12:54:07,101 --> 12:54:10,851
lấy làm đầu vào, một chuỗi, một\nsố, bất cứ thứ gì và tạo ra

13359
12:54:10,851 --> 12:54:13,341
làm đầu ra một vị trí trong ngữ cảnh của chúng tôi.

13360
12:54:16,972 --> 12:54:19,671
Hoặc bất kể số\nnhóm bạn muốn là bao nhiêu

13361
12:54:19,671 --> 12:54:23,851
nó sẽ chỉ cho bạn biết nơi để\n

13362
12:54:23,851 --> 12:54:27,682
Vì vậy, ví dụ, Albus, theo\n

13363
12:54:30,052 --> 12:54:32,782
Vậy hàm băm, ở\ngiữa hộp đen đó

13364
12:54:32,781 --> 12:54:35,241
trong câu chuyện này khá đơn giản.

13365
12:54:35,241 --> 12:54:38,841
Nó chỉ đang nhìn vào Ascii\n

13366
12:54:39,591 --> 12:54:42,631
Và sau đó trừ đi số vốn A là 65.

13367
12:54:42,631 --> 12:54:46,951
Vì vậy, giống như làm một số phép toán để trả về số từ 0 đến 25.

13368
12:54:46,951 --> 12:54:50,091
Vậy đó là cách chúng ta đi đến\nđiểm này trong câu chuyện.

13369
12:54:50,091 --> 12:54:54,921
Và sau đó, làm cách nào chúng ta có thể giải quyết\nvấn đề sâu hơn và sử dụng

13370
12:54:54,921 --> 12:54:56,542
khái niệm băm này nói chung hơn?

13371
12:54:56,542 --> 12:54:58,417
Vâng, chỉ để minh họa\nvì lợi ích ở đây, đây là

13372
12:54:58,417 --> 12:55:00,772
thực sự là một số xô, theo nghĩa đen.

13373
12:55:00,771 --> 12:55:03,861
Và chúng tôi đã dán nhãn trước\nnhững chiếc xô chứa bộ quần áo này

13374
12:55:07,252 --> 12:55:12,082
Và chúng ta có kim cương ở đây.

13375
12:55:12,082 --> 12:55:15,592
Và chúng ta có, còn gì nữa ở đây?

13376
12:55:19,372 --> 12:55:22,074
Ví dụ: chúng ta có một bộ bài\nở đây, phải không.

13377
12:55:22,074 --> 12:55:24,531
Và đây là điều mà\nchính bạn có thể làm theo bản năng

13378
12:55:24,531 --> 12:55:26,902
nếu bạn chuẩn bị\nbắt đầu chơi trò chơi bài.

13379
12:55:26,902 --> 12:55:29,069
Bạn chỉ đang dọn dẹp hoặc\nbạn muốn mọi thứ ngăn nắp.

13380
12:55:29,069 --> 12:55:31,444
Giống như, đây đúng nghĩa là một bộ bài khổng lồ.

13381
12:55:31,444 --> 12:55:33,862
Cách dễ dàng nhất\nđể tôi sắp xếp những thứ này là gì?

13382
12:55:33,862 --> 12:55:36,569
Chà, chúng tôi có rất nhiều\n

13383
12:55:36,569 --> 12:55:39,112
Vì vậy, tôi có thể xem qua,\nđây là 3 viên kim cương.

13384
12:55:39,112 --> 12:55:41,362
Và tôi có thể, hãy để tôi\nném cái này lên màn hình.

13385
12:55:41,362 --> 12:55:43,052
Chỉ vậy thôi, nếu bạn ở xa phía sau.

13386
12:55:47,991 --> 12:55:49,612
Tôi có thể làm điều này theo thứ tự ở đây.

13387
12:55:49,612 --> 12:55:52,022
Nhưng thành thật mà nói, rất nhiều người trong chúng ta\nnếu được đưa cho một bộ bài.

13388
12:55:52,021 --> 12:55:54,771
Và bạn chỉ muốn dọn dẹp và sắp xếp nó theo thứ tự

13389
12:55:54,771 --> 12:55:56,101
bạn có thể làm những việc như thế này

13390
12:55:56,101 --> 12:55:59,512
Vâng, đây là thông tin đầu vào của tôi, 3 viên kim cương,\n

13391
12:56:03,122 --> 12:56:06,982
Và nếu bạn tiếp tục xem qua các thẻ,\n

13392
12:56:10,552 --> 12:56:12,502
Và nó vẫn\n đưa bạn đi 52 bước.

13393
12:56:12,502 --> 12:56:15,502
Nhưng cuối cùng, bạn đã băm tất cả các thẻ

13394
12:56:17,091 --> 12:56:19,971
Và bây giờ bạn gặp vấn đề\nvề kích thước 13,

13395
12:56:19,972 --> 12:56:23,512
dễ thực hiện hơn một chút so với việc giải quyết một bài toán lớn với 52 quân bài.

13396
12:56:23,512 --> 12:56:25,552
Bây giờ bạn có thể giải được 4, 13 bài toán về kích thước.

13397
12:56:25,552 --> 12:56:29,272
Và vì vậy băm là thứ thậm chí\n

13398
12:56:29,271 --> 12:56:34,161
Lấy đầu vào là một số thẻ, một số tên,\n

13399
12:56:34,161 --> 12:56:39,441
Có thể nói là một đống tạm thời mà bạn muốn sắp xếp mọi thứ.

13400
12:56:39,442 --> 12:56:41,924
Nhưng những va chạm này là không thể tránh khỏi.

13401
12:56:41,923 --> 12:56:44,631
Và thành thật mà nói, nếu chúng ta tiếp tục\n

13402
12:56:44,631 --> 12:56:47,432
một số chuỗi này sẽ\ndài hơn, ngày càng dài hơn.

13403
12:56:47,432 --> 12:56:50,811
Điều đó có nghĩa là thay vì\nhanh chóng gọi tên ai đó

13404
12:56:50,811 --> 12:56:53,659
bằng cách tìm kiếm chúng\cũng như không chèn chúng, có thể

13405
12:56:53,660 --> 12:56:55,202
bắt đầu dành một khoảng thời gian kha khá.

13406
12:56:55,201 --> 12:56:58,252
Vậy thay vào đó chúng ta có thể làm gì để\ngiải quyết những tình huống như thế này?

13407
12:56:58,252 --> 12:57:01,851
Nếu vấn đề về cơ bản là\n

13408
12:57:01,851 --> 12:57:04,868
phổ biến, H, chúng ta cần\n thu thập thêm thông tin đầu vào.

13409
12:57:04,868 --> 12:57:07,201
Không chỉ chữ cái đầu tiên mà\ncó thể là 2 chữ cái đầu tiên.

13410
12:57:07,201 --> 12:57:10,252
Vì vậy, nếu làm như vậy, chúng ta\ncó thể đi từ A đến Z

13411
12:57:10,252 --> 12:57:16,682
đến điều gì đó cực đoan hơn như có lẽ\n

13412
12:57:16,682 --> 12:57:20,152
Vì vậy bây giờ Harry và Hermione\nđến ở những địa điểm khác nhau.

13413
12:57:20,152 --> 12:57:23,072
Nhưng, chết tiệt, Hagrid\nvẫn va chạm với Harry.

13414
12:57:24,862 --> 12:57:27,031
Các chuỗi không dài lắm.

13415
12:57:27,031 --> 12:57:28,891
Nhưng vấn đề về cơ bản không biến mất.

13416
12:57:28,891 --> 12:57:32,122
Và trong trường hợp này ở đây, bất cứ ai\nbiết chúng ta vừa tạo ra bao nhiêu thùng

13417
12:57:32,122 --> 12:57:40,312
tăng lên, nếu bây giờ chúng ta nhìn vào không chỉ\n

13418
12:57:42,921 --> 12:57:46,461
Vậy câu trả lời dễ dàng cho\n26 bình phương là 676.

13419
12:57:46,461 --> 12:57:48,051
Vì vậy, đó là nhiều thùng hơn.

13420
12:57:48,052 --> 12:57:50,522
Và đây là lý do tại sao tôi chỉ hiển thị\một vài trong số chúng trên màn hình.

13421
12:57:51,411 --> 12:57:54,531
Và nó đặc biệt lan truyền mọi thứ.

13422
12:57:54,531 --> 12:57:56,121
Điều gì sẽ xảy ra nếu chúng ta tiến thêm một bước nữa?

13423
12:57:56,122 --> 12:58:01,612
Thay vì H-A, chúng tôi thích H-A-A,\n

13424
12:58:01,612 --> 12:58:03,561
Bây giờ, chúng ta có một tình huống thậm chí còn tốt hơn.

13425
12:58:03,561 --> 12:58:05,961
Bởi vì Hermoine có một vị trí duy nhất.

13426
12:58:09,322 --> 12:58:11,362
Nhưng có một sự đánh đổi ở đây.

13427
12:58:11,362 --> 12:58:14,722
Ưu điểm bây giờ là, về mặt số học,\nchúng ta có thể tìm thấy vị trí của chúng

13428
12:58:17,512 --> 12:58:21,422
Nhưng 3 là hằng số, dù có bao nhiêu\n

13429
12:58:21,421 --> 12:58:24,633
Nhưng nhược điểm ở đây là gì?

13430
12:58:27,771 --> 12:58:33,322
Hiện chúng tôi có tới 17.576 nhóm,\n

13431
12:58:33,322 --> 12:58:35,222
Máy tính ngày nay có rất nhiều\no bộ nhớ.

13432
12:58:35,222 --> 12:58:38,932
Nhưng như bạn có thể suy luận,\ntôi thực sự không thể nghĩ được

13433
12:58:38,932 --> 12:58:43,641
của một người có tên bắt đầu bằng\n

13434
12:58:44,313 --> 12:58:46,521
Và nếu chúng ta tiếp tục đi\nchắc chắn sẽ không biết ai

13435
12:58:46,521 --> 12:58:49,521
có tên bắt đầu bằng\nZ-Z-Z hoặc A-A-A. có

13436
12:58:49,521 --> 12:58:54,871
rất nhiều sự kết hợp không hữu ích\n

13437
12:58:54,872 --> 12:58:58,522
để bạn có thể làm một chút phép tính\n

13438
12:58:59,773 --> 12:59:01,231
Nhưng chúng sẽ trống rỗng.

13439
12:59:01,232 --> 12:59:04,862
Vì vậy, có thể nói đó là một mảng dân cư rất thưa thớt.

13440
12:59:04,862 --> 12:59:08,122
Vậy điều đó thực sự có ý nghĩa gì\nđối với hiệu suất?

13441
12:59:08,122 --> 12:59:10,882
Nào chúng ta hãy xem xét lại, trong\n

13442
12:59:10,881 --> 12:59:14,271
Hóa ra là một bảng băm\ntable, về mặt kỹ thuật mà nói

13443
12:59:14,271 --> 12:59:18,351
vẫn sẽ cho chúng ta\nBig O of n trong trường hợp xấu nhất.

13444
12:59:18,951 --> 12:59:21,921
Nếu bạn có một thói hư hỏng điên rồ nào đó\n

13445
12:59:21,921 --> 12:59:25,432
có tên bắt đầu bằng A hoặc\n

13446
12:59:25,432 --> 12:59:26,722
bạn thực sự không may mắn.

13447
12:59:26,722 --> 12:59:28,599
Và chuỗi của bạn rất dài.

13448
12:59:28,599 --> 12:59:30,682
Vậy thì tại thời điểm đó\nit chỉ là một danh sách được liên kết.

13449
12:59:31,599 --> 12:59:33,862
Nó giống như tình huống nghịch lý với cái cây, nơi

13450
12:59:33,862 --> 12:59:39,682
nếu bạn chèn nó mà không bận tâm\n

13451
12:59:39,682 --> 12:59:43,881
Nhưng ở đây có sự khác biệt\ngiữa hiệu suất lý thuyết

13452
12:59:45,502 --> 12:59:48,771
Nếu bạn nhìn lại\nbảng băm ở đây

13453
12:59:48,771 --> 12:59:55,371
điều này hoàn toàn, trên thực tế, sẽ diễn ra\n

13454
12:59:55,372 --> 12:59:58,342
Về mặt toán học, tiệm cận,\nký hiệu O lớn, chắc chắn rồi.

13455
13:00:00,112 --> 13:00:03,982
Nhưng nếu điều chúng ta thực sự quan tâm\n

13456
13:00:03,982 --> 13:00:06,472
có điều gì đó cần nói\nvề việc tạo cấu trúc dữ liệu.

13457
13:00:06,472 --> 13:00:09,052
Về mặt kỹ thuật, nếu dữ liệu này\nđược phân phối đồng đều

13458
13:00:09,052 --> 13:00:12,932
nhanh hơn 26 lần so với chỉ danh sách liên kết.

13459
13:00:12,932 --> 13:00:18,201
Và do đó, cũng có sự căng thẳng\ngiữa các hệ thống, các loại CS

13460
13:00:19,328 --> 13:00:21,411
Vâng, về mặt lý thuyết,\nnhững thứ này đều giống nhau.

13461
13:00:21,411 --> 13:00:24,141
Nhưng trên thực tế, để tạo ra phần mềm trong thế giới thực

13462
13:00:24,141 --> 13:00:29,872
cải thiện tốc độ này lên gấp 26\n

13463
13:00:29,872 --> 13:00:31,652
thực sự có thể tạo ra sự khác biệt lớn.

13464
13:00:31,652 --> 13:00:33,152
Nhưng sẽ có một sự đánh đổi.

13465
13:00:33,152 --> 13:00:37,022
Và đó thường là một số thứ khác\n

13466
13:00:37,521 --> 13:00:40,581
Thế còn một cấu trúc dữ liệu\nkhác mà chúng ta có thể xây dựng thì sao.

13467
13:00:40,582 --> 13:00:43,492
Hãy để tôi tua nhanh tới\nthứ ở đây được gọi là trie.

13468
13:00:43,491 --> 13:00:46,402
Vì vậy, một thử, một cái tên lạ lùng trong cách phát âm.

13469
13:00:46,402 --> 13:00:49,432
Viết tắt của từ retrieval,\nthường được phát âm là trie.

13470
13:00:49,432 --> 13:00:55,162
Trie là một cái cây thực sự giúp chúng ta tra cứu thời gian liên tục

13471
13:00:59,572 --> 13:01:04,711
Trong thế giới của trie, bạn\ntạo một cây từ các mảng.

13472
13:01:04,711 --> 13:01:07,042
Vậy là chúng ta đang thực sự tiến vào\nlãnh thổ Frankenstein

13473
13:01:07,042 --> 13:01:09,802
chỉ xây dựng mọi thứ với\ncác phần dự phòng của cấu trúc dữ liệu

13474
13:01:10,982 --> 13:01:13,942
Nhưng gốc của một trie\nis, chính nó, là một mảng.

13475
13:01:16,012 --> 13:01:22,281
Trong đó mỗi phần tử trong\ntrie đó trỏ đến một nút khác

13476
13:01:22,281 --> 13:01:23,991
nghĩa là một mảng khác.

13477
13:01:23,991 --> 13:01:26,961
Và mỗi vị trí trong\nmảng đó đại diện cho một chữ cái

13478
13:01:26,961 --> 13:01:28,402
của bảng chữ cái như từ A đến Z.

13479
13:01:28,402 --> 13:01:32,452
Ví dụ: nếu bạn muốn lưu trữ\n

13480
13:01:32,451 --> 13:01:36,531
không có trong bảng băm, không có trong liên kết\n

13481
13:01:36,531 --> 13:01:41,301
Những gì bạn sẽ làm là băm trên mọi\n

13482
13:01:42,122 --> 13:01:45,532
Vì vậy, theo một nghĩa nào đó, một trie giống như một bảng\nhash nhiều tầng.

13483
13:01:45,531 --> 13:01:47,252
Nơi bạn nhìn đầu tiên\na chữ cái đầu tiên

13484
13:01:47,252 --> 13:01:49,959
rồi chữ cái thứ hai, rồi\n

13485
13:01:49,959 --> 13:01:53,421
Ví dụ: mỗi vị trí\nnày đại diện cho một chữ cái A

13486
13:01:53,421 --> 13:01:56,932
thông qua Z. Giả sử tôi muốn\chèn tên ai đó vào đây

13487
13:01:56,932 --> 13:02:01,012
bắt đầu bằng chữ\nH, chẳng hạn như Hagrid.

13488
13:02:01,012 --> 13:02:03,842
Thôi tôi tới địa điểm\nH. Tôi thấy nó vô giá trị

13489
13:02:03,841 --> 13:02:06,921
điều đó có nghĩa là tôi cần phải tự mình malloc\n

13490
13:02:08,451 --> 13:02:12,291
Sau đó, giả sử tôi muốn lưu trữ\n

13491
13:02:12,292 --> 13:02:14,914
chữ A. Vì vậy tôi đi đến\nvị trí đó ở nút thứ hai.

13492
13:02:14,913 --> 13:02:16,371
Và tôi hiểu, OK, hiện tại nó không có giá trị.

13493
13:02:17,413 --> 13:02:19,921
Vì vậy, tôi phân bổ một nút khác\nsử dụng malloc hoặc tương tự.

13494
13:02:19,921 --> 13:02:24,171
Và bây giờ tôi có H-A-G. Và\ntôi tiếp tục việc này với R-I-D.

13495
13:02:24,171 --> 13:02:27,722
Và sau đó, khi tôi đọc đến\ncuối tên của người này

13496
13:02:27,722 --> 13:02:30,322
Tôi chỉ cần biểu thị\nở đây bằng màu sắc, nhưng có lẽ

13497
13:02:30,322 --> 13:02:31,762
với giá trị Boolean hoặc một cái gì đó.

13498
13:02:31,762 --> 13:02:35,672
Giống như một giá trị thực\ncho biết, một cái tên dừng ở đây.

13499
13:02:35,671 --> 13:02:41,222
Để có thể thấy rõ rằng người đó\n

13500
13:02:41,222 --> 13:02:45,752
hoặc H-A-G-R-I. Đó là H-A-G-R-I-D.\nVà chữ D có màu xanh lá cây

13501
13:02:45,752 --> 13:02:49,082
chỉ để cho biết có vẻ như có một số\n

13502
13:02:49,082 --> 13:02:52,781
Đây là nút\ntrong đó tên dừng lại.

13503
13:02:52,781 --> 13:02:57,722
Và nếu tôi tiếp tục logic này thì đây\n

13504
13:02:57,722 --> 13:03:00,902
Và đây là cách tôi có thể\chèn một người như Hermione vào.

13505
13:03:00,902 --> 13:03:05,491
Và điều thú vị về\n

13506
13:03:07,411 --> 13:03:10,471
Điều này bắt đầu trở nên hấp dẫn\nvì bạn đang sử dụng lại dung lượng.

13507
13:03:10,472 --> 13:03:15,391
Bạn đang sử dụng cùng một nút\ncho các tên như H-A-G và H-A-R

13508
13:03:15,391 --> 13:03:17,851
bởi vì họ có chung H và A.

13509
13:03:17,851 --> 13:03:20,112
Và tất cả đều có chung một chữ H.

13510
13:03:20,112 --> 13:03:23,822
Vậy là bạn có cấu trúc dữ liệu này\nbản thân nó là một cái cây.

13511
13:03:23,822 --> 13:03:27,572
Mỗi nút trong cây\nis, chính nó, một mảng.

13512
13:03:27,572 --> 13:03:31,171
Và do đó, chúng tôi có thể triển khai\n

13513
13:03:31,171 --> 13:03:36,676
Mỗi nút đều chứa,\ntôi sẽ thực hiện theo thứ tự ngược lại, một mảng.

13514
13:03:36,677 --> 13:03:39,302
Tôi sẽ gọi nó là trẻ em vì\nđó thực sự là những gì nó đại diện.

13515
13:03:39,302 --> 13:03:41,612
Tối đa 26 nút con cho\nmỗi nút này.

13516
13:03:42,911 --> 13:03:45,841
Vì vậy tôi có thể chỉ sử dụng hằng số\na cho số 26

13517
13:03:45,841 --> 13:03:47,881
để cho mình 26\nchữ cái trong bảng chữ cái.

13518
13:03:47,881 --> 13:03:52,112
Và mỗi mảng\nlưu trữ nhiều sao nút.

13519
13:03:52,112 --> 13:03:54,031
Nhiều con trỏ đến một nút khác.

13520
13:03:54,031 --> 13:03:55,502
Và đây là một ví dụ về Bool.

13521
13:03:55,502 --> 13:03:58,232
Đây là những gì tôi đã trình bày bằng\nmàu xanh lá cây trên trang trình bày cách đây một lúc.

13522
13:03:58,232 --> 13:04:00,062
Tôi cũng cần một phần dữ liệu khác.

13523
13:04:00,061 --> 13:04:03,002
Chỉ cần 0 hoặc 1, đúng\không sai, nghĩa là có.

13524
13:04:03,002 --> 13:04:08,292
Một tên dừng ở nút này hoặc chỉ là\n

13525
13:04:08,292 --> 13:04:12,572
Nhưng ưu điểm của việc này\nlà chiều cao của cái cây này

13526
13:04:12,572 --> 13:04:15,572
chỉ cao bằng tên dài nhất của người đó.

13527
13:04:15,572 --> 13:04:22,411
H-A-G-R-I-D hoặc H-E-R-M-O-I-N-E. Và\n

13528
13:04:22,411 --> 13:04:26,221
mọi người đều ở trong cấu trúc dữ liệu này,\nhiện tại có 3 người

13529
13:04:26,222 --> 13:04:30,632
nếu có 3 triệu thì sẽ\n

13530
13:04:31,982 --> 13:04:37,232
H-E-R-M-I-O-N-E. Vì vậy, tổng cộng có 8 bước.

13531
13:04:37,232 --> 13:04:42,062
Cho dù có 2 người khác,\n

13532
13:04:42,061 --> 13:04:46,141
Bởi vì con đường dẫn đến tên cô ấy luôn chung một con đường.

13533
13:04:46,141 --> 13:04:51,031
Và nếu bạn cho rằng có\n

13534
13:04:51,902 --> 13:04:53,991
Có lẽ là 40, 100, sao cũng được.

13535
13:04:53,991 --> 13:04:55,741
Dù cái tên\ndài nhất trên thế giới là gì đi nữa.

13536
13:04:56,641 --> 13:04:59,112
Có thể là 40, 100, nhưng đó là hằng số.

13537
13:04:59,112 --> 13:05:02,322
Điều đó có nghĩa là với một\ntrie, về mặt kỹ thuật mà nói

13538
13:05:02,322 --> 13:05:06,961
đó là trường hợp việc tra cứu của bạn\n

13539
13:05:09,002 --> 13:05:12,061
Đó là thời gian không đổi, bởi vì\nkhông giống như mọi cấu trúc dữ liệu khác

13540
13:05:12,061 --> 13:05:16,921
chúng tôi đã xem xét, với một lần thử, số tiền\n

13541
13:05:16,921 --> 13:05:20,402
hoặc chèn một người\nhoàn toàn độc lập vào cách

13542
13:05:20,402 --> 13:05:24,692
nhiều phần dữ liệu khác đã có sẵn trong cấu trúc dữ liệu.

13543
13:05:24,692 --> 13:05:27,452
Và điều này đúng ngay cả khi một\nname là tiền tố của một tên khác.

13544
13:05:27,451 --> 13:05:30,854
Tôi không nghĩ có Daniel hay\n

13545
13:05:31,771 --> 13:05:35,881
Nhưng D-A-N-I-E-L có thể là một cái tên.

13546
13:05:35,881 --> 13:05:38,470
Và do đó, chúng ta có\na true ở đó bằng màu xanh lá cây.

13547
13:05:38,470 --> 13:05:40,262
Và nếu có một cái tên dài hơn\nnhư Danielle.

13548
13:05:40,262 --> 13:05:42,242
Sau đó, bạn tiếp tục đi\ncho đến khi đến E.

13549
13:05:42,241 --> 13:05:45,031
Vì vậy bạn vẫn có thể có\na trie, một cái tên đó là

13550
13:05:45,031 --> 13:05:47,141
một chuỗi con của tên khác.

13551
13:05:47,141 --> 13:05:49,862
Vì vậy, không phải là chúng ta\nđã tạo ra vấn đề ở đó.

13552
13:05:49,862 --> 13:05:51,533
Điều đó cũng vẫn có thể xảy ra.

13553
13:05:51,533 --> 13:05:54,241
Nhưng vào cuối ngày, nó chỉ\n

13554
13:05:54,241 --> 13:05:55,891
để tìm bất kỳ ai trong số những người này.

13555
13:05:55,891 --> 13:05:58,802
Và một lần nữa, đó chính là điều\nđặc biệt hấp dẫn.

13556
13:05:58,802 --> 13:06:00,880
Rằng bạn có\ntra cứu thời gian liên tục một cách hiệu quả.

13557
13:06:01,921 --> 13:06:05,635
Chúng ta đã trải qua toàn bộ câu chuyện này\n

13558
13:06:05,635 --> 13:06:07,052
Và sau đó, nó tăng lên n bình phương.

13559
13:06:07,832 --> 13:06:12,912
Và bây giờ là thời gian không đổi, giá bao nhiêu\n

13560
13:06:19,021 --> 13:06:21,451
Và trên thực tế, các lần thử không được sử dụng thường xuyên

13561
13:06:21,451 --> 13:06:24,981
thật tuyệt vời vì chúng có thể nghe\không phải ở cấp độ CS nào đó ở đây.

13562
13:06:28,216 --> 13:06:30,379
ĐỐI TƯỢNG: Giống như [KHÔNG NGHE ĐƯỢC].

13563
13:06:31,171 --> 13:06:33,091
Nếu bạn đang lưu trữ tất cả\nnhững mảng chết tiệt này

13564
13:06:33,091 --> 13:06:36,351
một lần nữa, nó là một cấu trúc dữ liệu có dân số thưa thớt.

13565
13:06:37,351 --> 13:06:41,281
Đúng là chỉ có 3 tên, nhưng hầu hết\n

13566
13:06:42,972 --> 13:06:46,022
Vì vậy, đây là một cấu trúc\ndữ liệu cực kỳ rộng, nếu bạn muốn.

13567
13:06:46,021 --> 13:06:48,521
Nó sử dụng một lượng lớn\nbộ nhớ để lưu trữ tên.

13568
13:06:48,521 --> 13:06:50,341
Nhưng một lần nữa, bạn phải chọn một làn đường.

13569
13:06:50,341 --> 13:06:53,461
Hoặc bạn sẽ giảm thiểu không gian\n

13570
13:06:53,461 --> 13:06:56,722
Thực sự không thể đạt được\nđiều tốt nhất của cả hai thế giới.

13571
13:06:56,722 --> 13:06:58,772
Bạn phải quyết định\nđiểm uốn ở đâu

13572
13:06:58,771 --> 13:07:01,591
cho thiết bị bạn đang viết\n

13573
13:07:02,942 --> 13:07:06,461
Và một lần nữa, hãy tính đến tất cả những điều này.

13574
13:07:06,461 --> 13:07:08,881
Vì vậy, cuối cùng, chúng ta hãy thực hiện một\nsự trừu tượng hóa sâu hơn.

13575
13:07:08,881 --> 13:07:12,391
Vì vậy, thậm chí ở cấp độ cao hơn để thảo luận\nđiều gì đó thường

13576
13:07:12,391 --> 13:07:14,444
được gọi là cấu trúc dữ liệu trừu tượng.

13577
13:07:14,444 --> 13:07:16,152
Hoá ra chúng ta có thể\ntiêu xài cả ngày

13578
13:07:16,152 --> 13:07:17,732
cả tuần, nói về\nnhững điều khác nhau mà chúng tôi

13579
13:07:17,732 --> 13:07:19,182
có thể xây dựng với các cấu trúc dữ liệu này.

13580
13:07:19,182 --> 13:07:21,139
Nhưng phần lớn,\nbây giờ chúng ta có mảng.

13581
13:07:21,139 --> 13:07:23,911
Bây giờ chúng ta đã liên kết các danh sách\cũng như cây họ hàng của chúng,

13582
13:07:24,910 --> 13:07:26,702
Và hơn thế nữa, có\nđồ thị, trong đó

13583
13:07:26,701 --> 13:07:29,888
các mũi tên có thể đi thành nhiều\n

13584
13:07:29,889 --> 13:07:32,222
Bây giờ chúng ta có khả năng này\nkết nối mọi thứ lại với nhau

13585
13:07:32,222 --> 13:07:34,272
chúng ta có thể giải quyết mọi loại vấn đề khác nhau.

13586
13:07:34,271 --> 13:07:38,221
Vì vậy, ví dụ, một kiểu cấu trúc dữ liệu rất\nphổ biến

13587
13:07:38,222 --> 13:07:42,211
để sử dụng trong một chương trình, hoặc thậm chí\n của chúng tôi

13588
13:07:42,211 --> 13:07:46,262
Hàng đợi là một cấu trúc dữ liệu\ngiống như một hàng bên ngoài cửa hàng.

13589
13:07:46,262 --> 13:07:48,332
Nơi nó có cái được gọi là thuộc tính FIFO.

13590
13:07:49,722 --> 13:07:52,141
Điều này rất tốt cho sự công bằng,\nang ít nhất là trong thế giới loài người.

13591
13:07:52,141 --> 13:07:56,281
Và nếu bạn đã từng đợi bên ngoài\n

13592
13:07:56,281 --> 13:07:58,472
hoặc một nhà hàng nào đó\gần đó, có lẽ là vậy

13593
13:07:58,472 --> 13:08:01,262
nếu bạn đang xếp hàng ở\nquầy, bạn muốn

13594
13:08:01,262 --> 13:08:03,752
họ lưu trữ để duy trì hệ thống FIFO.

13595
13:08:05,012 --> 13:08:08,641
Để bất cứ ai xếp hàng đầu tiên sẽ nhận được\n

13596
13:08:08,641 --> 13:08:12,192
Vì vậy, hàng đợi thực sự cũng là một thuật ngữ khoa học máy tính.

13597
13:08:12,192 --> 13:08:14,942
Và ngay cả khi bạn vẫn ở trong\n

13598
13:08:14,942 --> 13:08:17,192
có những thứ bạn có thể\nđã từng nghe gọi là máy in

13599
13:08:17,192 --> 13:08:19,531
hàng đợi, cũng làm mọi việc theo thứ tự.

13600
13:08:19,531 --> 13:08:21,949
Người đầu tiên gửi\nbài luận của họ tới máy in

13601
13:08:21,949 --> 13:08:24,031
lý tưởng nhất là nên được in\ntrước người cuối cùng

13602
13:08:24,031 --> 13:08:26,402
để gửi bài luận của họ tới nhà in.

13603
13:08:26,402 --> 13:08:28,202
Một lần nữa, vì lợi ích của sự công bằng.

13604
13:08:28,201 --> 13:08:29,851
Nhưng làm cách nào bạn có thể triển khai hàng đợi?

13605
13:08:29,851 --> 13:08:32,731
Chà, bạn thường phải\thực hiện 2 thao tác cơ bản

13606
13:08:34,292 --> 13:08:37,391
Vì vậy, hãy thêm một cái gì đó vào nó và\nloại bỏ một cái gì đó khỏi nó.

13607
13:08:37,391 --> 13:08:41,131
Và điều thú vị ở đây là\n

13608
13:08:41,131 --> 13:08:44,131
Chà, trong thế giới con người, bạn sẽ\n

13609
13:08:44,131 --> 13:08:46,771
để con người xếp hàng từ trái\nsang phải hoặc từ phải sang trái.

13610
13:08:47,815 --> 13:08:50,732
Giống như hàng đợi máy in, nếu bạn gửi\n

13611
13:08:50,732 --> 13:08:52,832
cả đống bài luận\cũng như tài liệu, à, bạn

13612
13:08:52,832 --> 13:08:54,912
cần một đoạn bộ nhớ như một mảng.

13613
13:08:55,411 --> 13:08:57,631
Chà, nếu bạn sử dụng\narray thì có vấn đề gì

13614
13:08:57,631 --> 13:09:01,241
điều đó có thể xảy ra trong thế giới in ấn chẳng hạn?

13615
13:09:01,241 --> 13:09:04,502
Nếu bạn sử dụng một mảng để lưu trữ tất cả\n

13616
13:09:04,502 --> 13:09:05,660
KHÁN GIẢ: Nó có thể được lấp đầy.

13617
13:09:05,660 --> 13:09:07,202
GIỌNG 1: Nó có thể được lấp đầy, phải không.

13618
13:09:07,201 --> 13:09:10,502
Vì vậy, nếu lập trình viên quyết định, HP hoặc\n

13619
13:09:10,502 --> 13:09:14,162
ồ, bạn có thể gửi giá trị cỡ megabyte\n

13620
13:09:14,161 --> 13:09:16,211
Tại một thời điểm nào đó, bạn có thể\ng nhận được thông báo lỗi

13621
13:09:16,211 --> 13:09:17,582
có nội dung xin lỗi vì hết bộ nhớ.

13622
13:09:18,476 --> 13:09:20,851
Đó có thể là một giải pháp\nhợp lý nhưng hơi khó chịu.

13623
13:09:20,851 --> 13:09:24,481
Hoặc HP có thể viết mã có thể\ntự động thay đổi kích thước mảng

13624
13:09:25,152 --> 13:09:27,722
Nhưng tại thời điểm đó, có lẽ họ\nchỉ nên sử dụng danh sách liên kết.

13625
13:09:28,652 --> 13:09:32,372
Vì vậy, ở đó, bạn cũng có thể\nthực hiện khái niệm hàng đợi

13626
13:09:32,372 --> 13:09:33,720
thay vào đó bằng cách sử dụng danh sách liên kết.

13627
13:09:33,720 --> 13:09:35,762
Bạn sẽ sử dụng nhiều\nbộ nhớ hơn nhưng bạn thì không

13628
13:09:35,762 --> 13:09:38,132
sắp hết dung lượng trong mảng của bạn.

13629
13:09:38,131 --> 13:09:39,974
Điều đó có thể hấp dẫn hơn.

13630
13:09:39,974 --> 13:09:41,641
Điều này xảy ra ngay cả trong thế giới vật chất.

13631
13:09:41,641 --> 13:09:45,122
Bạn đi đến cửa hàng và bắt đầu mua\n

13632
13:09:45,122 --> 13:09:49,408
Và đối với một cửa hàng thực sự bận rộn,\n

13633
13:09:49,408 --> 13:09:51,991
Nhưng trong trường hợp đó, nó có xu hướng\ngiống một mảng hơn chỉ vì

13634
13:09:51,991 --> 13:09:54,447
của khái niệm vật lý\ncủa con người xếp hàng.

13635
13:09:54,447 --> 13:09:56,072
Nhưng cũng có những cấu trúc dữ liệu khác.

13636
13:09:56,072 --> 13:09:59,197
Nếu bạn đã từng đến phòng ăn\n

13637
13:09:59,197 --> 13:10:04,351
khay, bạn thường nhặt\n

13638
13:10:04,351 --> 13:10:06,211
không phải khay đầu tiên được làm sạch.

13639
13:10:06,722 --> 13:10:10,652
Bởi vì những khay đồ ăn này\nxếp chồng lên nhau.

13640
13:10:10,652 --> 13:10:13,891
Và thực sự, ngăn xếp là một\nkiểu cấu trúc dữ liệu trừu tượng khác.

13641
13:10:13,891 --> 13:10:16,351
Trong thế giới vật chất,\nnghĩa đen là thứ gì đó vật chất

13642
13:10:18,512 --> 13:10:21,422
Nó có cái mà chúng ta\ngọi là thuộc tính LIFO.

13643
13:10:22,942 --> 13:10:24,692
Vì thế khi những thứ này\n ra khỏi máy giặt

13644
13:10:24,692 --> 13:10:27,002
họ đang đặt những cái\mới nhất lên hàng đầu.

13645
13:10:27,002 --> 13:10:30,722
Và bạn, con người, có lẽ\n

13646
13:10:30,722 --> 13:10:33,182
Điều đó có nghĩa là\tiếp theo, không có ai trong khuôn viên trường

13647
13:10:33,182 --> 13:10:36,616
có thể sử dụng khay đầu tiên đó.

13648
13:10:36,616 --> 13:10:38,491
Điều này có lẽ ổn\trong thế giới của những chiếc khay

13649
13:10:38,491 --> 13:10:42,451
nhưng thực sự sẽ rất tệ trong thế giới\n

13650
13:10:42,451 --> 13:10:44,252
là tài sản đang được thực hiện.

13651
13:10:44,252 --> 13:10:46,322
Nhưng ở đây cũng có thể là một mảng.

13652
13:10:47,432 --> 13:10:49,014
Và thành thật mà nói, bạn thấy điều này hàng ngày.

13653
13:10:49,014 --> 13:10:51,241
Nếu bạn đang sử dụng Gmail\nvà hộp thư đến Gmail của mình.

13654
13:10:51,241 --> 13:10:53,761
Đó thực sự là một ngăn xếp,\nang ít nhất là theo mặc định

13655
13:10:53,762 --> 13:10:57,160
trong đó tin nhắn mới nhất\ncuối cùng của bạn là tin nhắn đầu tiên

13656
13:10:58,201 --> 13:11:00,061
Đó là cấu trúc dữ liệu LIFO.

13657
13:11:00,061 --> 13:11:02,191
Và điều đó có nghĩa là bạn nhìn thấy\nnhững email gần đây nhất của mình.

13658
13:11:02,192 --> 13:11:04,650
Nhưng nếu bạn có một ngày bận rộn,\nbạn sẽ nhận được rất nhiều email

13659
13:11:04,650 --> 13:11:05,912
nó có thể không phải là một điều tốt.

13660
13:11:05,911 --> 13:11:08,311
Bởi vì bây giờ bạn đang phớt lờ\nnhững người đã viết thư cho bạn

13661
13:11:08,311 --> 13:11:10,621
sớm hơn trong ngày hoặc trong tuần.

13662
13:11:10,622 --> 13:11:13,082
Vì vậy LIFO và FIFO\nchỉ là những thuộc tính mà bạn

13663
13:11:13,082 --> 13:11:15,842
có thể đạt được với những loại cấu trúc dữ liệu rất cụ thể này.

13664
13:11:15,841 --> 13:11:17,591
Và các nghị viện\trong thế giới của ngăn xếp

13665
13:11:17,591 --> 13:11:21,451
là đẩy thứ gì đó lên\nstack hoặc bật thứ gì đó ra.

13666
13:11:21,451 --> 13:11:23,641
Ví dụ: đây là một ví dụ về lý do tại sao

13667
13:11:23,641 --> 13:11:24,932
bạn có thể luôn mặc cùng một màu.

13668
13:11:24,932 --> 13:11:27,192
Chà, nếu bạn đang cất tất cả\n quần áo của mình vào một chồng

13669
13:11:27,192 --> 13:11:29,012
bạn có thể không bao giờ có được\nmàu sắc khác

13670
13:11:29,012 --> 13:11:30,452
quần áo ở cuối danh sách.

13671
13:11:30,451 --> 13:11:35,371
Và trên thực tế, để vẽ bức tranh này,\n

13672
13:11:35,372 --> 13:11:38,372
Chỉ để vẽ cái này ở đây, do một giảng viên ở nơi khác thực hiện.

13673
13:11:38,372 --> 13:11:41,312
Hãy tiếp tục và giảm độ sáng\nchỉ trong một hoặc 2 phút ở đây.

13674
13:11:41,311 --> 13:11:45,466
Để chúng ta có thể xem\nat Jack tìm hiểu một số sự thật.

13675
13:11:46,091 --> 13:11:48,841
GIỌNG 2: Ngày xửa ngày xưa,\ncó một chàng trai tên là Jack.

13676
13:11:48,841 --> 13:11:52,231
Về việc kết bạn\nJack không có sở trường.

13677
13:11:52,232 --> 13:11:55,202
Vì thế Jack đã đến nói chuyện với anh chàng nổi tiếng nhất mà anh ấy biết.

13678
13:11:55,201 --> 13:11:57,871
Anh ta tiến đến chỗ Lou và\n hỏi, tôi phải làm gì đây?

13679
13:11:57,872 --> 13:12:00,332
Lou thấy bạn mình đang thực sự đau khổ.

13680
13:12:00,332 --> 13:12:03,042
Chà, Lou bắt đầu,\nhãy nhìn cách bạn ăn mặc.

13681
13:12:03,042 --> 13:12:05,612
Bạn không có bộ quần áo nào\nvới kiểu dáng khác à?

13682
13:12:08,012 --> 13:12:10,202
Hãy đến nhà tôi\ntôi sẽ cho bạn xem.

13683
13:12:10,201 --> 13:12:11,491
Thế là họ rời khỏi Jack's.

13684
13:12:11,491 --> 13:12:15,182
Và Jack cho Lou xem chiếc hộp, nơi anh ấy\n

13685
13:12:16,232 --> 13:12:19,202
Lou nói, tôi thấy quần áo của bạn chất thành một đống.

13686
13:12:19,201 --> 13:12:21,781
Tại sao thỉnh thoảng bạn không mặc một vài thứ khác?

13687
13:12:21,781 --> 13:12:24,932
Jack nói, à, khi tôi cởi quần áo và tất

13688
13:12:24,932 --> 13:12:27,662
Tôi rửa sạch chúng và cất vào hộp.

13689
13:12:27,661 --> 13:12:30,151
Rồi đến\nsáng hôm sau tôi nhảy lên.

13690
13:12:30,152 --> 13:12:33,391
Tôi đi đến chỗ chiếc hộp và lấy\nquần áo của mình ra khỏi nóc.

13691
13:12:33,391 --> 13:12:36,002
Lou nhanh chóng nhận ra\nvấn đề xảy ra với Jack.

13692
13:12:36,002 --> 13:12:38,972
Anh ấy xếp quần áo, đĩa CD và sách thành một chồng.

13693
13:12:38,972 --> 13:12:41,402
Khi anh ấy với tay tìm\nthứ gì đó để đọc hoặc để mặc

13694
13:12:41,402 --> 13:12:44,012
anh ấy chọn một cuốn sách hoặc đồ lót hàng đầu.

13695
13:12:44,012 --> 13:12:46,402
Sau đó khi làm xong anh\nsẽ đặt nó lại ngay.

13696
13:12:46,402 --> 13:12:48,982
Trở lại nó sẽ đi lên trên cùng của ngăn xếp.

13697
13:12:48,982 --> 13:12:51,352
Tôi biết giải pháp,\nLou đắc thắng nói.

13698
13:12:51,351 --> 13:12:53,991
Bạn cần học cách\nbắt đầu sử dụng hàng đợi.

13699
13:12:53,991 --> 13:12:56,781
Lou lấy quần áo của Jack\n và treo vào tủ.

13700
13:12:56,781 --> 13:12:59,601
Và khi anh ta làm trống\ncái hộp, anh ta ném nó đi.

13701
13:12:59,601 --> 13:13:03,472
Rồi anh ấy nói, bây giờ là Jack, ở cuối\n

13702
13:13:04,951 --> 13:13:07,671
Rồi sáng mai\nkhi bạn nhìn thấy ánh nắng, hãy đón nhận

13703
13:13:07,671 --> 13:13:10,402
quần áo của bạn từ bên phải,\ntừ cuối hàng.

13704
13:13:10,402 --> 13:13:13,281
Bạn thấy không,\nLou nói, nó sẽ rất tuyệt.

13705
13:13:13,281 --> 13:13:16,612
Bạn sẽ mặc mọi thứ một lần\ntrước khi mặc thứ gì đó hai lần.

13706
13:13:16,612 --> 13:13:19,552
Và với mọi thứ đang xếp hàng\trong tủ và kệ của anh ấy

13707
13:13:19,552 --> 13:13:22,162
Jack bắt đầu cảm thấy\nkhá chắc chắn về bản thân.

13708
13:13:22,161 --> 13:13:24,636
Tất cả là nhờ Lou và\nhanh hàng đợi tuyệt vời này.

13709
13:13:26,701 --> 13:13:29,701
GIỌNG 1: Vậy chỉ để giúp bạn nhận ra\n

13710
13:13:33,862 --> 13:13:35,542
Nếu bạn đã từng xếp hàng ở nơi này.

13711
13:13:37,461 --> 13:13:40,281
Được rồi, thật xanh mát, có một chỗ salad nhỏ trong quảng trường.

13712
13:13:40,281 --> 13:13:42,171
Đây là nếu bạn đặt hàng\không trực tuyến hoặc trước

13713
13:13:42,171 --> 13:13:44,713
thức ăn của bạn kết thúc theo\nchữ cái đầu tiên trong tên của bạn.

13714
13:13:44,713 --> 13:13:46,963
Điều này thực sự nghe có vẻ khủng khiếp\ngợi nhớ đến điều gì đó

13715
13:13:47,781 --> 13:13:50,841
Và trên thực tế, dù\n

13716
13:13:50,841 --> 13:13:52,611
đã làm, với một mảng và danh sách liên kết.

13717
13:13:52,612 --> 13:13:54,817
Hoặc với 3 kệ như thế này.

13718
13:13:54,817 --> 13:13:57,802
Đây thực sự là một kiểu dữ liệu trừu tượng được gọi là từ điển.

13719
13:13:57,802 --> 13:14:01,162
Và một từ điển, giống như trong\n của chúng tôi

13720
13:14:01,161 --> 13:14:02,871
Các từ và định nghĩa của chúng.

13721
13:14:02,872 --> 13:14:07,372
Giá trị này chỉ có các chữ cái của\nalphabet và salad.

13722
13:14:07,372 --> 13:14:09,742
Nhưng ở đây cũng có những hạn chế trong thế giới thực.

13723
13:14:09,741 --> 13:14:13,222
Trong trường hợp nào\nhệ thống này ở Sweetgreen

13724
13:14:13,222 --> 13:14:15,891
chuyển sang một vấn đề chẳng hạn?

13725
13:14:15,891 --> 13:14:19,582
Bởi vì họ cũng chỉ sử dụng\nkhông gian hữu hạn, dung lượng lưu trữ hữu hạn.

13726
13:14:22,012 --> 13:14:23,391
Nếu chúng hết chỗ\ngoài giá và có

13727
13:14:23,391 --> 13:14:25,862
rất nhiều người có tên bắt đầu bằng D, hoặc E, hay bất cứ thứ gì.

13728
13:14:26,781 --> 13:14:29,362
Và sau đó, có lẽ, chúng sẽ tràn vào chữ E hoặc chữ F.

13729
13:14:29,362 --> 13:14:31,281
Và họ có lẽ không thực sự quan tâm vì bất kỳ con người nào

13730
13:14:31,281 --> 13:14:33,771
sắp đi qua và chỉ\n

13731
13:14:33,771 --> 13:14:36,261
Nhưng trong thế giới\nmáy tính, bạn là người viết mã

13732
13:14:36,262 --> 13:14:38,152
và phải luôn chính xác.

13733
13:14:38,152 --> 13:14:41,722
Chúng tôi nghĩ cuối cùng chúng tôi cũng\nlàm được một việc cuối cùng ở đây.

13734
13:14:41,722 --> 13:14:45,527
Trước đó, chúng tôi đã chuẩn bị một danh sách\nliên kết các loại đối tượng.

13735
13:14:45,527 --> 13:14:47,152
Vì điều này đã trở thành một chút vấn đề.

13736
13:14:47,152 --> 13:14:50,012
Tôi đang bắt đầu trình bày\nsự bắt đầu của danh sách liên kết này.

13737
13:14:50,012 --> 13:14:54,592
Và theo như tôi có một con trỏ\nở đây với vị trí ghế G9.

13738
13:14:54,591 --> 13:14:57,981
Ai ở G9 thì\nbạn có phiền đứng lên không?

13739
13:14:57,982 --> 13:15:00,652
Và chữ cái nào trên tờ giấy của bạn ở đó?

13740
13:15:01,582 --> 13:15:04,132
GIỌNG 1: OK, vậy là bạn có S15 và lá thư của bạn--

13741
13:15:07,161 --> 13:15:09,471
Vì vậy, tôi thấy bạn đang giữ\na C trong nút của mình.

13742
13:15:09,472 --> 13:15:12,982
Bạn đang trỏ tới, nếu\nbạn có thể thực tế, F15.

13743
13:15:15,262 --> 13:15:17,872
NGƯỜI GIỌNG 1: Bạn có chữ S. Và\nbạn nên chỉ vào ai?

13744
13:15:26,302 --> 13:15:30,502
F12, nếu bạn muốn đứng lên nắm giữ\n

13745
13:16:54,512 --> 13:16:58,322
DAVID J. Malan: Được rồi, đây là\n

13746
13:16:58,322 --> 13:17:00,980
Và đây là tuần\nbạn học một ngôn ngữ khác.

13747
13:17:00,980 --> 13:17:03,272
Nhưng mục tiêu không chỉ là\nt dạy bạn một ngôn ngữ khác

13748
13:17:03,271 --> 13:17:06,002
vì lợi ích ngôn ngữ,\nas chúng ta chuyển đổi ngày hôm nay

13749
13:17:06,002 --> 13:17:09,302
và trong những tuần tới từ C, nơi\n

13750
13:17:09,961 --> 13:17:14,051
Mục tiêu cuối cùng là dạy cho tất cả các bạn\n

13751
13:17:14,052 --> 13:17:16,542
để đến cuối\nkhóa học này, bạn sẽ không nghĩ đến điều đó nữa

13752
13:17:16,542 --> 13:17:19,232
thực tế là bạn đã học\ncách lập trình bằng C

13753
13:17:19,232 --> 13:17:21,482
hoặc đã học cách đây vài tuần\ncách lập trình trong Scratch

13754
13:17:21,482 --> 13:17:24,692
nhưng thực sự bạn đã học\ncách lập trình cơ bản như thế nào

13755
13:17:24,692 --> 13:17:27,152
trong một mô hình được gọi là\nlập trình thủ tục

13756
13:17:27,152 --> 13:17:29,972
cũng như với chút hương vị\nhôm nay và trong những tuần tới

13757
13:17:29,972 --> 13:17:31,832
các khía cạnh khác của\nngôn ngữ lập trình

13758
13:17:31,832 --> 13:17:34,531
như lập trình\nhướng đối tượng và hơn thế nữa.

13759
13:17:34,531 --> 13:17:36,701
Tuy nhiên, hãy nhớ lại\nin tuần thứ 0, Xin chào thế giới

13760
13:17:36,701 --> 13:17:38,201
trông hơi giống thế này.

13761
13:17:38,201 --> 13:17:39,908
Và thế giới này khá đơn giản.

13762
13:17:39,908 --> 13:17:42,241
Tất cả những gì bạn phải làm là kéo\nvà thả những mảnh ghép này.

13763
13:17:42,241 --> 13:17:45,481
Nhưng vẫn còn các chức năng và\n

13764
13:17:45,482 --> 13:17:47,552
và tất cả những kiểu nguyên thủy đó.

13765
13:17:47,552 --> 13:17:50,822
Tất nhiên, sau đó chúng tôi đã chuyển đổi,\n

13766
13:17:50,822 --> 13:17:52,362
trông hơi giống thế này.

13767
13:17:52,362 --> 13:17:54,319
Và ngay cả bây giờ, vài tuần\nsau, bạn vẫn có thể

13768
13:17:54,319 --> 13:17:56,991
đang gặp khó khăn với một số\ncú pháp hoặc gặp phải các lỗi khó chịu

13769
13:17:56,991 --> 13:17:59,491
khi bạn cố gắng biên dịch\ncode của mình và nó không hoạt động.

13770
13:17:59,491 --> 13:18:01,322
Nhưng ở đó,\nvài tuần qua, chúng tôi đã

13771
13:18:01,322 --> 13:18:04,652
đang tập trung vào các hàm và vòng lặp\n

13772
13:18:06,072 --> 13:18:10,232
Và những gì chúng ta bắt đầu làm hôm nay\n

13773
13:18:10,232 --> 13:18:15,362
chúng tôi đang sử dụng, đang chuyển đổi từ C\n

13774
13:18:15,362 --> 13:18:18,722
chương trình bằng Python và xem\na sự đơn giản tương đối của nó

13775
13:18:18,722 --> 13:18:20,461
mà còn đang chuyển đổi\nđể xem bạn

13776
13:18:20,461 --> 13:18:22,322
có thể triển khai những\nloại tính năng này

13777
13:18:22,322 --> 13:18:23,951
chỉ cần sử dụng một ngôn ngữ khác.

13778
13:18:23,951 --> 13:18:25,771
Vì vậy hôm nay chúng ta sẽ thấy\na rất nhiều mã.

13779
13:18:25,771 --> 13:18:29,671
Và bạn sẽ không có nhiều như vậy\n

13780
13:18:29,671 --> 13:18:32,731
Nhưng đó là vì rất nhiều\n

13781
13:18:32,732 --> 13:18:35,102
Và thực sự, nó sẽ là một\n

13782
13:18:35,934 --> 13:18:38,281
Tôi biết cách thực hiện điều đó trong C.\nTôi làm cách nào để thực hiện điều này trong Python?

13783
13:18:38,281 --> 13:18:39,512
Làm cách nào để thực hiện tương tự với các điều kiện?

13784
13:18:39,512 --> 13:18:41,232
Làm cách nào để khai báo\nbiến và những thứ tương tự

13785
13:18:41,232 --> 13:18:43,982
và tiến về phía trước, không chỉ trong\nCS50, mà cả trong cuộc sống nói chung

13786
13:18:43,982 --> 13:18:47,282
nếu bạn tiếp tục lập trình và học hỏi\n

13787
13:18:47,281 --> 13:18:50,792
nếu trong 5-10 năm nữa có cái mới, thêm\n

13788
13:18:50,792 --> 13:18:53,042
nó sẽ chỉ là\nvấn đề là tra cứu trên Google và tìm kiếm

13789
13:18:53,042 --> 13:18:54,932
tại các trang web như Stack\nOverflow và những trang tương tự

13790
13:18:54,932 --> 13:18:57,872
chỉ xem xét việc xây dựng\ncác khối ngôn ngữ lập trình cơ bản

13791
13:18:57,872 --> 13:19:01,202
bởi vì bạn đã nói,\nsau hơn 6 tuần qua

13792
13:19:01,201 --> 13:19:04,021
về cơ bản bạn đã nói được về lập trình rồi.

13793
13:19:04,021 --> 13:19:07,591
Được rồi, hãy làm nhanh vài việc\n

13794
13:19:07,591 --> 13:19:09,481
thứ gì đó có thể đã\ntrông giống như trong Scratch

13795
13:19:09,482 --> 13:19:11,342
và lúc đó nó trông như thế nào trong C, nhưng bây giờ

13796
13:19:11,341 --> 13:19:13,291
kể từ hôm nay,\nnó sẽ trông như thế nào trong Python.

13797
13:19:13,292 --> 13:19:15,375
Sau đó chúng ta sẽ chuyển sự chú ý\nvào dòng lệnh

13798
13:19:15,375 --> 13:19:19,031
cuối cùng, để\nthực hiện một số chương trình thực tế.

13799
13:19:19,031 --> 13:19:22,262
Vì vậy, trong Scratch, chúng ta có\ncác hàm như thế này, hãy nói Xin chào

13800
13:19:23,792 --> 13:19:26,262
Trong C nó trông hơi\ngiống như thế này

13801
13:19:26,262 --> 13:19:29,672
và có một chút rắc rối khó hiểu vào\ntuần đầu tiên, bạn có bản in

13802
13:19:30,811 --> 13:19:32,502
Bạn đã có dấu chấm phẩy, dấu ngoặc đơn.

13803
13:19:32,502 --> 13:19:34,944
Vì vậy, có rất nhiều cú pháp\nchỉ để làm điều tương tự.

13804
13:19:34,944 --> 13:19:37,862
Chúng tôi sẽ không loại bỏ tất cả\n

13805
13:19:37,862 --> 13:19:42,101
trong Python, câu lệnh tương tự cũng đang diễn ra\n

13806
13:19:42,101 --> 13:19:44,161
Và có lẽ chỉ để gọi\n ra điều hiển nhiên, cái gì

13807
13:19:44,161 --> 13:19:48,572
thì khác hoặc bây giờ đơn giản hơn\nin Python so với C, thậm chí

13808
13:19:48,572 --> 13:19:50,161
trong ví dụ đơn giản này ở đây?

13809
13:19:51,067 --> 13:19:53,942
ĐỐI TƯỢNG: Bây giờ in, thay vì\n

13810
13:19:53,942 --> 13:19:56,359
DAVID J. Malan: Tốt, vậy là\nbây giờ nó được in thay vì printf.

13811
13:19:56,358 --> 13:19:57,631
Và cũng không có dấu chấm phẩy.

13812
13:19:57,631 --> 13:19:59,625
Và có một\nsự tinh tế khác ở đây.

13813
13:20:00,542 --> 13:20:02,162
DAVID J. Malan: Vâng,\nvì vậy không có dòng mới, và đó

13814
13:20:02,161 --> 13:20:03,631
không có nghĩa là nó\nsẽ không được in.

13815
13:20:03,631 --> 13:20:05,923
Hóa ra là một\nsự khác biệt mà chúng ta sẽ thấy

13816
13:20:05,923 --> 13:20:08,161
nghĩa là, với bản in, bạn sẽ nhận được dòng mới miễn phí.

13817
13:20:08,161 --> 13:20:11,471
Nó tự động được xuất ra bởi\n

13818
13:20:11,472 --> 13:20:13,711
Nhưng bạn có thể ghi đè lên nó,\ncuối cùng chúng ta cũng sẽ thấy.

13819
13:20:14,822 --> 13:20:18,603
Chúng tôi có nhiều chức năng như\n

13820
13:20:18,603 --> 13:20:20,311
trên màn hình, nhưng\ncũng hỏi một câu hỏi

13821
13:20:20,311 --> 13:20:23,822
do đó là một chức năng khác\n

13822
13:20:23,822 --> 13:20:26,252
Trong C, chúng tôi thấy mã\ntrông hơi gì đó

13823
13:20:26,252 --> 13:20:29,942
như thế này, theo đó dòng đầu tiên\n

13824
13:20:29,942 --> 13:20:32,312
đặt nó bằng giá trị\nreturn của getString

13825
13:20:32,311 --> 13:20:34,261
một trong các chức năng\ntừ thư viện CS50

13826
13:20:34,262 --> 13:20:37,502
và sau đó là dấu ngoặc kép\nvà dấu ngoặc đơn và dấu chấm phẩy.

13827
13:20:37,502 --> 13:20:41,912
Sau đó, chúng tôi có mã định dạng\nin C này cho phép chúng tôi, với %S

13828
13:20:41,911 --> 13:20:44,281
để thực sự in ra cùng một giá trị.

13829
13:20:44,281 --> 13:20:46,921
Trong Python, điều này cũng sẽ có vẻ đơn giản hơn một chút.

13830
13:20:46,921 --> 13:20:49,981
Thay vào đó, chúng ta sẽ có\nanswer bằng getString

13831
13:20:49,982 --> 13:20:52,592
trích dẫn bỏ trích dẫn "Tên\ncủa bạn là gì," rồi in

13832
13:20:52,591 --> 13:20:55,391
bằng dấu cộng và một\nmột chút cú pháp mới.

13833
13:20:55,391 --> 13:20:58,171
Nhưng hãy xem liệu chúng ta có thể\suy ra từ ví dụ này điều gì

13834
13:20:59,381 --> 13:21:02,191
À, đầu tiên còn thiếu bên trái là gì?

13835
13:21:02,192 --> 13:21:05,141
Ở bên trái của dấu bằng,\nlần này không có gì?

13836
13:21:05,141 --> 13:21:06,391
Cứ thoải mái gọi nó ra.

13837
13:21:07,211 --> 13:21:07,981
DAVID J. Malan: Vì vậy không có loại.

13838
13:21:07,982 --> 13:21:10,292
Không có loại nào, như\nchuỗi từ, mà

13839
13:21:10,292 --> 13:21:14,612
mặc dù đó là một loại trong\nCS50, mọi biến khác trong C

13840
13:21:14,612 --> 13:21:17,959
chúng ta đã sử dụng Int hay chuỗi hay\nfloat, hay Bool hay thứ gì khác.

13841
13:21:17,959 --> 13:21:20,042
Trong Python, vẫn\nsẽ có các kiểu dữ liệu

13842
13:21:20,042 --> 13:21:22,502
hôm nay trở đi, nhưng bạn,\nngười lập trình viên, thì không

13843
13:21:22,502 --> 13:21:25,563
phải bận tâm đến\nmáy tính biết bạn đang sử dụng loại nào.

13844
13:21:25,563 --> 13:21:27,271
Máy tính sẽ\nđủ thông minh

13845
13:21:27,271 --> 13:21:29,761
ngôn ngữ, thực sự, sẽ là\n

13846
13:21:30,781 --> 13:21:32,671
Trong khi đó, ở phía bên phải\n, getString

13847
13:21:32,671 --> 13:21:34,379
sẽ là một\nhàm chúng ta sẽ sử dụng hôm nay

13848
13:21:34,379 --> 13:21:37,841
và tuần này, đến từ một\n

13849
13:21:37,841 --> 13:21:40,891
Nhưng chúng ta cũng sẽ bắt đầu cất cánh\n

13850
13:21:40,891 --> 13:21:44,192
xem cách thực hiện mọi việc mà không cần thêm thư viện\nany CS50

13851
13:21:44,192 --> 13:21:45,812
thay vào đó hãy sử dụng một chức năng khác.

13852
13:21:45,811 --> 13:21:49,441
Như trước, không có dấu chấm phẩy, nhưng phần còn lại\n

13853
13:21:49,951 --> 13:21:52,534
Tuy nhiên, điều này bắt đầu có chút khác biệt.

13854
13:21:52,535 --> 13:21:54,172
Chúng tôi đang sử dụng print thay vì printf.

13855
13:21:54,171 --> 13:21:57,381
Nhưng bây giờ, mặc dù điều này\ncó vẻ hơi khó hiểu

13856
13:21:57,381 --> 13:21:59,631
có lẽ, nếu bạn chưa từng\nlập trình trước CS50

13857
13:21:59,631 --> 13:22:03,651
điều đó cộng với việc đó có thể làm được gì,\nchỉ dựa trên suy luận ở đây.

13858
13:22:04,402 --> 13:22:08,241
ĐỐI TƯỢNG: Thêm câu trả lời\nvào chuỗi Xin chào.

13859
13:22:08,241 --> 13:22:11,511
DAVID J. Malan: Vâng, vậy nên việc thêm\ncâu trả lời vào chuỗi Xin chào

13860
13:22:11,512 --> 13:22:13,552
và phép cộng, có thể nói,\nkhông phải về mặt toán học

13861
13:22:13,552 --> 13:22:16,102
nhưng dưới hình thức kết hợp\nchúng lại với nhau, giống như chúng ta

13862
13:22:16,101 --> 13:22:19,561
đã thấy khối được nối trong Scratch, hoặc\n

13863
13:22:20,061 --> 13:22:23,331
Dấu cộng này sẽ được thêm vào,\nnếu bạn muốn, bất kể là gì

13864
13:22:23,332 --> 13:22:25,147
để trả lời cho bất cứ điều gì được trích dẫn ở đây.

13865
13:22:25,146 --> 13:22:27,771
Và tôi đã cố tình để lại một khoảng trống\nở đó, để về mặt ngữ pháp nó

13866
13:22:27,771 --> 13:22:29,943
trông cũng đẹp, sau dấu phẩy.

13867
13:22:29,944 --> 13:22:31,402
Bây giờ có một cách khác để làm điều này.

13868
13:22:31,402 --> 13:22:33,652
Và nó cũng sẽ\ncó vẻ khó hiểu ngay từ cái nhìn đầu tiên.

13869
13:22:33,652 --> 13:22:36,031
Nhưng nó sẽ trở nên dễ dàng hơn và\nthuận tiện hơn theo thời gian.

13870
13:22:36,031 --> 13:22:41,101
Thay vào đó, bạn cũng có thể thay đổi dòng\nthứ hai này thành dòng này.

13871
13:22:42,292 --> 13:22:45,232
Đây thực sự là một điều tương đối mới\n

13872
13:22:45,232 --> 13:22:47,542
nhiều năm rồi, những gì\nbạn đang thấy bây giờ ở đâu, vâng

13873
13:22:47,542 --> 13:22:50,101
một chuỗi, giữa\ndấu ngoặc kép này

13874
13:22:50,101 --> 13:22:53,597
nhưng đây là cái mà Python\ngọi là chuỗi định dạng hoặc Fstring.

13875
13:22:53,597 --> 13:22:56,722
Và nó thực sự bắt đầu bằng chữ cái\n

13876
13:22:57,502 --> 13:23:01,222
Nhưng điều đó chỉ cho thấy\nrằng Python nên

13877
13:23:01,222 --> 13:23:05,632
giả sử rằng bất cứ thứ gì bên trong\ndấu ngoặc nhọn bên trong chuỗi

13878
13:23:05,631 --> 13:23:09,081
nên được nội suy, vì vậy\n

13879
13:23:09,082 --> 13:23:12,682
thay thế giá trị của\nbất kỳ biến nào trong đó.

13880
13:23:12,682 --> 13:23:14,552
Và nó cũng có thể làm một số việc khác.

13881
13:23:14,552 --> 13:23:18,562
Vậy câu trả lời là một biến, được khai báo,\n

13882
13:23:18,561 --> 13:23:22,822
Sau đó, chuỗi F này nói với Python,\n

13883
13:23:24,472 --> 13:23:28,912
Ngược lại, nếu bạn\bỏ qua dấu ngoặc nhọn

13884
13:23:28,911 --> 13:23:30,561
chỉ cần đoán xem điều gì sẽ xảy ra?

13885
13:23:30,561 --> 13:23:33,441
Triệu chứng của\nlỗi đó sẽ là gì nếu bạn vô tình

13886
13:23:33,442 --> 13:23:36,531
quên dấu ngoặc nhọn, nhưng\ncó lẽ vẫn còn chữ F ở đó?

13887
13:23:36,531 --> 13:23:38,271
ĐỐI TƯỢNG: Nó cũng sẽ in bên dưới nó.

13888
13:23:38,271 --> 13:23:40,822
DAVID J. Malan: Đúng vậy, theo nghĩa đen\n

13889
13:23:41,722 --> 13:23:44,211
Vì vậy, các dấu ngoặc nhọn chỉ cho phép bạn cắm mọi thứ vào.

13890
13:23:44,211 --> 13:23:45,872
Và một lần nữa, nó có vẻ\na khó hiểu hơn một chút

13891
13:23:45,872 --> 13:23:47,789
nhưng nó sẽ giúp chúng ta\ntiết kiệm thời gian theo thời gian.

13892
13:23:47,788 --> 13:23:50,641
Và nếu bất kỳ ai trong số các bạn đã lập trình trong\n

13893
13:23:50,641 --> 13:23:53,152
bạn cũng đã thấy dấu cộng trong ngữ cảnh đó\ncho phép nối.

13894
13:23:53,152 --> 13:23:56,277
Điều này chỉ làm cho mã của bạn trở thành một\n

13895
13:23:56,277 --> 13:23:58,252
Vì vậy, giờ đây nó là một tính năng\ntiện lợi trong Python.

13896
13:23:58,252 --> 13:24:00,711
Được rồi, đây là một ví dụ\nin Scratch của một biến

13897
13:24:00,711 --> 13:24:03,262
đặt một biến như\ncounter bằng 0.

13898
13:24:03,262 --> 13:24:06,982
Trong C nó trông như thế này,\nbạn chỉ định loại, tên

13899
13:24:06,982 --> 13:24:08,752
và sau đó là giá trị, bằng dấu chấm phẩy.

13900
13:24:08,752 --> 13:24:11,618
Trong Python, nó sẽ trông như thế này.

13901
13:24:11,618 --> 13:24:12,951
Và tôi sẽ nói rõ điều hiển nhiên ở đây.

13902
13:24:12,951 --> 13:24:15,862
Bạn không cần phải đề cập đến\n

13903
13:24:15,862 --> 13:24:17,552
Và bạn không cần dấu chấm phẩy.

13904
13:24:18,652 --> 13:24:21,527
Nếu bạn muốn một biến, chỉ cần viết\n

13905
13:24:21,527 --> 13:24:24,592
Nhưng dấu bằng đơn\nvẫn hoạt động giống như trong C.

13906
13:24:24,591 --> 13:24:26,961
Giả sử chúng ta muốn\tăng bộ đếm lên một.

13907
13:24:26,961 --> 13:24:29,271
Trong Scratch, chúng tôi sử dụng\nmảnh ghép này ở đây.

13908
13:24:29,271 --> 13:24:31,771
Trong C, trên thực tế, chúng ta có thể thực hiện việc này\theo một số cách khác nhau.

13909
13:24:31,771 --> 13:24:33,921
Có cách này nếu\nbộ đếm đã tồn tại

13910
13:24:33,921 --> 13:24:36,502
bạn chỉ cần nói counter\nequals counter cộng 1.

13911
13:24:36,502 --> 13:24:41,362
Có phần ít dài dòng hơn một chút\n

13912
13:24:41,362 --> 13:24:42,921
Hãy để tôi làm câu đầu tiên trước.

13913
13:24:42,921 --> 13:24:45,211
Trong Python,\nđiều tương tự như bạn có thể đoán

13914
13:24:45,211 --> 13:24:48,682
thực sự sẽ gần như là\n

13915
13:24:48,682 --> 13:24:51,891
Và toán học cuối cùng\n

13916
13:24:51,891 --> 13:24:53,811
thông qua toán tử gán.

13917
13:24:53,811 --> 13:24:56,091
Bây giờ, hãy nhớ lại, trong C,\nchúng ta có cách viết tắt này

13918
13:24:56,091 --> 13:24:58,521
ký hiệu, đã làm điều tương tự.

13919
13:24:58,521 --> 13:25:03,502
Trong Python, bạn có thể làm tương tự\n

13920
13:25:03,502 --> 13:25:05,811
Bước lùi duy nhất\nchúng tôi đang thực hiện, nếu bạn

13921
13:25:05,811 --> 13:25:10,311
là một fan hâm mộ lớn của counter plus\n

13922
13:25:12,021 --> 13:25:16,731
Bạn phải tính cộng bằng 1\cũng không phải cộng/trừ hoặc trừ bằng 1

13923
13:25:16,732 --> 13:25:20,242
để đạt được kết quả tương tự. Được rồi, còn Python 2 thì sao?

13924
13:25:20,241 --> 13:25:22,881
Ở đây trong Scratch, hãy nhớ lại,\nlà một điều kiện

13925
13:25:22,881 --> 13:25:26,511
hỏi một câu ngớ ngẩn như là x ít hơn\n

13926
13:25:26,512 --> 13:25:30,502
Trong C, nó trông hơi\ngiống như thế này, printf và if

13927
13:25:30,502 --> 13:25:33,832
với dấu ngoặc đơn, đường cong\n

13928
13:25:33,832 --> 13:25:37,132
Trong Python, điều này sẽ nhận được một\n

13929
13:25:39,841 --> 13:25:42,981
Và nếu ai đó muốn gọi\n

13930
13:25:42,982 --> 13:25:46,887
những gì hiện đã được đơn giản hóa trong Python\n

13931
13:25:46,887 --> 13:25:48,262
Vâng, điều gì còn thiếu hoặc đã thay đổi?

13932
13:25:48,872 --> 13:25:49,927
DAVID J. Malan: Vì vậy không có dấu ngoặc nhọn.

13933
13:25:51,891 --> 13:25:53,031
ĐỐI TƯỢNG: Thay vào đó hãy sử dụng dấu hai chấm.

13934
13:25:53,031 --> 13:25:55,114
DAVID J. Malan: Và thay vào đó chúng ta đang sử dụng dấu hai chấm.

13935
13:25:55,114 --> 13:25:57,141
Vì vậy, tôi đã loại bỏ\ndấu ngoặc nhọn trong Python.

13936
13:25:57,141 --> 13:25:58,714
Nhưng thay vào đó tôi đang sử dụng dấu hai chấm.

13937
13:25:58,714 --> 13:26:00,631
Và mặc dù đây chỉ là một dòng mã

13938
13:26:00,631 --> 13:26:04,971
miễn là bạn thụt lề\ncác dòng tiếp theo cùng với printf

13939
13:26:04,972 --> 13:26:09,351
điều đó sẽ ám chỉ rằng mọi thứ,\n

13940
13:26:09,351 --> 13:26:13,491
sẽ được thực thi bên dưới nó, cho đến khi bạn\n

13941
13:26:13,491 --> 13:26:14,991
một dòng mã khác hoàn toàn.

13942
13:26:14,991 --> 13:26:17,521
Vì vậy, thụt lề trong Python rất quan trọng.

13943
13:26:17,521 --> 13:26:21,621
Vì vậy, đây là một trong những lý do\nchúng tôi đã nhấn mạnh các trục như phong cách

13944
13:26:21,622 --> 13:26:23,362
mã của bạn được tạo kiểu tốt như thế nào.

13945
13:26:23,362 --> 13:26:25,881
Và thành thật mà nói, chúng tôi đã thấy\nchắc chắn là trong giờ hành chính

13946
13:26:25,881 --> 13:26:28,521
và bạn đã thấy trong mã của chính mình\nđôi khi có một xu hướng

13947
13:26:28,521 --> 13:26:31,551
hơi lỏng lẻo khi nói đến việc thụt lề, phải không?

13948
13:26:31,552 --> 13:26:34,192
Nếu bạn là một trong những người\nthích thụt lề mọi thứ

13949
13:26:34,192 --> 13:26:37,732
ở phía bên trái của cửa sổ,\n

13950
13:26:37,732 --> 13:26:41,392
Nhưng bạn hoặc bất kỳ ai khác đặc biệt không thể đọc được nó.

13951
13:26:41,391 --> 13:26:45,112
Python thực sự giải quyết vấn đề này\nbằng cách chỉ yêu cầu thụt lề

13952
13:26:46,311 --> 13:26:50,572
Vì vậy Python sẽ buộc bạn phải bắt đầu\n

13953
13:26:50,572 --> 13:26:53,201
có lẽ, một xu hướng khác.

13954
13:26:54,141 --> 13:26:55,572
Vâng, chúng tôi không có dấu chấm phẩy ở đây.

13955
13:26:55,572 --> 13:26:57,671
Tất nhiên, đó là print thay vì printf.

13956
13:26:57,671 --> 13:27:00,341
Nhưng mặt khác, những điều đó dường như là điểm khác biệt chính.

13957
13:27:00,341 --> 13:27:02,201
Thế còn thứ gì đó lớn hơn trong Scratch thì sao?

13958
13:27:02,201 --> 13:27:05,333
Nếu một khối if-else, như\nnày, có lẽ bạn có thể

13959
13:27:05,334 --> 13:27:06,792
đoán xem nó sẽ trông như thế nào.

13960
13:27:06,792 --> 13:27:10,061
Trong C, nó trông như thế này, \ndấu chấm phẩy cong, v.v.

13961
13:27:10,061 --> 13:27:14,051
Trong Python, bây giờ\nnó sẽ trông như thế này, gần giống như vậy

13962
13:27:14,052 --> 13:27:15,342
nhưng thụt đầu dòng là quan trọng.

13963
13:27:16,482 --> 13:27:19,332
Và còn một điểm khác biệt\nhiện lại hiển thị ở đây

13964
13:27:19,332 --> 13:27:21,192
nhưng chúng tôi đã không gọi nó ra một giây trước.

13965
13:27:21,192 --> 13:27:24,281
Python có gì khác biệt\n

13966
13:27:24,993 --> 13:27:27,641
ĐỐI TƯỢNG: Bạn không có\ndấu ngoặc đơn nào xung quanh điều kiện.

13967
13:27:28,222 --> 13:27:30,612
Chúng tôi không có bất kỳ dấu ngoặc đơn nào xung quanh điều kiện

13968
13:27:30,612 --> 13:27:32,232
chính biểu thức Boolean.

13969
13:27:33,088 --> 13:27:34,421
Chà, nó chỉ đơn giản hơn để gõ.

13970
13:27:35,472 --> 13:27:36,972
Bạn vẫn có thể sử dụng dấu ngoặc đơn.

13971
13:27:36,972 --> 13:27:39,072
Và trên thực tế, bạn có thể muốn hoặc cần

13972
13:27:39,072 --> 13:27:43,991
nếu bạn muốn kết hợp những suy nghĩ và\n

13973
13:27:43,991 --> 13:27:47,441
Nhưng theo mặc định, bạn không cần nữa\n

13974
13:27:48,671 --> 13:27:50,961
Cuối cùng, với các điều kiện,\nchúng tôi đã có một cái gì đó như thế này

13975
13:27:50,961 --> 13:27:53,292
một câu lệnh if else if else.

13976
13:27:53,292 --> 13:27:55,362
Trong C, nó trông hơi giống thế này.

13977
13:27:55,362 --> 13:27:57,402
Trong Python, bây giờ mọi việc sẽ\n thực sự chặt chẽ hơn.

13978
13:27:57,402 --> 13:28:02,351
Nó chỉ là nếu, và đây là\ncururiosity, elif x lớn hơn y.

13979
13:28:02,351 --> 13:28:07,631
Vậy thì không khác nếu, theo nghĩa đen\n

13980
13:28:07,631 --> 13:28:09,836
bây giờ vẫn còn trên mỗi trong ba dòng.

13981
13:28:09,836 --> 13:28:11,211
Nhưng vết lõm là quan trọng.

13982
13:28:11,211 --> 13:28:13,002
Và nếu chúng tôi muốn\nlàm nhiều việc

13983
13:28:13,002 --> 13:28:16,760
chúng ta cũng có thể thụt lề bên dưới mỗi điều kiện này.

13984
13:28:16,760 --> 13:28:18,552
Được rồi, hãy để tôi tạm dừng\nở đó trước để xem

13985
13:28:18,552 --> 13:28:21,012
nếu có bất kỳ câu hỏi nào về\nnhững khác biệt về cú pháp này.

13986
13:28:21,769 --> 13:28:24,054
KHÁN GIẢ: Suy nghĩ của tôi\ncó lẽ là, nó hay

13987
13:28:24,053 --> 13:28:27,681
tuy nhiên, có quan trọng không nếu có\n

13988
13:28:28,692 --> 13:28:31,572
DAVID J. Malan: Ở giữa,\ngiữa cái gì và cái gì?

13989
13:28:31,572 --> 13:28:34,942
KHÁN GIẢ: Giống như bên tay trái\n

13990
13:28:34,942 --> 13:28:38,352
DAVID J. Malan: À, câu hỏi hay\n, Python có nhạy cảm không

13991
13:28:38,351 --> 13:28:40,271
đến không gian và chúng đi đâu?

13992
13:28:40,271 --> 13:28:42,911
Đôi khi không, đôi khi\nycó, là câu trả lời ngắn gọn.

13993
13:28:42,911 --> 13:28:46,601
Tuy nhiên, về mặt phong cách, bạn nên\n

13994
13:28:46,601 --> 13:28:50,786
nhờ đó bạn có khoảng trống cho\n

13995
13:28:50,786 --> 13:28:52,661
mà họ được gọi,\nđại loại như nhỏ hơn

13996
13:28:52,661 --> 13:28:54,869
hoặc lớn hơn là toán tử nhị phân\nooper, bởi vì có

13997
13:28:54,870 --> 13:28:57,102
hai toán hạng ở bên trái\nvà ở bên phải chúng.

13998
13:28:57,101 --> 13:29:00,161
Và trên thực tế, trong Python,\ncòn hơn cả thế giới C

13999
13:29:00,161 --> 13:29:02,861
thực sự có những quy ước về phong cách\ntrang trọng.

14000
13:29:02,862 --> 13:29:07,209
Không chỉ trong CS50 chúng tôi mới có\n

14001
13:29:07,209 --> 13:29:10,542
chẳng hạn, điều đó chỉ cho biết bạn\n

14002
13:29:11,466 --> 13:29:13,841
Trong cộng đồng Python, họ\nti tiến thêm một bước nữa

14003
13:29:13,841 --> 13:29:17,781
và có một tiêu chuẩn thực tế theo đó\n

14004
13:29:17,781 --> 13:29:20,832
nhưng nói chung, trong thực tế\n

14005
13:29:20,832 --> 13:29:23,622
sẽ từ chối mã của bạn nếu bạn đang cố gắng\n

14006
13:29:23,622 --> 13:29:25,252
nếu bạn không tuân thủ các tiêu chuẩn này.

14007
13:29:25,252 --> 13:29:28,211
Vì vậy, mặc dù bạn có thể thoải mái\nvới một số khoảng trắng này

14008
13:29:29,381 --> 13:29:33,296
Và đó là chủ đề Python, dành cho\n

14009
13:29:33,296 --> 13:29:35,921
Được rồi, chúng ta hãy xem\nas một vài cấu trúc khác

14010
13:29:35,921 --> 13:29:37,881
trước khi chuyển\nsang một số mã thực tế.

14011
13:29:37,881 --> 13:29:40,631
Tất nhiên, trong Scratch\nđiều này là một vòng lặp, kêu meo meo mãi mãi.

14012
13:29:40,631 --> 13:29:44,862
Trong C, điểm gần nhất mà chúng tôi có thể đạt được là\n

14013
13:29:45,622 --> 13:29:48,582
Vì vậy, đây là một cách đơn giản\n chỉ cần nói hãy làm điều này mãi mãi.

14014
13:29:48,582 --> 13:29:51,461
Trong Python, nó cũng khá giống như vậy

14015
13:29:51,461 --> 13:29:53,262
nhưng có một vài khác biệt nhỏ ở đây.

14016
13:29:57,161 --> 13:30:00,784
Không có dấu chấm phẩy và không có sự khác biệt tinh tế nào khác.

14017
13:30:01,451 --> 13:30:02,441
ĐỐI TƯỢNG: Đúng là viết hoa?

14018
13:30:02,442 --> 13:30:04,525
DAVID J. Malan: True được viết hoa, chỉ vì.

14019
13:30:04,525 --> 13:30:07,092
Cả đúng và sai đều là\ngiá trị Boolean trong Python.

14020
13:30:07,091 --> 13:30:09,671
Nhưng bạn phải bắt đầu\nviết hoa chúng, chỉ vì.

14021
13:30:09,671 --> 13:30:11,561
Được rồi, một\nvòng lặp như thế này thì sao, ở đâu

14022
13:30:11,561 --> 13:30:14,981
bạn lặp lại điều gì đó với số lượng hữu hạn\n

14023
13:30:14,982 --> 13:30:17,572
Trong C, chúng ta có thể thực hiện việc này\na theo một số cách khác nhau.

14024
13:30:17,572 --> 13:30:21,311
Có một cách rất máy móc,\n

14025
13:30:22,091 --> 13:30:25,871
Sau đó, bạn sử dụng vòng lặp while và\nkiểm tra xem i có nhỏ hơn 3 không

14026
13:30:25,872 --> 13:30:27,709
tổng số\nsố lần bạn muốn kêu meo meo.

14027
13:30:27,709 --> 13:30:29,292
Sau đó, bạn in những gì bạn muốn in.

14028
13:30:29,292 --> 13:30:32,891
Bạn tăng i bằng cú pháp này,\n

14029
13:30:32,891 --> 13:30:34,402
với cộng bằng hoặc không gì cả.

14030
13:30:34,402 --> 13:30:36,732
Và sau đó bạn làm lại\nvà lặp đi lặp lại.

14031
13:30:36,732 --> 13:30:40,692
Trong Python, bạn có thể thực hiện\ntheo cách tương tự về mặt chức năng, cùng ý tưởng

14032
13:30:42,101 --> 13:30:44,711
Bạn chỉ cần không cần nói\nloại biến nào bạn muốn.

14033
13:30:44,711 --> 13:30:47,559
Python sẽ suy luận từ thực tế\n rằng có số 0 ở ngay đó.

14034
13:30:47,559 --> 13:30:48,851
Bạn không cần dấu ngoặc đơn.

14035
13:30:51,281 --> 13:30:54,432
Bạn không thể làm i cộng cộng, nhưng\n

14036
13:30:54,432 --> 13:30:56,622
như chúng ta có thể đã làm trong C.

14037
13:30:56,622 --> 13:30:58,842
Tuy nhiên, chúng ta có thể làm điều này bằng cách nào khác?

14038
13:30:58,841 --> 13:31:01,061
Tốt. hóa ra trong\nC, chúng ta có thể làm gì đó

14039
13:31:01,061 --> 13:31:04,752
như thế này, một lần nữa, thoạt nhìn có vẻ khó hiểu

14040
13:31:04,752 --> 13:31:07,692
có lẽ đã trở nên quen thuộc hơn,\nnơi bạn khởi tạo

14041
13:31:07,692 --> 13:31:11,442
một điều kiện và sau đó là một bản cập nhật\n

14042
13:31:11,442 --> 13:31:14,472
Trong Python, thực sự không có sự tương tự.

14043
13:31:14,472 --> 13:31:17,022
Không có analog trong\nPython, nơi bạn có

14044
13:31:17,021 --> 13:31:19,901
dấu ngoặc đơn và nhiều\ndấu chấm phẩy trong cùng một dòng.

14045
13:31:19,902 --> 13:31:23,531
Thay vào đó là một vòng lặp for, nhưng\n

14046
13:31:23,531 --> 13:31:27,072
như tiếng Anh, for i in 0, 1 và 2.

14047
13:31:27,072 --> 13:31:31,302
Vậy chúng ta sẽ xem một lát sau, những hình vuông này\n

14048
13:31:31,302 --> 13:31:33,612
được gọi là một danh sách trong Python.

14049
13:31:33,612 --> 13:31:37,811
Vì vậy, các danh sách trong Python giống\n hơn

14050
13:31:38,902 --> 13:31:42,732
Vì vậy, điều này chỉ có nghĩa đối với i và danh sách\nba giá trị tiếp theo.

14051
13:31:42,732 --> 13:31:46,342
Và trên mỗi lần lặp của vòng lặp này,\n

14052
13:31:49,362 --> 13:31:54,402
Sau đó nó đặt i thành hai, để bạn\n

14053
13:31:54,402 --> 13:31:57,972
Nhưng điều này không nhất thiết phải mở rộng quy mô,\n

14054
13:31:57,972 --> 13:32:01,662
Giả sử bạn lấy mệnh giá\nat này làm cách

14055
13:32:01,661 --> 13:32:05,501
bạn lặp lại một số lần\nin Python, sử dụng vòng lặp for.

14056
13:32:05,502 --> 13:32:10,004
Tại thời điểm nào cách tiếp cận này\ncó thể trở nên tồi tệ hoặc thiết kế tồi?

14057
13:32:10,004 --> 13:32:11,711
Hãy để tôi cho mọi người một chút thời gian để suy nghĩ.

14058
13:32:12,936 --> 13:32:15,603
ĐỐI TƯỢNG: Nếu bạn không biết bao nhiêu lần\nlần trước, bạn biết đấy

14059
13:32:15,603 --> 13:32:17,604
bạn đã có liên kết trong đó.

14060
13:32:17,605 --> 13:32:20,022
DAVID J. Malan: Chắc chắn rồi, nếu bạn\nkhông biết đã bao nhiêu lần bạn

14061
13:32:20,021 --> 13:32:23,981
muốn lặp hoặc lặp lại, bạn không thể\n

14062
13:32:26,845 --> 13:32:29,512
ĐỐI TƯỢNG: Vì vậy, bạn muốn nói rằng hãy tăng\na một số lượng lớn các khoản phụ cấp.

14063
13:32:29,512 --> 13:32:32,262
DAVID J. Malan: Vâng, nếu bạn\n

14064
13:32:32,262 --> 13:32:34,162
danh sách này sẽ\nngày càng dài hơn

14065
13:32:34,161 --> 13:32:36,453
và bạn đang\nsắp đánh máy một cách ngu ngốc

14066
13:32:36,453 --> 13:32:40,182
như dấu phẩy 3, dấu phẩy 4, dấu phẩy 5, dấu phẩy\n

14067
13:32:40,182 --> 13:32:42,682
Ý tôi là, cuối cùng, mã của bạn sẽ bắt đầu có vẻ tệ hại.

14068
13:32:44,031 --> 13:32:46,881
Trong Python, có một hàm,\về mặt kỹ thuật cũng không có một loại

14069
13:32:46,881 --> 13:32:51,052
được gọi là phạm vi, về cơ bản là kỳ diệu\n

14070
13:32:51,052 --> 13:32:54,121
từ 0 trở lên, nhưng\nkhông qua một giá trị.

14071
13:32:54,120 --> 13:32:58,131
Vậy tác dụng của dòng\n này

14072
13:32:58,131 --> 13:33:01,006
về cơ bản sẽ trao lại cho bạn\na danh sách ba giá trị

14073
13:33:01,006 --> 13:33:02,881
do đó cho phép bạn làm\nđiều gì đó ba lần.

14074
13:33:02,881 --> 13:33:05,588
Và nếu bạn muốn làm điều gì đó\n

14075
13:33:07,597 --> 13:33:11,612
ĐỐI TƯỢNG: Có cách nào để bắt đầu\n

14076
13:33:11,612 --> 13:33:15,932
ở một số hoặc một số nguyên cao hơn\n

14077
13:33:16,982 --> 13:33:18,062
DAVID J. Malan: Một câu hỏi thực sự hay, có thể

14078
13:33:18,061 --> 13:33:19,961
bạn bắt đầu đếm ở số cao hơn.

14079
13:33:19,961 --> 13:33:23,432
Vì vậy, không phải 0, là giá trị mặc định ngụ ý,\n

14080
13:33:23,432 --> 13:33:28,082
Vâng, hóa ra là hàm phạm vi\n

14081
13:33:28,082 --> 13:33:31,520
nhưng có thể là hai hoặc thậm chí ba, đó\n

14082
13:33:31,519 --> 13:33:33,061
Vì vậy, bạn có thể tùy chỉnh nơi nó bắt đầu.

14083
13:33:33,061 --> 13:33:34,441
Bạn có thể tùy chỉnh mức tăng.

14084
13:33:34,442 --> 13:33:36,234
Theo mặc định, đó là một,\nnhưng nếu bạn muốn làm

14085
13:33:36,233 --> 13:33:39,103
mỗi hai giá trị, cho số chẵn\n

14086
13:33:40,061 --> 13:33:42,451
Và chẳng bao lâu nữa, chúng ta sẽ\nxem qua một số tài liệu về Python

14087
13:33:42,451 --> 13:33:45,331
điều đó sẽ trở thành quyền lực của bạn\n

14088
13:33:45,332 --> 13:33:47,312
Giống như, chức năng này có thể làm gì.

14089
13:33:47,311 --> 13:33:51,542
Các câu hỏi khác về điều này cho đến nay?

14090
13:33:51,542 --> 13:33:56,502
Không thấy gì cả, vậy còn gì\nchúng ta có thể so sánh và đối chiếu ở đây.

14091
13:33:56,502 --> 13:34:00,841
Chà, trong thế giới của C, hãy nhớ lại điều đó\n

14092
13:34:00,841 --> 13:34:04,831
các loại, như thế này ở đây, Bool và char\n

14093
13:34:04,832 --> 13:34:08,192
chuỗi, tình cờ đến\nđến từ thư viện CS50.

14094
13:34:08,192 --> 13:34:12,512
Nhưng bản thân ngôn ngữ C thì chắc chắn\n

14095
13:34:12,512 --> 13:34:17,222
vì dấu gạch chéo ngược 0, hỗ trợ\n

14096
13:34:17,222 --> 13:34:19,891
được tích hợp vào C, không phải đơn giản hóa CS50.

14097
13:34:19,891 --> 13:34:22,141
Tất cả những gì chúng tôi đã làm và tiết lộ\nas trong vài tuần

14098
13:34:22,141 --> 13:34:24,572
trước đây, có phải chuỗi đó,\nkiểu dữ liệu này, chỉ là

14099
13:34:24,572 --> 13:34:29,252
một từ đồng nghĩa với typedef của char star,\n

14100
13:34:29,252 --> 13:34:32,131
Hiện tại, trong Python, danh sách này thực ra\n

14101
13:34:32,131 --> 13:34:33,964
cho các kiểu dữ liệu nguyên thủy phổ biến này.

14102
13:34:33,964 --> 13:34:36,631
Vẫn sẽ có xu hướng tăng, chúng ta\nsẽ có số float và Int

14103
13:34:36,631 --> 13:34:39,121
và chúng ta sẽ có các chuỗi,\n

14104
13:34:39,122 --> 13:34:41,282
Và đây không phải là CS50\nthứ từ thư viện

14105
13:34:41,281 --> 13:34:44,822
STR, S-T-R, trên thực tế,\na là kiểu dữ liệu trong Python

14106
13:34:44,822 --> 13:34:48,781
điều đó sẽ làm được nhiều điều hơn\n

14107
13:34:48,781 --> 13:34:53,654
Trong khi đó, int và float thì không cần\n

14108
13:34:53,654 --> 13:34:56,072
bởi vì, trên thực tế, trong số những\nvấn đề Python giải quyết cho chúng ta

14109
13:34:56,072 --> 13:34:58,862
Ngoài ra, Int có thể lớn như bạn muốn.

14110
13:34:58,862 --> 13:35:01,741
Tràn số nguyên sẽ không còn là vấn đề nữa.

14111
13:35:01,741 --> 13:35:04,472
Mỗi tuần 1, ngôn ngữ\nsẽ giải quyết điều đó cho chúng ta.

14112
13:35:04,472 --> 13:35:06,311
Thật không may, điểm nổi\nkhông chính xác

14113
13:35:06,311 --> 13:35:07,711
vẫn là một vấn đề còn tồn tại.

14114
13:35:07,711 --> 13:35:11,252
Nhưng có những thư viện, mã đó\n

14115
13:35:11,252 --> 13:35:13,531
đã thảo luận trong những tuần trước,\nđiều đó cho phép bạn làm

14116
13:35:13,531 --> 13:35:16,771
tính toán khoa học hoặc tài chính,\nsử dụng các thư viện xây dựng

14117
13:35:16,771 --> 13:35:19,146
bên cạnh các kiểu dữ liệu này.

14118
13:35:19,146 --> 13:35:22,021
Vì vậy còn có các loại dữ liệu khác,\n

14119
13:35:22,021 --> 13:35:25,231
mang đến cho chúng tôi nhiều\nthêm sức mạnh và khả năng

14120
13:35:25,232 --> 13:35:28,022
những thứ được gọi là phạm vi,\nnhư chúng ta vừa thấy, danh sách

14121
13:35:28,021 --> 13:35:30,601
như tôi đã gọi bằng lời,\nvới dấu ngoặc vuông

14122
13:35:30,601 --> 13:35:33,421
những thứ được gọi là bộ dữ liệu, cho\nnhững thứ như x dấu phẩy y

14123
13:35:33,421 --> 13:35:36,826
hoặc vĩ độ, kinh độ,\ntừ điển hoặc Dicts

14124
13:35:36,826 --> 13:35:40,261
cho phép bạn lưu trữ chìa khóa và\n

14125
13:35:40,262 --> 13:35:43,495
từ lần trước và sau đó đặt vào\n

14126
13:35:43,495 --> 13:35:46,412
tạo bản sao cho bạn và bạn có thể\n

14127
13:35:46,411 --> 13:35:50,431
cả đống từ ngữ hay gì đó,\n

14128
13:35:50,432 --> 13:35:52,921
sẽ lọc ra các bản sao cho bạn.

14129
13:35:52,921 --> 13:35:56,506
Bây giờ sẽ có một vài chức năng\n

14130
13:35:56,506 --> 13:35:59,131
bánh xe phụ mà sau đó chúng ta\nsẽ nhanh chóng cất cánh

14131
13:35:59,131 --> 13:36:02,581
chỉ vì, như chúng ta sẽ thấy hôm nay, họ\n

14132
13:36:02,582 --> 13:36:05,726
người dùng nhập chính xác, không vô tình viết mã lỗi

14133
13:36:05,726 --> 13:36:08,851
ngay khi bạn đang cố gắng nhận được Xin chào,\n

14134
13:36:08,851 --> 13:36:12,572
Và chúng tôi sẽ cung cấp cho bạn các chức năng, không phải\n

14135
13:36:12,572 --> 13:36:15,152
nhưng một tập hợp con trong số này,\nget float, nhận Int

14136
13:36:15,152 --> 13:36:18,182
và nhận chuỗi, điều đó sẽ\tự động hóa quá trình nhận

14137
13:36:18,182 --> 13:36:21,932
đầu vào của người dùng theo cách còn hơn thế nữa\n

14138
13:36:21,932 --> 13:36:23,792
Nhưng chúng ta sẽ xem những lỗi đó có thể là gì.

14139
13:36:23,792 --> 13:36:26,641
Và cách chúng tôi sắp thực hiện\nđiều này có tinh thần tương tự như C.

14140
13:36:26,641 --> 13:36:30,902
Thay vì bao gồm\nCS50.h, giống như chúng ta đã làm trong C

14141
13:36:30,902 --> 13:36:33,812
bây giờ bạn sẽ\nbắt đầu nói nhập CS50.

14142
13:36:33,811 --> 13:36:37,081
Python hỗ trợ,\ntương tự như C, các thư viện

14143
13:36:37,082 --> 13:36:38,822
nhưng không còn tập tin tiêu đề nữa.

14144
13:36:38,822 --> 13:36:41,612
Bạn chỉ cần sử dụng tên\nthư viện trong Python.

14145
13:36:41,612 --> 13:36:44,972
Và nếu bạn muốn nhập CS50\n

14146
13:36:44,972 --> 13:36:48,991
Hoặc, nếu bạn muốn chính xác hơn, và\n

14147
13:36:48,991 --> 13:36:52,381
có thể chậm, nếu bạn thực sự có\n

14148
13:36:52,381 --> 13:36:56,252
trong đó, bạn có thể chính xác hơn và\n

14149
13:36:56,252 --> 13:37:00,002
Từ nhập CS50 lấy Int,\ntừ nhập CSM 50 lấy chuỗi

14150
13:37:00,002 --> 13:37:02,792
hoặc bạn chỉ có thể phân tách chúng bằng dấu phẩy và nhập 3

14151
13:37:02,792 --> 13:37:07,072
và chỉ có 3 thứ từ một\nthư viện cụ thể, như thư viện của chúng tôi.

14152
13:37:07,072 --> 13:37:08,822
Nhưng bắt đầu từ hôm nay và\sau này, chúng ta sẽ

14153
13:37:08,822 --> 13:37:11,972
để bắt đầu làm nhiều hơn nữa\việc sử dụng nhiều thư viện, mã

14154
13:37:11,972 --> 13:37:15,092
mà người khác đã viết, vậy nên\n

14155
13:37:15,091 --> 13:37:18,396
Chúng tôi không tạo danh sách liên kết của riêng mình,\n

14156
13:37:18,396 --> 13:37:20,771
Chúng ta sẽ bắt đầu đứng\trên vai người khác

14157
13:37:20,771 --> 13:37:23,641
để bạn có thể hoàn thành công việc thực sự\n, có thể nói là nhanh hơn

14158
13:37:23,641 --> 13:37:28,231
bằng cách xây dựng phần mềm của bạn trên\nmã của người khác.

14159
13:37:28,232 --> 13:37:31,632
Được rồi, thế là xong phần\tham quan cú pháp của ngôn ngữ

14160
13:37:31,631 --> 13:37:32,881
và các loại tính năng cốt lõi.

14161
13:37:32,881 --> 13:37:34,841
Chúng tôi sẽ sớm chuyển\nsang ứng dụng đó.

14162
13:37:34,841 --> 13:37:40,561
Nhưng hãy để tôi tạm dừng ở đây để xem liệu có\n

14163
13:37:48,726 --> 13:37:52,685
ĐỐI TƯỢNG: Tại sao Python\nkhông có toán tử tăng dần.

14164
13:37:52,684 --> 13:37:54,851
DAVID J. Malan: Tôi xin lỗi,\nnói lại đi, tại sao không

14165
13:37:54,851 --> 13:37:56,309
Python có những loại toán tử nào?

14166
13:37:56,309 --> 13:37:59,099
ĐỐI TƯỢNG: Tại sao Python\nkhông có toán tử tăng dần?

14167
13:37:59,099 --> 13:38:02,141
DAVID J. Malan: Xin lỗi, có người ho\n

14168
13:38:03,470 --> 13:38:05,262
DAVID J. Malan: Ồ,\ntoán tử tăng dần?

14169
13:38:05,262 --> 13:38:06,929
Thành thật mà nói, tôi phải kiểm tra lại lịch sử.

14170
13:38:06,928 --> 13:38:09,431
Python có xu hướng trở thành một\nngôn ngữ khá nhỏ.

14171
13:38:09,432 --> 13:38:12,612
Và nếu bạn có thể làm điều gì đó\ntheo cách này, có thể cho rằng cộng đồng

14172
13:38:12,612 --> 13:38:16,667
có xu hướng không cung cấp cho bạn nhiều\n

14173
13:38:16,667 --> 13:38:18,042
Có lẽ có một câu trả lời tốt hơn.

14174
13:38:18,042 --> 13:38:22,362
Và tôi sẽ xem liệu tôi có thể tìm hiểu và đăng\n không

14175
13:38:22,362 --> 13:38:26,391
Được rồi, trước khi chúng ta chuyển đổi\n

14176
13:38:26,391 --> 13:38:31,391
để tôi tiếp tục và xem xét chính xác\n

14177
13:38:31,391 --> 13:38:35,292
Trong thế giới của C, hãy nhớ rằng đó\n

14178
13:38:35,292 --> 13:38:40,752
Chúng tôi tạo một tệp có tên như Hello.c,\n

14179
13:38:41,921 --> 13:38:44,652
Hoặc, nếu bạn nghĩ lại tuần\nhai, khi chúng ta gần như bắt đầu lại

14180
13:38:44,652 --> 13:38:47,622
lớp của những gì Xin chào,\ncủa những gì make đang làm

14181
13:38:47,622 --> 13:38:50,832
bạn có thể gõ rõ ràng hơn\n

14182
13:38:50,832 --> 13:38:54,162
Kêu vang trong trường hợp của chúng tôi, dòng lệnh\narguments như dấu gạch ngang Ồ, xin chào

14183
13:38:54,161 --> 13:38:56,361
để chỉ định tên bạn muốn tạo.

14184
13:38:56,362 --> 13:38:58,182
Và sau đó bạn có thể chỉ định tên tập tin.

14185
13:38:58,182 --> 13:39:01,572
Sau đó, bạn có thể chỉ định\nthư viện nào bạn muốn liên kết.

14186
13:39:01,572 --> 13:39:03,072
Vì vậy, đó là một cách tiếp cận rất dài dòng.

14187
13:39:03,072 --> 13:39:05,451
Nhưng đó luôn là cách tiếp cận gồm hai bước.

14188
13:39:05,451 --> 13:39:08,201
Và vì vậy, ngay cả khi bạn đang\nlàm các bộ bài tập gần đây

14189
13:39:08,201 --> 13:39:11,921
rất có thể là bạn đã nhận ra điều đó bất cứ lúc nào\n

14190
13:39:11,921 --> 13:39:16,182
hoặc thực hiện thay đổi đối với mã của bạn\nvà thử kiểm tra lại mã của bạn

14191
13:39:16,182 --> 13:39:18,881
bạn liên tục thực hiện hai bước đó.

14192
13:39:18,881 --> 13:39:22,362
Tiến về phía trước với Python,\nit sẽ trở nên đơn giản hơn

14193
13:39:22,362 --> 13:39:24,131
và nó sẽ chỉ thế này thôi.

14194
13:39:24,131 --> 13:39:26,981
Tên tệp sắp thay đổi,\n

14195
13:39:26,982 --> 13:39:31,782
Nó sẽ giống như thế\n

14196
13:39:31,781 --> 13:39:34,512
Và đó chỉ là quy ước,\nsử dụng phần mở rộng tập tin khác.

14197
13:39:34,512 --> 13:39:37,302
Nhưng không có bước biên dịch nào cả.

14198
13:39:37,302 --> 13:39:40,692
Bạn chuyển ngay đến phần\thực thi mã của mình.

14199
13:39:40,692 --> 13:39:43,722
Và hóa ra Python là\n

14200
13:39:43,722 --> 13:39:48,671
chúng ta sẽ bắt đầu sử dụng, nó cũng\n

14201
13:39:48,671 --> 13:39:52,542
giả sử nó đã được cài đặt sẵn,\n

14202
13:39:52,542 --> 13:39:56,622
Điều này có nghĩa là Python nói chung\n

14203
13:39:57,881 --> 13:40:01,691
Và bằng cách đó, ý tôi là bạn có thể bỏ qua,\n

14204
13:40:02,891 --> 13:40:07,391
Không có bước thủ công nào trong thế giới\n

14205
13:40:07,391 --> 13:40:11,052
rồi biên dịch nó thành số không và số một,\n

14206
13:40:11,052 --> 13:40:13,391
Thay vào đó, những\nhai bước này sẽ bị thu gọn

14207
13:40:13,391 --> 13:40:19,091
vào ảo ảnh của một người, theo đó bạn,\n

14208
13:40:19,091 --> 13:40:22,721
và để máy tính\ntìm cách chuyển đổi nó

14209
13:40:22,722 --> 13:40:24,762
tới điều gì đó mà máy tính có thể hiểu được.

14210
13:40:24,762 --> 13:40:28,372
Và cách chúng tôi làm điều đó là thông qua điều này\n

14211
13:40:28,372 --> 13:40:30,432
Nhưng bây giờ, khi bạn có\nmã nguồn, nó sẽ

14212
13:40:30,432 --> 13:40:33,372
được chuyển vào một\ntrình thông dịch chứ không phải trình biên dịch.

14213
13:40:33,372 --> 13:40:35,922
Và điều tương tự tốt nhất về điều này\nis có lẽ chỉ để chỉ ra

14214
13:40:35,921 --> 13:40:38,472
rằng, trong thế giới con người, nếu\nbạn nói hoặc không nói

14215
13:40:38,472 --> 13:40:42,162
nhiều ngôn ngữ của con người, nó có thể\n

14216
13:40:42,161 --> 13:40:43,791
từ ngôn ngữ này sang ngôn ngữ khác.

14217
13:40:43,792 --> 13:40:46,692
Ví dụ: đây là từng bước\n

14218
13:40:46,692 --> 13:40:49,062
trong một cuốn danh bạ điện thoại,\không may thay lại bằng tiếng Tây Ban Nha.

14219
13:40:49,061 --> 13:40:51,881
Thật không may, nếu bạn không nói hoặc đọc được tiếng Tây Ban Nha.

14220
13:40:53,082 --> 13:40:55,902
Bạn có thể chạy thuật toán này, nhưng bạn\n

14221
13:40:55,902 --> 13:40:58,652
hoặc bạn sẽ phải mở\n

14222
13:40:58,652 --> 13:40:59,982
sang tiếng Anh và chuyển đổi nó.

14223
13:40:59,982 --> 13:41:03,582
Và điều thú vị khi dịch\nbất kỳ ngôn ngữ nào, con người hay máy tính

14224
13:41:03,582 --> 13:41:07,372
hay nói cách khác là bạn đang đi\n

14225
13:41:07,372 --> 13:41:10,362
Và do đó chuyển đổi cái này bằng\ntiếng Tây Ban Nha sang cái này bằng tiếng Anh

14226
13:41:10,362 --> 13:41:12,881
sẽ khiến bạn\nlâu hơn nếu điều này đã xảy ra rồi

14227
13:41:14,974 --> 13:41:17,891
Và đó sẽ là một trong những\n

14228
13:41:17,891 --> 13:41:21,701
Có, đó là một tính năng mà bạn có thể\n

14229
13:41:21,701 --> 13:41:24,401
trước hết phải bận tâm đến việc biên dịch nó theo cách thủ công.

14230
13:41:25,572 --> 13:41:27,336
Và mọi thứ có thể chậm hơn một chút.

14231
13:41:27,336 --> 13:41:28,961
Bây giờ, có nhiều cách để loại bỏ điều đó.

14232
13:41:28,961 --> 13:41:30,336
Nhưng chúng ta sẽ thấy một ví dụ về nó.

14233
13:41:30,336 --> 13:41:33,222
Thực tế, bây giờ hãy để tôi chuyển sang\nchỉ một vài ví dụ

14234
13:41:33,222 --> 13:41:37,182
điều đó chứng minh Python\nkhông chỉ dễ dàng hơn đối với nhiều người như thế nào

14235
13:41:37,182 --> 13:41:39,762
để sử dụng, có lẽ chính bạn cũng vậy\nvì nó sẽ vứt đi

14236
13:41:39,762 --> 13:41:42,641
có rất nhiều cú pháp khó chịu,\nit rút ngắn số dòng

14237
13:41:42,641 --> 13:41:46,332
bạn phải viết, và nó cũng vậy\n

14238
13:41:46,332 --> 13:41:51,262
bạn có thể làm được nhiều hơn thế mà không cần\n

14239
13:41:51,262 --> 13:41:54,192
Vì vậy, để làm ví dụ cho điều này,\nhãy để tôi chuyển sang đây

14240
13:41:54,192 --> 13:42:00,612
vào hình ảnh này từ tập bài tập 4,\n

14241
13:42:01,811 --> 13:42:03,766
Và đây là ảnh gốc\n, khá rõ ràng

14242
13:42:03,766 --> 13:42:06,891
và nó thậm chí còn có độ phân giải cao hơn nếu chúng ta nhìn\n

14243
13:42:06,891 --> 13:42:10,182
Nhưng chưa có bộ lọc nào, a\n

14244
13:42:10,182 --> 13:42:13,271
Hãy nhớ lại, đối với bài tập số bốn, bạn\n

14245
13:42:13,271 --> 13:42:14,981
Và trong số đó có thể đã bị mờ.

14246
13:42:14,982 --> 13:42:18,132
Và độ mờ có lẽ là một trong những thử thách\nnhiều hơn

14247
13:42:18,131 --> 13:42:20,711
bởi vì bạn phải lặp lại\không phải tất cả các pixel

14248
13:42:20,711 --> 13:42:23,652
bạn phải tính đến những gì\n

14249
13:42:24,012 --> 13:42:25,970
Ý tôi là, có rất nhiều môn toán và số học.

14250
13:42:25,970 --> 13:42:29,141
Và nếu cuối cùng bạn đã hiểu được thì đó là\n

14251
13:42:29,141 --> 13:42:31,302
Nhưng đó có lẽ là\nvài giờ sau.

14252
13:42:31,302 --> 13:42:34,062
Trong một ngôn ngữ như\nPython, nơi có thể có

14253
13:42:34,061 --> 13:42:37,691
là những thư viện được viết\nbởi những người khác, trên vai họ

14254
13:42:37,692 --> 13:42:40,402
bạn có thể đứng,\nchúng ta có thể làm điều gì đó như thế này.

14255
13:42:40,402 --> 13:42:44,802
Hãy để tôi tiếp tục và chạy một chương trình, hoặc\n

14256
13:42:44,802 --> 13:42:48,652
Và trong Blur.py, trong VS\nCode, hãy để tôi làm điều này.

14257
13:42:48,652 --> 13:42:51,891
Hãy để tôi nhập từ thư viện,\nkhông phải thư viện CS50

14258
13:42:51,891 --> 13:42:56,141
nhưng thư viện Gối, có thể nói như vậy, một từ khóa có tên là hình ảnh

14259
13:42:56,141 --> 13:42:59,851
và một cái khác tên là image\nfilter, vậy hãy để tôi tiếp tục

14260
13:42:59,851 --> 13:43:02,941
và nói, hãy để tôi mở\nphiên bản hiện tại của hình ảnh này,

14261
13:43:04,262 --> 13:43:06,781
Vì vậy phiên bản trước\ncủa hình ảnh sẽ là

14262
13:43:06,781 --> 13:43:11,072
kết quả của việc gọi image.open\nquote unquote "Bridge.bmp

14263
13:43:11,072 --> 13:43:13,561
và sau đó, hãy để tôi tạo\nan sau phiên bản này.

14264
13:43:13,561 --> 13:43:15,362
Vì vậy, bạn sẽ thấy trước và sau.

14265
13:43:15,362 --> 13:43:21,531
Sau bằng phiên bản trước\n.filter của bộ lọc hình ảnh.

14266
13:43:21,531 --> 13:43:23,281
Và có, nếu tôi\nđọc tài liệu

14267
13:43:23,281 --> 13:43:25,574
Tôi sẽ thấy có một thứ\ngọi là hộp mờ, cái đó

14268
13:43:25,574 --> 13:43:28,682
cho phép bạn làm mờ ở định dạng hộp\n, như một pixel ở trên

14269
13:43:30,271 --> 13:43:31,888
Vì vậy, tôi sẽ làm một pixel ở đó.

14270
13:43:31,889 --> 13:43:34,472
Và sau khi hoàn tất, hãy để\ntôi tiếp tục và lưu tệp

14271
13:43:38,701 --> 13:43:41,432
Giả sử thư viện này\nhoạt động như mô tả

14272
13:43:41,432 --> 13:43:44,582
Tôi đang mở tệp\nin Python, sử dụng dòng 3.

14273
13:43:44,582 --> 13:43:46,202
Và đây là cú pháp hơi mới.

14274
13:43:46,201 --> 13:43:49,771
Trong thế giới của Python, chúng ta sẽ\n

14275
13:43:49,771 --> 13:43:51,841
hơn thế nữa, bởi vì trong\nthế giới của Python, bạn có

14276
13:43:51,841 --> 13:43:56,221
cái được gọi là hướng đối tượng\n

14277
13:43:56,222 --> 13:43:58,991
Và điều này có nghĩa là\nbạn vẫn có các chức năng

14278
13:43:58,991 --> 13:44:01,502
bạn vẫn có các biến,\nnhưng đôi khi các hàm đó

14279
13:44:01,502 --> 13:44:05,372
được nhúng bên trong các biến\n, hay cụ thể hơn là

14280
13:44:05,372 --> 13:44:07,232
bên trong các kiểu dữ liệu.

14281
13:44:07,232 --> 13:44:10,952
Nghĩ lại C. Khi bạn muốn\n

14282
13:44:10,951 --> 13:44:15,103
có một hàm tới trên dùng\n

14283
13:44:15,103 --> 13:44:18,061
Và bạn có thể chuyển vào bất kỳ ký tự nào bạn\n

14284
13:44:19,411 --> 13:44:22,681
Chà, bạn biết không, nếu đó\nlà một mô hình phổ biến, thì ở đâu

14285
13:44:22,682 --> 13:44:26,372
ký tự viết hoa rất hữu ích\n

14286
13:44:26,372 --> 13:44:30,992
nó được nhúng vào kiểu chuỗi\ndata hay char nếu bạn muốn

14287
13:44:30,991 --> 13:44:35,761
khả năng viết hoa bất kỳ ký tự nào\n

14288
13:44:35,762 --> 13:44:38,672
như thể nó là một cấu trúc\nin C. Hãy nhớ lại rằng các cấu trúc

14289
13:44:38,671 --> 13:44:40,921
đóng gói nhiều loại giá trị.

14290
13:44:40,921 --> 13:44:44,131
Trong lập trình hướng đối tượng,\nmột ngôn ngữ như Python

14291
13:44:44,131 --> 13:44:48,031
bạn có thể gói gọn không chỉ\ngiá trị mà còn cả chức năng.

14292
13:44:48,031 --> 13:44:50,339
Các hàm bây giờ có thể nằm bên trong các cấu trúc.

14293
13:44:50,339 --> 13:44:52,381
Nhưng chúng ta sẽ không\ngọi chúng là cấu trúc nữa.

14294
13:44:52,381 --> 13:44:53,792
Chúng ta sẽ gọi chúng là đồ vật.

14295
13:44:53,792 --> 13:44:55,652
Nhưng đó chỉ là một ngôn ngữ khác.

14296
13:44:57,391 --> 13:45:00,391
Bên trong thư viện hình ảnh\ncó một chức năng tên là open

14297
13:45:00,391 --> 13:45:03,152
và cần có một đối số,\ntên của tệp, để mở.

14298
13:45:03,152 --> 13:45:06,781
Khi tôi có một biến được gọi trước đó,\n

14299
13:45:06,781 --> 13:45:09,811
một đối tượng, bên trong\nlà hiện tại, bởi vì nó

14300
13:45:09,811 --> 13:45:12,661
được trả về từ hàm\n này, một hàm

14301
13:45:12,661 --> 13:45:14,801
được gọi là bộ lọc, nó cần một đối số.

14302
13:45:14,802 --> 13:45:18,182
Đối số ở đây xảy ra\nlà image.boxblur1

14303
13:45:19,351 --> 13:45:21,324
Nhưng nó chỉ trả về bộ lọc để sử dụng.

14304
13:45:21,324 --> 13:45:23,491
Và sau đó, hãy chấm lưu\nthực hiện những gì bạn nghĩ.

14305
13:45:24,671 --> 13:45:27,991
Vì vậy, thay vì sử dụng fopen và\nfwrite, bạn chỉ cần nói dot save

14306
13:45:27,991 --> 13:45:31,031
và điều đó sẽ thực hiện tất cả\ncông việc lộn xộn đó cho bạn.

14307
13:45:31,031 --> 13:45:33,752
Vậy tổng cộng chỉ có bốn\ndòng mã thôi?

14308
13:45:33,752 --> 13:45:36,762
Hãy để tôi tiếp tục và đi\nxuống cửa sổ terminal của tôi.

14309
13:45:36,762 --> 13:45:40,055
Hãy để tôi tiếp tục và cho bạn thấy\nvới LS rằng, vào lúc này

14310
13:45:40,055 --> 13:45:41,972
rất tiếc, xin lỗi, cho phép tôi\nkhông cần phải hiển thị điều đó

14311
13:45:41,972 --> 13:45:43,682
bởi vì tôi còn có những ví dụ khác sắp tới.

14312
13:45:43,682 --> 13:45:50,832
Tôi sẽ tiếp tục và làm Python\n

14313
13:45:50,832 --> 13:45:52,092
Tôi thực sự cần phải ra lệnh.

14314
13:45:52,802 --> 13:45:55,862
Được rồi, để tôi tiếp tục gõ LS\n

14315
13:45:55,862 --> 13:45:58,082
là một trong những mã mẫu trực tuyến hiện nay.

14316
13:45:58,082 --> 13:46:01,322
Chỉ có một tập tin\ntên là Bridge.bmp, chết tiệt

14317
13:46:01,322 --> 13:46:04,152
Tôi đang cố gắng chuẩn bị sẵn sàng những thứ này cùng lúc.

14318
13:46:05,252 --> 13:46:08,641
Hãy để tôi di chuyển mã này vào vị trí.

14319
13:46:08,641 --> 13:46:11,231
Được rồi, tôi đã tiếp tục\nvà di chuyển tệp này, Blur.py

14320
13:46:11,232 --> 13:46:13,712
vào một thư mục có tên\nfilter, bên trong thư mục đó

14321
13:46:13,711 --> 13:46:18,601
có một tệp khác tên là Bridge.bmp,\n

14322
13:46:18,601 --> 13:46:20,911
Bây giờ hãy để tôi tiếp tục\nvà chạy Python,

14323
13:46:20,911 --> 13:46:23,221
là thông dịch viên của tôi và cũng\ntên của ngôn ngữ

14324
13:46:23,222 --> 13:46:25,512
và chạy Python trên tệp này.

14325
13:46:25,512 --> 13:46:27,870
Rất giống việc chạy\nthuật toán tiếng Tây Ban Nha

14326
13:46:27,870 --> 13:46:29,912
thông qua Google Dịch,\hoặc những thứ tương tự

14327
13:46:29,911 --> 13:46:32,171
làm đầu vào, để lấy lại\nđầu ra tiếng Anh

14328
13:46:32,171 --> 13:46:36,061
điều này sẽ dịch ngôn ngữ\nPython sang thứ gì đó

14329
13:46:36,061 --> 13:46:38,281
máy tính này hoặc môi trường dựa trên\nđám mây này

14330
13:46:38,281 --> 13:46:41,591
hiểu rồi chạy\nmã tương ứng, từ trên xuống dưới

14331
13:46:42,228 --> 13:46:43,561
Tôi sẽ tiếp tục và Enter.

14332
13:46:43,561 --> 13:46:45,451
Không có thông báo lỗi\nnói chung là điều tốt.

14333
13:46:45,451 --> 13:46:48,481
Nếu tôi gõ LS bây giờ bạn sẽ thấy out.bmp.

14334
13:46:48,482 --> 13:46:49,817
Hãy để tôi tiếp tục và mở nó ra.

14335
13:46:49,817 --> 13:46:52,442
Và bạn biết không, chỉ để\nlàm rõ điều gì đang thực sự xảy ra

14336
13:46:52,442 --> 13:46:53,609
hãy để tôi làm mờ nó hơn nữa.

14337
13:46:53,608 --> 13:46:57,072
Hãy tạo một hộp không chỉ có\n1 pixel xung quanh mà có 10 pixel.

14338
13:46:58,472 --> 13:47:01,351
Và hãy để tôi tiếp tục\nchạy lại nó bằng Python của Blur.py.

14339
13:47:03,841 --> 13:47:08,621
Hãy để tôi tiếp tục và mở Out.bmp\nvà hiển thị cho bạn phần trước

14340
13:47:11,072 --> 13:47:14,341
Và bây giờ, tôi bắt chéo ngón tay,\nbốn dòng mã sau

14341
13:47:14,341 --> 13:47:16,279
kết quả của việc làm mờ nó là tốt.

14342
13:47:16,279 --> 13:47:18,572
Vì vậy, thư viện đang thực hiện tất cả những công việc giống nhau

14343
13:47:18,572 --> 13:47:20,641
mà tất cả các bạn đã làm\nbài tập, nhưng đó là

14344
13:47:20,641 --> 13:47:24,824
gói gọn tất cả thành một\n

14345
13:47:24,824 --> 13:47:27,241
Những người trong số các bạn có thể đã\ncảm thấy thoải mái hơn

14346
13:47:27,241 --> 13:47:29,116
có thể đã làm một chút\nđiều gì đó như thế này.

14347
13:47:29,116 --> 13:47:33,421
Hãy để tôi tiếp tục và mở một\ntệp khác, có tên là Edges.py.

14348
13:47:33,421 --> 13:47:36,811
Và trong Edges.py, tôi lại tiếp tục\n

14349
13:47:36,811 --> 13:47:39,531
từ khóa hình ảnh và bộ lọc hình ảnh.

14350
13:47:39,531 --> 13:47:42,031
Sau đó tôi sẽ tiếp tục và\ntạo một hình ảnh trước đó, đó là

14351
13:47:42,031 --> 13:47:46,112
kết quả của việc gọi image.open\ncủa điều tương tự, Bridge.bmp

14352
13:47:46,112 --> 13:47:53,432
sau đó tôi sẽ tiếp tục và chạy một\n

14353
13:47:53,432 --> 13:47:58,372
bộ lọc hình ảnh.tìm các cạnh, giống như một nội dung, nếu bạn muốn

14354
13:47:58,372 --> 13:48:00,230
được xác định bên trong thư viện này cho chúng tôi.

14355
13:48:00,230 --> 13:48:02,272
Và sau đó tôi sẽ thực hiện\nafter.save trích dẫn bỏ trích dẫn

14356
13:48:02,271 --> 13:48:04,731
Out.bmp," sử dụng cùng tên tệp.

14357
13:48:04,732 --> 13:48:13,012
Bây giờ tôi sẽ chạy Python của\n

14358
13:48:13,012 --> 13:48:15,452
Chúng ta sẽ sớm biết lỗi cú pháp có nghĩa là gì.

14359
13:48:15,451 --> 13:48:17,991
Hãy để tôi tiếp tục và chạy\nmã ngay bây giờ, Edges.py.

14360
13:48:17,991 --> 13:48:21,351
Bây giờ hãy để tôi mở tệp mới đó, Out.bmp.

14361
13:48:21,351 --> 13:48:26,031
Và trước khi chúng tôi có cái này, và bây giờ,\n

14362
13:48:26,031 --> 13:48:28,731
nếu chúng ta thực hiện phiên bản\nthoải mái hơn của P set 4

14363
13:48:28,732 --> 13:48:31,862
Bây giờ chúng ta có được điều này,\nchỉ sau bốn dòng mã.

14364
13:48:31,862 --> 13:48:34,641
Vì vậy, một lần nữa, gợi ý sức mạnh\ncủa việc sử dụng ngôn ngữ tốt hơn

14365
13:48:34,641 --> 13:48:36,082
được tối ưu hóa cho công cụ trong tầm tay.

14366
13:48:36,082 --> 13:48:39,472
Và trước nguy cơ thực sự\nlàm mọi người buồn, chúng ta hãy tiếp tục

14367
13:48:39,472 --> 13:48:43,342
và triển khai lại, nếu có thể,\n

14368
13:48:43,341 --> 13:48:47,601
Hãy để tôi tiếp tục và mở\nanphiên bản khác của mã này

14369
13:48:47,601 --> 13:48:50,828
trong đó tôi có phiên bản C\n, chỉ do vấn đề

14370
13:48:50,828 --> 13:48:52,911
đặt năm, trong đó bạn\ni đã triển khai trình kiểm tra chính tả

14371
13:48:52,911 --> 13:48:55,161
tải hơn 100.000 từ vào bộ nhớ.

14372
13:48:55,161 --> 13:48:58,911
Và sau đó bạn chỉ theo dõi\n

14373
13:48:58,911 --> 13:49:00,861
Và việc đó có lẽ phải mất\na một khoảng thời gian để triển khai

14374
13:49:00,862 --> 13:49:03,052
tất cả các chức năng đó trong Wikipedia.c.

14375
13:49:03,052 --> 13:49:08,762
Thay vào đó, bây giờ hãy để tôi đi vào một\ntệp mới, có tên là Directory.py.

14376
13:49:08,762 --> 13:49:11,722
Và hãy để tôi quy định, nhằm mục đích thảo luận

14377
13:49:11,722 --> 13:49:14,182
mà chúng tôi đã viết trước\nin, Speller.py

14378
13:49:14,182 --> 13:49:16,372
tương ứng với Speller.c.

14379
13:49:16,372 --> 13:49:17,902
Bạn đã không viết một trong những điều đó.

14380
13:49:17,902 --> 13:49:20,122
Hãy nhớ lại bộ vấn đề\nnăm, chúng tôi đã cung cấp cho bạn Speller.c.

14381
13:49:20,122 --> 13:49:22,080
Giả sử rằng chúng tôi sắp cung cấp cho bạn Speller.py.

14382
13:49:22,080 --> 13:49:28,552
Vì vậy, trách nhiệm của chúng tôi lúc này chỉ là\n

14383
13:49:28,552 --> 13:49:31,462
Được rồi, tôi sẽ tiếp tục và xác định một vài hàm.

14384
13:49:31,461 --> 13:49:34,521
Và bây giờ chúng ta sẽ xem cú pháp\n

14385
13:49:34,521 --> 13:49:38,752
Tôi muốn tiếp tục và định nghĩa\nđầu tiên một bảng băm, trong đó

14386
13:49:38,752 --> 13:49:41,362
là điều đầu tiên\nbạn định nghĩa trong Từ điển.c.

14387
13:49:41,362 --> 13:49:46,491
Vậy tôi sẽ tiếp tục và nói\n

14388
13:49:46,491 --> 13:49:48,205
còn được gọi là bảng băm.

14389
13:49:48,205 --> 13:49:50,122
Được rồi, bây giờ hãy để tôi\nđịnh nghĩa một hàm tên là

14390
13:49:50,122 --> 13:49:53,152
hãy kiểm tra xem đây là chức năng đầu tiên\nbạn có thể đã triển khai.

14391
13:49:53,152 --> 13:49:55,522
Kiểm tra sẽ lấy một từ,\nvà bạn sẽ thấy trong Python

14392
13:49:55,521 --> 13:49:56,896
cú pháp hơi khác một chút.

14393
13:49:56,896 --> 13:49:58,401
Bạn không chỉ định kiểu trả về.

14394
13:49:58,402 --> 13:50:01,132
Thay vào đó bạn dùng từ Def để định nghĩa.

14395
13:50:01,131 --> 13:50:05,061
Bạn vẫn chỉ định tên của\n

14396
13:50:05,061 --> 13:50:07,731
Nhưng bạn bỏ qua bất kỳ đề cập đến các loại.

14397
13:50:07,732 --> 13:50:09,802
Nhưng bạn sử dụng dấu hai chấm và thụt lề.

14398
13:50:09,802 --> 13:50:14,302
Vậy làm cách nào để kiểm tra xem một từ có trong\n không

14399
13:50:14,302 --> 13:50:17,962
Chà, trong Python, tôi có thể\nchỉ cần nói, if word in word

14400
13:50:17,961 --> 13:50:23,091
tiếp tục và trả về true, ngược lại\ntiếp tục và trả về sai, xong

14401
13:50:24,470 --> 13:50:26,161
Được rồi, bây giờ tôi muốn làm như tải.

14402
13:50:26,161 --> 13:50:29,161
Đó là công việc nặng nhọc, nơi bạn\n

14403
13:50:29,161 --> 13:50:30,828
Vì vậy, hãy để tôi định nghĩa một hàm gọi là tải.

14404
13:50:30,828 --> 13:50:33,171
Phải mất một chuỗi, tên\ncủa tệp để tải.

14405
13:50:33,171 --> 13:50:36,502
Vì vậy tôi sẽ gọi nó là Từ điển,\ngiống như trong C, nhưng không có kiểu dữ liệu.

14406
13:50:36,502 --> 13:50:40,701
Hãy để tôi tiếp tục và mở một tệp bằng\n

14407
13:50:40,701 --> 13:50:43,261
bằng cách mở Từ điển đó ở chế độ đọc.

14408
13:50:43,262 --> 13:50:46,882
Vì vậy, cái này hơi giống với fopen,\n

14409
13:50:46,881 --> 13:50:49,401
Sau đó, hãy để tôi lặp lại\nmọi dòng trong tệp.

14410
13:50:49,402 --> 13:50:54,322
Trong Python, điều này khá thú vị,\n

14411
13:50:54,322 --> 13:50:59,031
Làm thế nào bây giờ tôi có thể đến được hiện tại\n

14412
13:50:59,031 --> 13:51:02,091
bởi vì trong tệp\nwords này có 140.000 từ

14413
13:51:02,091 --> 13:51:05,273
có dấu gạch chéo ngược của từ n,\ndấu gạch chéo ngược của từ n, được chứ?

14414
13:51:05,273 --> 13:51:07,731
Được rồi, để tôi tiếp tục và lấy\na từ ở dòng hiện tại

14415
13:51:07,732 --> 13:51:11,362
nhưng cởi bỏ, từ đầu bên phải\n

14416
13:51:11,362 --> 13:51:14,061
hàm Rstrip\nin Python làm cho tôi.

14417
13:51:14,061 --> 13:51:18,891
Vậy hãy để tôi tiếp tục và thêm vào\n của tôi

14418
13:51:19,552 --> 13:51:22,057
Hãy để tôi tiếp tục và đóng\ntệp cho phù hợp.

14419
13:51:22,057 --> 13:51:24,682
Và sau đó hãy để tôi tiếp tục và\ntrả về sự thật, bởi vì tất cả đều ổn.

14420
13:51:24,682 --> 13:51:26,842
Vậy là xong về hàm tải\n trong Python.

14421
13:51:26,841 --> 13:51:28,101
Làm thế nào về chức năng kích thước?

14422
13:51:28,101 --> 13:51:31,341
Điều này không có bất kỳ đối số nào, nó\n

14423
13:51:32,512 --> 13:51:36,502
Tôi có thể làm điều đó bằng cách trả lại\n

14424
13:51:36,502 --> 13:51:41,182
Và cuối cùng, rời khỏi\n

14425
13:51:42,612 --> 13:51:45,472
Vì vậy, dù tôi có làm gì đi nữa,\ncũng chẳng có gì để dỡ bỏ.

14426
13:51:45,472 --> 13:51:47,342
Máy tính sẽ làm điều đó cho tôi.

14427
13:51:47,341 --> 13:51:51,381
Vì vậy, tôi cung cấp cho bạn, trong các hàm này,\nbộ vấn đề năm trong Python.

14428
13:51:51,381 --> 13:51:53,542
Vì vậy, tôi xin lỗi, chúng tôi đã bắt\nbạn viết nó bằng C trước.

14429
13:51:53,542 --> 13:51:57,141
Nhưng hàm ý bây giờ là\nbạn nhận được gì miễn phí

14430
13:51:58,372 --> 13:52:00,891
Vâng, được gói gọn trong\nmột dòng mã này

14431
13:52:00,891 --> 13:52:04,792
phần lớn là những gì bạn đã viết cho\nbộ vấn đề thứ năm, triển khai

14432
13:52:04,792 --> 13:52:07,792
mảng của bạn cho tất cả\ncác chữ cái trong bảng chữ cái hoặc nhiều hơn nữa

14433
13:52:07,792 --> 13:52:10,912
tất cả các danh sách liên kết mà bạn\ni đã thực hiện để tạo chuỗi

14434
13:52:10,911 --> 13:52:12,451
để lưu trữ tất cả những từ đó.

14435
13:52:13,582 --> 13:52:16,612
Chỉ là một người nào khác trên thế giới\nđã viết mã đó cho bạn.

14436
13:52:16,612 --> 13:52:19,582
Và bây giờ bạn có thể sử dụng nó\nbằng từ điển.

14437
13:52:19,582 --> 13:52:22,072
Và thực ra, tôi có thể\nthay đổi điều này một chút

14438
13:52:22,072 --> 13:52:25,192
bởi vì về mặt kỹ thuật, add không phải là chức năng phù hợp để sử dụng ở đây.

14439
13:52:25,192 --> 13:52:28,141
Thực ra tôi đang xử lý từ điển\n

14440
13:52:28,141 --> 13:52:31,942
Vì vậy tôi sẽ thực hiện một điều chỉnh, đặt\n

14441
13:52:31,942 --> 13:52:34,222
Nhưng thiết lập chỉ cho phép nó\nxử lý các bản sao

14442
13:52:34,222 --> 13:52:36,952
và nó cho phép tôi ném\nmọi thứ vào đó theo nghĩa đen

14443
13:52:36,951 --> 13:52:38,841
sử dụng một chức năng đơn giản như thêm.

14444
13:52:38,841 --> 13:52:41,691
Và tôi sẽ thực hiện\không điều chỉnh gì khác ở đây

14445
13:52:41,692 --> 13:52:46,312
bởi vì, khi tôi đang kiểm tra một từ,\n

14446
13:52:46,311 --> 13:52:49,042
với tôi bằng chữ in hoa hoặc viết hoa.

14447
13:52:49,042 --> 13:52:52,402
Nó không nhất thiết phải đến\n

14448
13:52:53,991 --> 13:52:58,911
Tôi có thể buộc mọi từ chuyển sang\nchữ thường bằng cách sử dụng word.low.

14449
13:52:58,911 --> 13:53:01,021
Và tôi không phải làm điều đó\nký tự cho ký tự

14450
13:53:01,021 --> 13:53:06,322
Tôi có thể thực hiện toàn bộ chuỗi chết tiệt này tại\n

14451
13:53:06,322 --> 13:53:09,381
Được rồi, hãy để tôi tiếp tục\nmở một cửa sổ terminal ở đây.

14452
13:53:09,381 --> 13:53:12,639
Và trước tiên hãy để tôi đi vào\nphiên bản C của tôi, ở bên trái.

14453
13:53:12,639 --> 13:53:15,682
Và thực ra tôi sẽ tiếp tục\n

14454
13:53:15,682 --> 13:53:20,529
Và ở bên phải, tôi sẽ đi vào\n

14455
13:53:20,529 --> 13:53:23,362
Nhưng nó cũng có sẵn trực tuyến, nếu\n

14456
13:53:23,362 --> 13:53:26,692
Tôi sẽ tiếp tục và\nviết chính tả bằng chữ C ở bên trái

14457
13:53:26,692 --> 13:53:28,792
và lưu ý rằng phải mất\na chút thời gian để biên dịch.

14458
13:53:28,792 --> 13:53:33,052
Sau đó tôi sẽ sẵn sàng\nchạy chương trình đánh vần từ điển

14459
13:53:33,052 --> 13:53:35,852
chúng ta hãy làm như văn bản Sherlock\nHolmes, nó khá lớn.

14460
13:53:35,851 --> 13:53:40,491
Và sau đó ở đây, để tôi chuẩn bị\nsẵn sàng chạy Python của Speller

14461
13:53:44,254 --> 13:53:46,671
Vì vậy, cú pháp hơi khác một chút ở dấu nhắc lệnh.

14462
13:53:46,671 --> 13:53:49,402
Tôi chỉ, ở bên trái, phải\nbiên dịch mã, với make

14463
13:53:49,402 --> 13:53:51,171
và sau đó chạy nó với ./speller.

14464
13:53:51,171 --> 13:53:52,891
Ở bên phải, tôi\nkhông cần phải biên dịch nó.

14465
13:53:52,891 --> 13:53:54,381
Nhưng tôi cần sử dụng thông dịch viên.

14466
13:53:54,381 --> 13:53:56,752
Vì vậy, mặc dù các dòng\nđóng gói ở đây một chút

14467
13:53:56,752 --> 13:53:58,701
hãy để tôi tiếp tục và chạy nó ở bên phải.

14468
13:53:58,701 --> 13:54:00,826
Và tôi sẽ đếm xem\nsẽ mất bao lâu, bằng lời nói

14469
13:54:02,091 --> 13:54:05,241
Một Mississippi, hai Mississippi,\nba Mississippi, OK

14470
13:54:05,241 --> 13:54:07,711
vì vậy, khoảng ba\ngiây, cho hoặc nhận.

14471
13:54:07,711 --> 13:54:10,042
Hiện đang chạy nó trong\nPython, xin lưu ý

14472
13:54:10,042 --> 13:54:13,625
Tôi đã dành ít thời gian hơn để triển khai trình kiểm tra chính tả\na trong Python

14473
13:54:13,625 --> 13:54:15,292
hơn những gì bạn có thể gặp phải trong tập bài toán thứ năm.

14474
13:54:15,292 --> 13:54:18,529
Nhưng sự đánh đổi sẽ là gì,\n

14475
13:54:18,529 --> 13:54:20,362
bây giờ tất cả chúng ta có cần\nlàm việc một cách có ý thức không?

14476
13:54:20,362 --> 13:54:22,822
Ở đây chúng ta bắt đầu, ở bên phải, bằng Python.

14477
13:54:22,822 --> 13:54:26,542
Một Mississippi, hai Mississippi,\n

14478
13:54:26,542 --> 13:54:30,592
năm Mississippi, sáu Mississippi,\n

14479
13:54:30,591 --> 13:54:33,621
chín Mississippi, 10\nMississippi, 11 Mississippi

14480
13:54:33,622 --> 13:54:36,512
được rồi, vậy là 10 hoặc 11 giây.

14481
13:54:38,502 --> 13:54:43,072
Chúng ta hãy đi đến nhóm ở đây\n

14482
13:54:43,072 --> 13:54:47,302
Bạn có thể trả lời câu hỏi đó như thế nào,\n

14483
13:54:48,052 --> 13:54:50,260
ĐỐI TƯỢNG: Tôi nghĩ Python\ntốt hơn cho lập trình viên

14484
13:54:50,260 --> 13:54:54,368
thoải mái hơn cho lập trình viên,\n

14485
13:54:54,368 --> 13:54:56,201
DAVID J. Malan: Được rồi, vậy\nPython, để tóm tắt

14486
13:54:56,201 --> 13:54:59,981
thì tốt hơn cho người lập trình,\n

14487
13:54:59,982 --> 13:55:02,982
nhưng C có lẽ tốt hơn cho máy tính,\n

14488
13:55:02,982 --> 13:55:04,649
Tôi nghĩ đó là một công thức hợp lý.

14489
13:55:07,110 --> 13:55:09,402
ĐỐI TƯỢNG: Tôi nghĩ điều đó phụ thuộc\không vào quy mô của dự án

14490
13:55:10,432 --> 13:55:12,807
Vì vậy, nếu có việc gì đó\nđiều đó tương đối nhanh chóng

14491
13:55:12,807 --> 13:55:15,232
Tôi có thể không quan tâm rằng phải mất 10 giây để làm điều đó.

14492
13:55:15,232 --> 13:55:17,432
Và có thể nhanh hơn\nđể thực hiện điều đó bằng Python.

14493
13:55:17,432 --> 13:55:20,592
Trong khi đó với C, nếu tôi đang giao dịch\n

14494
13:55:20,591 --> 13:55:24,822
bộ hoặc thứ gì đó to lớn thì đó\n

14495
13:55:24,822 --> 13:55:29,262
có thể đáng để đưa vào\n

14496
13:55:29,262 --> 13:55:32,781
nên tiến trình sẽ chạy liên tục\n

14497
13:55:32,781 --> 13:55:33,951
DAVID J. Malan: Hoàn toàn có,\na câu trả lời thực sự hay.

14498
13:55:33,951 --> 13:55:36,822
Và để tôi tóm tắt lại, có còn tùy không\n

14499
13:55:36,822 --> 13:55:40,572
Nếu bạn có một tập dữ liệu\nrất lớn, bạn có thể

14500
13:55:40,572 --> 13:55:43,650
muốn tối ưu hóa mã của bạn như\n

14501
13:55:43,650 --> 13:55:45,942
đặc biệt nếu bạn chạy đi chạy lại\nmã đó.

14502
13:55:45,942 --> 13:55:47,472
Có thể bạn là một công ty như Google.

14503
13:55:47,472 --> 13:55:49,632
Mọi người luôn tìm kiếm một cơ sở dữ liệu lớn.

14504
13:55:49,631 --> 13:55:52,271
Bạn thực sự muốn tận dụng\n từng chút hiệu suất

14505
13:55:52,271 --> 13:55:53,743
như bạn có thể ra khỏi máy tính.

14506
13:55:53,743 --> 13:55:56,201
Bạn có thể muốn nhờ ai đó\nthông minh học một ngôn ngữ như C

14507
13:55:56,201 --> 13:55:57,971
và viết nó ở mức rất thấp.

14508
13:55:59,921 --> 13:56:02,671
Họ sẽ phải giải quyết\n

14509
13:56:02,671 --> 13:56:06,011
Nhưng nếu và khi nó hoạt động bình thường thì đó\n

14510
13:56:06,012 --> 13:56:08,802
Ngược lại, nếu bạn có\na tập dữ liệu lớn

14511
13:56:08,802 --> 13:56:12,342
và 140.000 từ\nkhông hề nhỏ, nhưng bạn thì không

14512
13:56:12,341 --> 13:56:15,461
muốn dành khoảng 5 giờ,\n10 giờ, một tuần thời gian của bạn

14513
13:56:15,461 --> 13:56:17,584
xây dựng trình kiểm tra chính tả hoặc từ điển

14514
13:56:17,584 --> 13:56:20,502
thay vào đó bạn có thể tận dụng một thứ khác\n

14515
13:56:20,502 --> 13:56:25,211
và xây dựng trên đó, để\n

14516
13:56:27,362 --> 13:56:29,310
KHÁN GIẢ: Bạn có muốn không,\nvì với Python

14517
13:56:29,311 --> 13:56:33,450
chẳng phải nó cũng thích\nchuyển đổi từ ngữ sao, hay thích

14518
13:56:33,449 --> 13:56:35,060
chuyển đổi các từ, cho một bài học?

14519
13:56:35,061 --> 13:56:37,103
Khi chúng tôi chuyển đổi lại thành\nphiên bản tương tự

14520
13:56:37,103 --> 13:56:40,670
chúng ta chỉ xem xét điều đó phải không?

14521
13:56:40,669 --> 13:56:43,461
DAVID J. Malan: Điều đó thật hoàn hảo\n

14522
13:56:43,461 --> 13:56:45,862
muốn làm, đó là\ncó điều gì đó ở giữa không?

14523
13:56:46,881 --> 13:56:49,491
Tôi đang đơn giản hóa quá mức những gì\nngôn ngữ này thực sự đang làm.

14524
13:56:49,491 --> 13:56:51,801
Đó không phải là sự khác biệt rõ ràng\na khi nói, như, này

14525
13:56:51,802 --> 13:56:54,862
Python chậm hơn bốn lần so với C.\n

14526
13:56:54,862 --> 13:56:57,982
Hoàn toàn có nhiều cách\nkỹ sư có thể tối ưu hóa ngôn ngữ

14527
13:56:57,982 --> 13:56:59,752
như họ đã làm với Python.

14528
13:56:59,752 --> 13:57:02,362
Và trên thực tế, tôi đã định cấu hình\ncác cài đặt của mình theo cách như vậy

14529
13:57:02,362 --> 13:57:05,298
mà tôi đã kịch tính hóa\nsự khác biệt lớn đến mức nào.

14530
13:57:05,298 --> 13:57:07,131
Thông thường, nó sẽ chậm hơn,\nPython

14531
13:57:07,131 --> 13:57:08,451
hơn chương trình C tương đương.

14532
13:57:08,451 --> 13:57:10,461
Nhưng nó không cần phải có một khoảng cách lớn như vậy

14533
13:57:10,461 --> 13:57:14,241
như nó ở đây, bởi vì, thực sự, giữa\n

14534
13:57:14,241 --> 13:57:16,641
là để lưu một số kết quả trung gian.

14535
13:57:16,641 --> 13:57:19,881
Về mặt kỹ thuật thì đúng vậy,\nPython đang phiên dịch

14536
13:57:19,881 --> 13:57:23,211
Từ điển.py và các tệp\nother này, dịch chúng

14537
13:57:23,211 --> 13:57:24,724
từ ngôn ngữ này sang ngôn ngữ khác.

14538
13:57:24,724 --> 13:57:27,891
Nhưng điều đó không có nghĩa là nó phải làm vậy\n

14539
13:57:27,891 --> 13:57:33,542
Khi đề xuất, bạn có thể lưu hoặc lưu vào bộ nhớ đệm\n

14540
13:57:33,542 --> 13:57:36,961
Thế là lần thứ hai và lần thứ ba\n

14541
13:57:36,961 --> 13:57:39,951
Và trên thực tế, chính Python,\n

14542
13:57:39,951 --> 13:57:42,502
trong đó, bản thân nó\thực sự được triển khai trong C.

14543
13:57:42,502 --> 13:57:45,811
Vì vậy, bạn có thể đảm bảo rằng\n của bạn

14544
13:57:45,811 --> 13:57:47,871
Và sau đó\nbài học cấp cao có thể là gì?

14545
13:57:47,872 --> 13:57:50,842
Có, nếu bạn định cố gắng\nép từng chút hiệu suất

14546
13:57:50,841 --> 13:57:54,231
hết mã của bạn và\ncó thể mã bị hạn chế.

14547
13:57:54,232 --> 13:57:55,672
Có thể bạn có những thiết bị rất nhỏ.

14548
13:57:55,671 --> 13:57:57,292
Có lẽ nó giống như một chiếc đồng hồ ngày nay.

14549
13:57:57,292 --> 13:58:02,842
Hoặc có thể đó là một cảm biến đã được cài đặt\n

14550
13:58:02,841 --> 13:58:06,231
hoặc trong cơ sở hạ tầng nơi bạn\nkhông có nhiều thời lượng pin

14551
13:58:06,232 --> 13:58:08,152
và bạn không có nhiều\nkích thước, bạn có thể muốn

14552
13:58:08,152 --> 13:58:10,232
để giảm thiểu số lượng công việc đang được thực hiện.

14553
13:58:10,232 --> 13:58:13,265
Và do đó, mã chạy càng nhanh,\n

14554
13:58:13,264 --> 13:58:14,932
nếu nó được thực hiện ở mức độ thấp.

14555
13:58:14,932 --> 13:58:18,832
Vì vậy C vẫn được sử dụng rất phổ biến\n

14556
13:58:18,832 --> 13:58:22,101
Tuy nhiên, một lần nữa, nếu bạn chỉ muốn\ngiải quyết các vấn đề trong thế giới thực

14557
13:58:22,101 --> 13:58:26,362
và hoàn thành công việc thực tế cũng như thời gian của bạn\n

14558
13:58:26,362 --> 13:58:28,522
hơn là thiết bị bạn đang\nchạy trên đó về lâu dài

14559
13:58:28,521 --> 13:58:31,879
bạn biết không, Python nằm trong số\n

14560
13:58:31,879 --> 13:58:34,671
Và thành thật mà nói, nếu tôi đang triển khai\n

14561
13:58:34,671 --> 13:58:36,231
Có lẽ tôi đang bắt đầu với Python.

14562
13:58:36,232 --> 13:58:38,065
Và tôi sẽ không lãng phí thời gian thực hiện

14563
13:58:38,065 --> 13:58:41,452
tất cả những thứ cấp thấp đó, bởi vì\n

14564
13:58:41,451 --> 13:58:45,981
ngôn ngữ hiện đại là sử dụng sự trừu tượng\n

14565
13:58:45,982 --> 13:58:49,432
Và nói một cách trừu tượng, ý tôi là gì đó\n

14566
13:58:49,432 --> 13:58:51,891
nó chỉ cung cấp cho bạn một\ntừ điển hoặc bảng băm

14567
13:58:51,891 --> 13:58:55,747
hoặc phiên bản tương đương mà tôi\n

14568
13:58:55,747 --> 13:58:59,242
Được rồi, bạn có câu hỏi nào\nvề Python cho đến thời điểm này không?

14569
13:59:04,232 --> 13:59:06,442
ĐỐI TƯỢNG: Bạn có thể\nbiên dịch mã Python được không

14570
13:59:06,442 --> 13:59:11,132
hoặc có một số, tôi nghĩ thế\n

14571
13:59:11,131 --> 13:59:14,701
nhưng có vẻ như nếu bạn có thể\n

14572
13:59:14,701 --> 13:59:16,614
điều đó sẽ mang lại cho bạn\nđiều tốt nhất của cả hai thế giới.

14573
13:59:16,614 --> 13:59:18,781
DAVID J. Malan: Câu hỏi hoặc quan sát thực sự hay\n

14574
13:59:18,781 --> 13:59:20,239
bạn có thể biên dịch mã Python không?

14575
13:59:20,239 --> 13:59:23,701
Vâng, hoàn toàn đúng, ý tưởng này của\n

14576
13:59:23,701 --> 13:59:26,011
bản thân ngôn ngữ đó không phải là ngôn ngữ bản địa.

14577
13:59:26,012 --> 13:59:28,932
Nó có xu hướng bắt nguồn từ những\nquy ước mà con người chúng ta sử dụng.

14578
13:59:28,932 --> 13:59:31,252
Vì vậy bạn thực sự có thể\nviết một trình thông dịch cho C

14579
13:59:31,252 --> 13:59:34,502
nó sẽ đọc nó từ trên xuống dưới, bên trái\n

14580
13:59:34,502 --> 13:59:38,162
điều mà máy tính hiểu được, nhưng\n

14581
13:59:38,161 --> 13:59:40,081
C nói chung là một ngôn ngữ được biên dịch.

14582
13:59:41,192 --> 13:59:44,531
Python ngày nay thực sự là gì\n

14583
13:59:44,531 --> 13:59:46,741
Về mặt kỹ thuật, nó\nmà chúng tôi không biết

14584
13:59:46,741 --> 13:59:50,491
về mặt kỹ thuật đang biên dịch mã\n

14585
13:59:50,491 --> 13:59:54,031
vào thứ gọi là mã byte,\n

14586
13:59:54,031 --> 13:59:58,031
chỉ là không mất nhiều thời gian như vậy\n

14587
13:59:58,031 --> 14:00:00,898
Và đây là lĩnh vực nghiên cứu\ndành cho các nhà khoa học máy tính đang làm việc

14588
14:00:00,898 --> 14:00:03,481
trong các ngôn ngữ lập trình, để\nicải thiện các loại mô hình này.

14589
14:00:04,021 --> 14:00:07,261
Vâng, thành thật mà nói, đối với bạn và tôi,\n

14590
14:00:07,262 --> 14:00:10,322
một, hãy chạy mã và đừng lo lắng\nvề bước thứ hai ngu ngốc

14591
14:00:10,322 --> 14:00:11,622
biên dịch nó mọi lúc.

14592
14:00:12,122 --> 14:00:14,742
Theo nghĩa đen, nó chỉ bằng một nửa\nbước đối với tôi, con người.

14593
14:00:14,741 --> 14:00:17,021
Và đó là một điều tốt đẹp để tối ưu hóa.

14594
14:00:17,021 --> 14:00:20,851
Và cuối cùng, bạn cũng có thể\n

14595
14:00:20,851 --> 14:00:22,441
đi kèm với những ngôn ngữ khác.

14596
14:00:22,442 --> 14:00:24,482
Vì vậy, bạn thực sự nên\nchỉnh sửa cách

14597
14:00:24,482 --> 14:00:28,322
bạn có thể kích hoạt những tính năng này, vì\n

14598
14:00:28,322 --> 14:00:31,112
Và trên thực tế, đây là lần duy nhất\ncá nhân tôi sử dụng C

14599
14:00:31,112 --> 14:00:34,472
là từ tháng 9 đến tháng 10\nhàng năm, trong CS50.

14600
14:00:34,472 --> 14:00:36,872
Hầu như mỗi tháng\ntôi đều tìm đến Python

14601
14:00:36,872 --> 14:00:40,211
hoặc một ngôn ngữ khác gọi là JavaScript,\n

14602
14:00:40,211 --> 14:00:44,161
cái đó không phải để chê bai C. chỉ thế thôi\n

14603
14:00:44,161 --> 14:00:47,551
phù hợp với lượng thời gian tôi phải\n

14604
14:00:48,427 --> 14:00:50,927
Được rồi, chúng ta hãy tiếp tục và\nnghỉ giải lao năm phút tại đây.

14605
14:00:50,927 --> 14:00:53,912
Và khi chúng ta quay lại, chúng ta sẽ bắt đầu\n

14606
14:00:54,822 --> 14:00:58,262
Vì vậy hãy tiếp tục và bắt đầu viết\nmột số mã từ đầu

14607
14:00:58,262 --> 14:01:01,232
ở đây, qua đó chúng ta bắt đầu từ việc nhỏ\nvới một số ví dụ đơn giản

14608
14:01:01,232 --> 14:01:04,564
và sau đó chúng ta sẽ tiến tới\n

14609
14:01:04,563 --> 14:01:06,271
Nhưng điều chúng ta sẽ làm\na đầu tiên là

14610
14:01:06,271 --> 14:01:08,386
nhìn cạnh nhau\nmã C trông như thế nào

14611
14:01:08,387 --> 14:01:11,162
giống như cách quay lại tuần 1\cũng không phải 2 hoặc 3, v.v.

14612
14:01:11,161 --> 14:01:13,411
rồi viết mã\nPython tương ứng vào bên phải.

14613
14:01:13,411 --> 14:01:16,051
Và sau đó chúng ta sẽ chuyển\nchỉ tập trung vào Python.

14614
14:01:16,052 --> 14:01:18,844
Việc tôi đã làm trước hôm nay là\n

14615
14:01:18,843 --> 14:01:21,451
từ trang web của khóa học,\nthư mục nguồn 6 của tôi, trong đó

14616
14:01:21,451 --> 14:01:24,346
chứa tất cả mã\nC được viết sẵn từ nhiều tuần trước.

14617
14:01:24,347 --> 14:01:26,222
Nhưng nó cũng sẽ có\nbản sao của mã Python

14618
14:01:26,222 --> 14:01:28,182
chúng ta sẽ cùng nhau viết ở đây và xem xét.

14619
14:01:28,182 --> 14:01:31,967
Đầu tiên, đây là\nHello.c trở lại từ tuần 0.

14620
14:01:31,966 --> 14:01:33,844
Và đây là phiên bản 0 của nó.

14621
14:01:33,845 --> 14:01:35,262
Tôi sẽ tiếp tục và làm điều này.

14622
14:01:35,262 --> 14:01:38,762
Tôi sẽ tiếp tục\nchia cửa sổ mã của mình ở đây.

14623
14:01:38,762 --> 14:01:41,564
Tôi sẽ tiếp tục và tạo\na một tệp mới có tên Hello.py.

14624
14:01:41,563 --> 14:01:43,771
Và đây không phải là điều\nbạn thường phải làm

14625
14:01:43,771 --> 14:01:45,331
đặt mã của bạn cạnh nhau.

14626
14:01:45,332 --> 14:01:47,402
Nhưng tôi vừa nhấp vào\nbiểu tượng nhỏ trong VS Code

14627
14:01:47,402 --> 14:01:50,851
trông giống như hai cột, đó\n

14628
14:01:50,851 --> 14:01:53,851
để bây giờ, trên thực tế, chúng ta có thể nhìn thấy mọi thứ cạnh nhau

14629
14:01:53,851 --> 14:01:55,309
với cửa sổ terminal của tôi ở bên dưới.

14630
14:01:55,309 --> 14:01:58,269
Được rồi, bây giờ tôi sẽ tiếp tục\n

14631
14:01:58,269 --> 14:02:01,082
chương trình ở bên phải,\nnhớ lại, chỉ là in, trích dẫn

14632
14:02:01,082 --> 14:02:03,692
bỏ trích dẫn, "Xin chào thế giới," và thế là xong.

14633
14:02:03,692 --> 14:02:05,942
Bây giờ ở dưới cửa sổ terminal\n, tôi sẽ đi

14634
14:02:05,942 --> 14:02:09,602
để tiếp tục và chạy Python của\nHello.py, Enter và thì đấy

14635
14:02:10,972 --> 14:02:13,472
Vì vậy, một lần nữa, tôi sẽ không chơi\nan nữa với mã C.

14636
14:02:13,472 --> 14:02:15,452
Nó ở đó chỉ để chạy bộ\nbộ nhớ của bạn sang trái và phải.

14637
14:02:15,451 --> 14:02:17,761
Bây giờ chúng ta hãy xem phiên bản thứ hai của Hello, world

14638
14:02:17,762 --> 14:02:20,974
kể từ tuần đầu tiên đó\nnếu tôi đi và nhận Hello1.c

14639
14:02:20,974 --> 14:02:22,682
Tôi sẽ kéo\nover đó sang bên phải.

14640
14:02:22,682 --> 14:02:25,502
Rất tiếc, tôi sẽ tiếp tục và\n

14641
14:02:25,502 --> 14:02:28,472
Và bây giờ, ở bên phải,\nhãy sửa đổi Hello.py

14642
14:02:28,472 --> 14:02:32,222
để trông giống\nphiên bản thứ hai này trong C hơn một chút, được chứ?

14643
14:02:32,222 --> 14:02:36,389
Tôi muốn nhận được câu trả lời từ\nngười dùng dưới dạng giá trị trả về

14644
14:02:36,389 --> 14:02:38,222
nhưng tôi cũng muốn nhận được\nmột số ý kiến ​​đóng góp từ họ.

14645
14:02:38,222 --> 14:02:41,942
Vì vậy, từ CS50, tôi sẽ nhập\n

14646
14:02:41,942 --> 14:02:43,692
Cuối cùng chúng ta sẽ loại bỏ\nđiều đó

14647
14:02:43,692 --> 14:02:45,484
nhưng hiện tại, đó là một\nbánh xe đào tạo hữu ích.

14648
14:02:45,483 --> 14:02:47,701
Và sau đó ở dưới đây, tôi\nsẽ nói, hãy trả lời

14649
14:02:47,701 --> 14:02:51,031
bằng getString quote\nunquote, "Tên bạn là gì"?

14650
14:02:52,502 --> 14:02:53,974
Nhưng không có dấu chấm phẩy, không có kiểu dữ liệu.

14651
14:02:53,974 --> 14:02:55,891
Và sau đó tôi sẽ\ntiếp tục và in, chỉ

14652
14:02:55,891 --> 14:03:01,639
giống như ví dụ đầu tiên trên trang trình bày,\n

14653
14:03:01,639 --> 14:03:03,182
Và bây giờ hãy để tôi tiếp tục và chạy cái này.

14654
14:03:03,182 --> 14:03:06,182
Python, của Hello.py, được rồi,\nit đang hỏi tên tôi là gì.

14655
14:03:07,891 --> 14:03:13,029
Nhưng điều đáng chú ý là\n

14656
14:03:13,029 --> 14:03:15,362
Không chỉ là các chức năng riêng lẻ đơn giản hơn.

14657
14:03:15,362 --> 14:03:18,991
Những gì bây giờ cũng bị lược bỏ một cách rõ ràng\n khỏi mã Python của tôi ở bên phải

14658
14:03:18,991 --> 14:03:21,178
cả trong phiên bản này\nvà phiên bản trước đó.

14659
14:03:21,178 --> 14:03:22,636
Tôi đã không bận tâm thực hiện điều gì?

14660
14:03:23,788 --> 14:03:26,371
DAVID J. Malan: Vâng, vì thế tôi thậm chí không cần triển khai main.

14661
14:03:26,372 --> 14:03:29,732
Chúng ta sẽ xem lại hàm chính,\nvì có hàm chính

14662
14:03:29,732 --> 14:03:31,382
thực sự đôi khi giải quyết được vấn đề.

14663
14:03:31,381 --> 14:03:32,612
Nhưng nó không còn cần thiết nữa.

14664
14:03:32,612 --> 14:03:36,272
Trong C bạn phải có cái đó để khởi động\n

14665
14:03:36,858 --> 14:03:39,691
Và trên thực tế, nếu bạn thiếu\n

14666
14:03:39,692 --> 14:03:42,555
nếu bạn vô tình biên soạn\nHelpers.c thay vì tệp

14667
14:03:42,555 --> 14:03:44,972
chứa main, bạn sẽ thấy lỗi biên dịch.

14668
14:03:44,972 --> 14:03:46,180
Trong Python thì không cần thiết.

14669
14:03:46,180 --> 14:03:48,932
Trong Python bạn chỉ cần nhảy sang phải\n

14670
14:03:49,872 --> 14:03:51,747
Đặc biệt nếu đó là một\nchương trình nhỏ như thế này

14671
14:03:51,747 --> 14:03:54,732
bạn không cần thêm chi phí\n

14672
14:03:54,732 --> 14:03:56,382
Vì vậy, đó là một sự khác biệt khác ở đây.

14673
14:03:56,381 --> 14:03:59,911
Được rồi, có một số\ncách khác để chúng ta có thể nói Xin chào thế giới.

14674
14:03:59,911 --> 14:04:02,681
Hãy nhớ lại rằng tôi có thể sử dụng một chuỗi định dạng.

14675
14:04:02,682 --> 14:04:06,881
Để tôi có thể đặt toàn bộ thứ này vào\n

14676
14:04:06,881 --> 14:04:09,771
Sau đó, hãy để tôi tiếp tục\nchạy lại Python của Hello.py.

14677
14:04:09,771 --> 14:04:11,771
Có lẽ bạn có thể biết\nchúng ta sẽ đi đâu với việc này.

14678
14:04:11,771 --> 14:04:13,691
Hãy để tôi nhập tên của tôi,\nDavid, và chúng ta bắt đầu.

14679
14:04:13,692 --> 14:04:16,092
Được rồi, đó là lỗi\nai đó đã xác định trước đó

14680
14:04:17,561 --> 14:04:21,461
Nếu không thì không có biến nào\nđược nội suy, nó được thay thế

14681
14:04:22,911 --> 14:04:26,681
Vì vậy, nếu tôi quay lại và thêm các dấu ngoặc nhọn\ncurly đó vào chuỗi F

14682
14:04:26,682 --> 14:04:31,154
bây giờ hãy để tôi chạy Python của Hello.py,\n

14683
14:04:33,701 --> 14:04:37,061
Nhưng nói chung, việc tạo\nmã ngắn hơn, ngắn gọn hơn

14684
14:04:38,391 --> 14:04:42,972
Vì vậy, về mặt phong cách, chuỗi F là\n

14685
14:04:42,972 --> 14:04:45,802
Được rồi, chúng ta còn có thể làm gì hơn nữa\nngoài việc này?

14686
14:04:45,802 --> 14:04:48,702
Thôi, hãy để tôi tiếp tục ở đây và\n

14687
14:04:51,701 --> 14:04:54,671
Hãy để tôi thoát khỏi thư viện CS50\n mà cuối cùng chúng ta sẽ

14688
14:04:54,671 --> 14:04:56,141
dù sao thì trong một vài tuần nữa.

14689
14:04:56,141 --> 14:04:59,082
Tôi không thể sử dụng getString,\nnhưng tôi có thể sử dụng một hàm

14690
14:04:59,082 --> 14:05:01,252
đi kèm với Python được gọi là đầu vào.

14691
14:05:01,252 --> 14:05:04,572
Và trên thực tế, đây thực sự là một\n

14692
14:05:04,572 --> 14:05:07,902
Thực sự không có nhược điểm nào khi\nsử dụng đầu vào thay vì getString.

14693
14:05:07,902 --> 14:05:09,942
Chúng tôi triển khai getString\njust để đảm bảo tính nhất quán

14694
14:05:09,942 --> 14:05:14,322
với những gì bạn đã thấy trong C. Python của\n

14695
14:05:14,322 --> 14:05:15,832
Thực tế vẫn hoạt động như nhau.

14696
14:05:15,832 --> 14:05:17,749
Bánh xe tập dành riêng cho CS50\n đã biến mất.

14697
14:05:17,749 --> 14:05:19,749
Nhưng chúng tôi sẽ sớm đưa chúng trở lại, chỉ

14698
14:05:19,749 --> 14:05:21,762
để xử lý các số nguyên hoặc số float hoặc các giá trị khác

14699
14:05:21,762 --> 14:05:24,012
nữa, bởi vì nó sẽ khiến\ncuộc sống của chúng ta đơn giản hơn một chút

14700
14:05:25,031 --> 14:05:28,871
Được rồi, có bất kỳ câu hỏi nào trước khi chúng ta\n

14701
14:05:28,872 --> 14:05:32,802
từ tuần 1, nhưng bây giờ bằng Python?

14702
14:05:32,802 --> 14:05:34,632
Được rồi, hãy để tôi\ntiếp tục và mở cửa ngay bây giờ.

14703
14:05:34,631 --> 14:05:39,761
Giả sử Máy tính0.c là một\n

14704
14:05:39,762 --> 14:05:43,391
toán học và các toán tử tương tự,\ncũng như các hàm như getInt

14705
14:05:43,391 --> 14:05:48,341
hãy để tôi tiếp tục và tạo một\ntệp mới có tên là Máy tính.py

14706
14:05:48,341 --> 14:05:51,881
ở bên phải, vậy nên tôi vẫn còn\nmã C của mình ở bên trái

14707
14:05:51,881 --> 14:05:53,471
và mã Python của tôi ở bên phải.

14708
14:05:53,472 --> 14:05:57,132
Được rồi, hãy để tôi đi sâu vào\n

14709
14:05:57,131 --> 14:05:59,621
Tôi sẽ sử dụng getInt\ntừ thư viện CS50.

14710
14:06:01,482 --> 14:06:03,862
Bây giờ tôi sẽ tiếp tục\nvà lấy Int từ người dùng.

14711
14:06:03,862 --> 14:06:07,522
Vậy x bằng getInt và tôi sẽ\nêu chúng một giá trị x

14712
14:06:08,951 --> 14:06:14,322
Tuy nhiên, không cần chỉ định dấu chấm phẩy hoặc Int cho x.

14713
14:06:15,461 --> 14:06:18,612
Y sẽ lấy\nanother Int thông qua dấu hai chấm y

14714
14:06:18,612 --> 14:06:23,351
rồi xuống đây, tôi sẽ đi\n

14715
14:06:23,351 --> 14:06:25,241
Vì vậy, điều này đã có một chút mới.

14716
14:06:25,241 --> 14:06:29,921
Hãy nhớ lại, phiên bản C yêu cầu điều đó\n

14717
14:06:30,949 --> 14:06:32,741
Python chỉ thân thiện với người dùng hơn một chút.

14718
14:06:32,741 --> 14:06:36,191
Nếu tất cả những gì bạn muốn làm là in ra\n

14719
14:06:36,192 --> 14:06:39,132
Đừng nhầm lẫn với bất kỳ ký hiệu phần trăm\nhoặc mã định dạng nào.

14720
14:06:39,131 --> 14:06:41,682
Đó không phải là bản in, thực sự là nó chỉ in ngay bây giờ.

14721
14:06:41,682 --> 14:06:45,131
Được rồi, hãy để tôi tiếp tục\nchạy Python của Máy tính.py

14722
14:06:45,131 --> 14:06:50,141
Nhập, chỉ cần làm một mẫu nhanh,\n1 cộng 2 thực sự bằng 3.

14723
14:06:50,141 --> 14:06:52,932
Ngoài ra, giả sử tôi đã\thực hiện một cách tiếp cận khác

14724
14:06:52,932 --> 14:06:56,029
để nhập toàn bộ thư viện CS50,\n

14725
14:06:56,029 --> 14:06:58,072
Bạn sẽ không nhận thấy bất kỳ\ntác động nào đến hiệu suất ở đây.

14726
14:06:59,211 --> 14:07:02,201
Nhưng hãy lưu ý những gì bây giờ không\nhoạt động, trong khi nó đã hoạt động

14727
14:07:02,201 --> 14:07:07,631
trong C. Python của Máy tính.py, Enter,\n

14728
14:07:08,211 --> 14:07:10,091
Vì vậy truy nguyên chỉ là\một thuật ngữ nghệ thuật mà

14729
14:07:10,091 --> 14:07:13,731
nói, đây là dấu vết\nthông qua tất cả các chức năng

14730
14:07:14,771 --> 14:07:16,691
Trong thế giới của C, bạn\ncó thể gọi đây là ngăn xếp

14731
14:07:16,692 --> 14:07:19,459
dấu vết, ngăn xếp là từ hoạt động.

14732
14:07:19,459 --> 14:07:21,792
Hãy nhớ lại điều đó khi chúng ta nói\nvề ngăn xếp và đống

14733
14:07:21,792 --> 14:07:24,599
ngăn xếp, giống như một chồng khay,\nlà tất cả các chức năng

14734
14:07:24,599 --> 14:07:26,182
có thể được gọi lần lượt.

14735
14:07:26,182 --> 14:07:30,851
Chúng ta có main, chúng ta có swap, rồi swap đi\n

14736
14:07:30,851 --> 14:07:34,542
Vì vậy đây là dấu vết của tất cả\n

14737
14:07:34,542 --> 14:07:37,402
Thực sự không có bất kỳ chức năng nào\ngoài tập tin của tôi.

14738
14:07:37,402 --> 14:07:38,872
Nếu không thì sẽ có nhiều chi tiết hơn.

14739
14:07:38,872 --> 14:07:42,102
Nhưng mặc dù nó hơi khó hiểu,\n

14740
14:07:42,101 --> 14:07:46,481
ở đây tên bị lỗi nên có gì đó liên quan\n

14741
14:07:47,472 --> 14:07:50,711
Và điều này tất nhiên xảy ra\không phải dòng 3 ở đó.

14742
14:07:52,042 --> 14:07:55,692
Chà, về cơ bản Python\cho phép chúng ta sử dụng không gian tên

14743
14:07:55,692 --> 14:07:58,272
các chức năng của chúng tôi đến từ các thư viện.

14744
14:07:58,271 --> 14:08:01,811
Đã xảy ra sự cố trong C. Nếu\nbạn đang sử dụng thư viện CS50

14745
14:08:01,811 --> 14:08:03,701
và do đó có quyền truy cập\nto getInt, getString

14746
14:08:03,701 --> 14:08:06,371
v.v., bạn không thể\nsử dụng thư viện khác

14747
14:08:06,372 --> 14:08:08,112
có cùng tên chức năng.

14748
14:08:08,112 --> 14:08:10,031
Chúng sẽ xung đột và\ntrình biên dịch sẽ không

14749
14:08:10,031 --> 14:08:12,551
biết cách liên kết chúng\nvới nhau một cách chính xác.

14750
14:08:12,552 --> 14:08:18,042
Trong Python và các ngôn ngữ khác\nnhư JavaScript và trong Java

14751
14:08:18,042 --> 14:08:21,792
bạn được hỗ trợ một cách hiệu quả\n

14752
14:08:21,792 --> 14:08:26,891
Bạn có thể tách biệt các biến và\n

14753
14:08:26,891 --> 14:08:29,112
giống như vật chứa riêng của họ trong ký ức.

14754
14:08:29,112 --> 14:08:32,082
Và điều này có nghĩa là\nnếu bạn nhập toàn bộ CS50

14755
14:08:32,082 --> 14:08:36,252
bạn phải nói rằng getInt you\n

14756
14:08:36,252 --> 14:08:39,701
Vì vậy, giống như với hình ảnh\nlàm mờ và các cạnh của hình ảnh

14757
14:08:39,701 --> 14:08:44,951
trước đây, nơi tôi phải chỉ định dấu chấm của hình ảnh\n

14758
14:08:44,951 --> 14:08:48,491
tôi đang chỉ định bằng toán tử dấu chấm phải không,\n

14759
14:08:48,491 --> 14:08:50,932
muốn CS50.getInt ở cả hai nơi.

14760
14:08:50,932 --> 14:08:54,641
Và bây giờ nếu tôi chạy lại Python\nof Máy tính.py, 1 và 2

14761
14:08:57,311 --> 14:09:01,311
Nói chung, nó phụ thuộc\không chỉ vào số lượng chức năng

14762
14:09:01,311 --> 14:09:02,561
bạn đang sử dụng từ thư viện.

14763
14:09:02,561 --> 14:09:05,561
Nếu bạn đang sử dụng cả đống\n

14764
14:09:05,561 --> 14:09:09,854
Nếu bạn chỉ sử dụng một\hoặc hai, hãy nhập từng dòng một.

14765
14:09:09,855 --> 14:09:12,272
Được rồi, hãy tiếp tục\nvà thực hiện một chút chỉnh sửa ở đây.

14766
14:09:12,271 --> 14:09:15,438
Hãy loại bỏ thư viện này\nvà tháo bánh xe huấn luyện này ra

14767
14:09:15,438 --> 14:09:18,271
cũng nhanh như chúng tôi đã giới thiệu\n

14768
14:09:18,271 --> 14:09:20,831
bạn sẽ có thể sử dụng tất cả\ncác chức năng tương tự này.

14769
14:09:20,832 --> 14:09:24,632
Giả sử tôi bỏ cái này đi, và\ntôi chỉ sử dụng hàm nhập

14770
14:09:24,631 --> 14:09:28,231
giống như tôi đã làm bằng cách\nthay thế getString trước đó.

14771
14:09:28,232 --> 14:09:31,232
Hãy để tôi tiếp tục và chạy\nphiên bản mã này.

14772
14:09:31,232 --> 14:09:37,486
Python của Máy tính.py, được rồi,\nthế nào thì 1 cộng 2 bằng 3.

14773
14:09:39,182 --> 14:09:41,851
Được rồi, rõ ràng là sai, không chính xác.

14774
14:09:41,851 --> 14:09:46,411
Có ai có thể giải thích điều gì vừa xảy ra dựa trên bản năng không?

14775
14:09:47,911 --> 14:09:49,141
KHÁN GIẢ: Bạn muốn một câu trả lời?

14776
14:09:49,141 --> 14:09:50,266
DAVID J. Malan: Chắc chắn rồi, vâng.

14777
14:09:50,266 --> 14:09:54,451
ĐỐI TƯỢNG: Giả sử bạn có một số\n chuỗi không có Int

14778
14:09:54,451 --> 14:09:57,841
vì vậy bạn sẽ chia tay với họ và\nnói, in một, hai, tốt hơn.

14779
14:09:57,841 --> 14:10:01,171
DAVID J. Malan: Chính xác, Python\nis diễn giải, hoặc xử lý

14780
14:10:01,171 --> 14:10:03,332
cả x và y đều là các chuỗi,\nthực tế là

14781
14:10:03,332 --> 14:10:05,641
hàm đầu vào\ntrả về theo mặc định là gì.

14782
14:10:05,641 --> 14:10:08,671
Và dấu cộng hiện đang được diễn giải\n

14783
14:10:09,182 --> 14:10:12,302
Vậy x cộng y không phải là x\ncộng y về mặt toán học

14784
14:10:12,302 --> 14:10:15,002
nhưng về mặt nối chuỗi, giống như trong Scratch.

14785
14:10:15,002 --> 14:10:18,211
Đó là lý do tại sao chúng tôi nhận được\n12 hoặc thực sự là một hai

14786
14:10:18,211 --> 14:10:19,561
bản thân nó không phải là một con số.

14787
14:10:20,701 --> 14:10:22,471
Vì vậy, bằng cách nào đó chúng ta cần phải chuyển đổi mọi thứ.

14788
14:10:22,472 --> 14:10:25,561
Và chúng tôi không có được khả năng này dễ dàng như vậy trong C.

14789
14:10:25,561 --> 14:10:29,191
Chúng tôi đã có hàm A cho i\n, ASCII cho số nguyên

14790
14:10:29,192 --> 14:10:30,792
điều đó đã cho phép bạn làm điều này.

14791
14:10:30,792 --> 14:10:35,912
Tương tự trong Python thực ra chỉ là\n

14792
14:10:35,911 --> 14:10:39,271
Vì vậy, giống như trong C, bạn\ncó thể sử dụng từ khóa Int

14793
14:10:39,271 --> 14:10:41,021
nhưng bạn sử dụng nó hơi khác một chút.

14794
14:10:41,021 --> 14:10:45,822
Lưu ý rằng tôi không đặt dấu ngoặc đơn\n

14795
14:10:45,822 --> 14:10:47,531
Tôi đang sử dụng Int làm hàm.

14796
14:10:47,531 --> 14:10:49,951
Vì vậy, thực sự trong Python, Int là một hàm.

14797
14:10:49,951 --> 14:10:53,131
Float là một hàm\nbạn có thể chuyển các giá trị vào

14798
14:10:53,131 --> 14:10:54,792
để thực hiện loại chuyển đổi này.

14799
14:10:54,792 --> 14:10:58,531
Vì vậy, bây giờ, nếu tôi chạy Python\nof Máy tính.py, 1 và 2

14800
14:10:58,531 --> 14:11:01,951
bây giờ chúng tôi đã quay trở lại hoạt động kinh doanh\nvà nhận được câu trả lời là 3.

14801
14:11:01,951 --> 14:11:03,761
Nhưng có một điều khó hiểu ở đây.

14802
14:11:03,762 --> 14:11:04,952
Luôn luôn có sự đánh đổi.

14803
14:11:04,951 --> 14:11:07,081
Nghe thật tuyệt vời khi\nit lại hoạt động theo cách này.

14804
14:11:07,082 --> 14:11:08,972
Chúng ta có thể vứt bỏ thư viện\nCS50 rồi.

14805
14:11:08,972 --> 14:11:13,652
Nhưng nếu người dùng vô tình\n

14806
14:11:13,652 --> 14:11:15,557
giống như một con mèo, thay vì một con số.

14807
14:11:15,557 --> 14:11:17,432
Chết tiệt, có một trong những dấu vết này.

14808
14:11:17,432 --> 14:11:19,302
Giống như bây giờ chương trình của tôi đã bị hỏng.

14809
14:11:19,302 --> 14:11:21,864
Về mặt tinh thần, điều này tương tự\nvới các loại lỗi phân tách

14810
14:11:21,864 --> 14:11:23,072
mà bạn có thể đã có ở C.

14811
14:11:23,072 --> 14:11:24,362
Nhưng bản thân chúng không phải là lỗi phân đoạn.

14812
14:11:24,362 --> 14:11:26,029
Nó không nhất thiết liên quan đến bộ nhớ.

14813
14:11:26,029 --> 14:11:31,812
Lần này nó liên quan đến thực tế\n

14814
14:11:31,811 --> 14:11:34,771
Vì vậy lần này không phải là lỗi tên\n mà là lỗi giá trị

14815
14:11:34,771 --> 14:11:39,101
chữ không hợp lệ cho Int với\nbase 10 trích dẫn bỏ trích dẫn "cat.

14816
14:11:39,101 --> 14:11:43,322
Vì vậy, một lần nữa, nó được viết dành cho một lập trình viên, hơn cả việc sắp xếp

14817
14:11:43,322 --> 14:11:46,171
của một người điển hình, bởi vì đó\n

14818
14:11:46,171 --> 14:11:47,421
Nhưng chúng ta hãy cố gắng giải thích nó.

14819
14:11:47,421 --> 14:11:51,383
Nghĩa đen không hợp lệ, nghĩa đen chỉ là\n

14820
14:11:51,383 --> 14:11:52,841
là tên hàm, với cơ số 10.

14821
14:11:52,841 --> 14:11:54,691
Nó chỉ mặc định là số thập phân.

14822
14:11:54,692 --> 14:11:56,937
Cat dường như không phải là số thập phân.

14823
14:11:56,936 --> 14:11:59,561
Nó trông không giống như vậy nên\nit không thể bị đối xử như vậy.

14824
14:11:59,561 --> 14:12:01,451
Vì vậy, có một lỗi giá trị.

14825
14:12:03,271 --> 14:12:06,721
Thật không may, bằng cách nào đó bạn sẽ phải gặp phải lỗi này.

14826
14:12:06,722 --> 14:12:08,972
Và cách duy nhất để làm\nđiều đó trong Python thực sự là

14827
14:12:08,972 --> 14:12:11,491
là bằng một\ntính năng khác mà C không có

14828
14:12:11,491 --> 14:12:13,921
cụ thể là những gì được gọi là ngoại lệ.

14829
14:12:13,921 --> 14:12:18,601
Một ngoại lệ chính xác là những gì\n

14830
14:12:18,601 --> 14:12:22,112
Chúng là những thứ có thể sai sót\n

14831
14:12:22,112 --> 14:12:27,192
điều đó không nhất thiết phải như vậy\n

14832
14:12:27,192 --> 14:12:32,762
Vì vậy, trong Python, trong JavaScript và trong\n

14833
14:12:32,762 --> 14:12:35,762
có khả năng\thực tế là cố gắng làm điều gì đó

14834
14:12:35,762 --> 14:12:37,537
ngoại trừ nếu có gì đó không ổn.

14835
14:12:37,536 --> 14:12:39,661
Và trên thực tế, tôi sắp\giới thiệu một chút về cú pháp

14836
14:12:39,661 --> 14:12:42,078
ở đây, mặc dù chúng ta chưa phải sử dụng nhiều đến mức này.

14837
14:12:42,078 --> 14:12:46,502
Thay vì chỉ mù quáng chuyển đổi\nx thành Int, hãy để tôi tiếp tục

14838
14:12:48,491 --> 14:12:51,902
Và nếu có một ngoại lệ,\nhãy tiếp tục và nói điều gì đó

14839
14:12:51,902 --> 14:12:58,802
giống như bản in, đó không phải là Int.

14840
14:12:58,802 --> 14:13:02,060
Và sau đó tôi sẽ làm\nđiều gì đó như thoát ra, ngay tại đó.

14841
14:13:02,059 --> 14:13:03,601
Và hãy để tôi tiếp tục và làm điều này ở đây.

14842
14:13:03,601 --> 14:13:07,891
Hãy để tôi thử lấy y, ngoại trừ\nnếu có ngoại lệ.

14843
14:13:07,891 --> 14:13:12,519
Vậy hãy để tôi tiếp tục và nói lại,\n

14844
14:13:12,519 --> 14:13:14,851
Và sau đó tôi sẽ thoát\ntừ đó tới, nếu không tôi sẽ

14845
14:13:14,851 --> 14:13:16,381
hãy tiếp tục và in x cộng y.

14846
14:13:16,381 --> 14:13:22,981
Nếu bây giờ tôi chạy Python của\nCalculator.py, rất tiếc, ồ

14847
14:13:22,982 --> 14:13:25,202
quên trích dẫn gần gũi của tôi, xin lỗi.

14848
14:13:25,201 --> 14:13:31,081
Được rồi, trích dẫn rất gần, Python của\n

14849
14:13:31,082 --> 14:13:34,322
Nhưng nếu tôi cố gắng nhập\nđiều gì đó sai như con mèo, bây giờ

14850
14:13:34,322 --> 14:13:35,832
nó thực sự phát hiện ra lỗi.

14851
14:13:35,832 --> 14:13:38,372
Vậy thư viện CS50\n trong Python đang làm gì?

14852
14:13:38,372 --> 14:13:42,122
Thực ra nó đang làm điều đó, hãy thử và chấp nhận\n

14853
14:13:42,122 --> 14:13:45,062
nếu không thì chương trình của bạn dành cho\nthứ gì đó đơn giản, như máy tính

14854
14:13:45,061 --> 14:13:46,421
bắt đầu ngày càng dài hơn.

14855
14:13:46,421 --> 14:13:49,682
Vì vậy chúng tôi đã đưa loại\nlogic đó vào getInt CS50

14856
14:13:49,682 --> 14:13:51,211
và nhận hàm float.

14857
14:13:51,211 --> 14:13:55,305
Nhưng bên dưới mui xe, chúng\n

14858
14:13:55,305 --> 14:13:56,972
nhưng chúng đang chính xác hơn một chút.

14859
14:13:56,972 --> 14:14:00,972
Họ đang phát hiện một lỗi cụ thể,\n

14860
14:14:00,972 --> 14:14:03,572
để các hàm này\nđược thực thi lặp đi lặp lại.

14861
14:14:03,572 --> 14:14:07,232
Trên thực tế, cách tốt nhất để làm điều này là\n

14862
14:14:07,232 --> 14:14:10,600
sau đó in thông báo lỗi\n đó ra cho người dùng.

14863
14:14:10,599 --> 14:14:13,391
Và một lần nữa, chúng ta đừng đi quá sâu vào\n

14864
14:14:13,391 --> 14:14:15,281
Chúng tôi đã đưa vào thư viện CS50.

14865
14:14:15,281 --> 14:14:17,582
Nhưng đó là lý do tại sao, chẳng hạn,\nchúng tôi khởi động mọi thứ

14866
14:14:17,582 --> 14:14:20,942
chỉ bằng cách sử dụng những\nchức năng này ngay lập tức.

14867
14:14:20,942 --> 14:14:24,132
Được rồi, hãy làm gì đó\nnhiều hơn với máy tính của chúng ta ở đây.

14868
14:14:25,531 --> 14:14:28,411
Trong thế giới của C, chúng ta\ncó một phiên bản khác

14869
14:14:28,411 --> 14:14:33,511
của đoạn mã này, thực tế\đã thực hiện một số phép chia bằng cách--

14870
14:14:33,512 --> 14:14:38,202
thực ra đã chia\n

14871
14:14:38,201 --> 14:14:42,511
Vậy hãy để tôi tiếp tục và đóng C\n

14872
14:14:42,512 --> 14:14:44,463
bây giờ, đang thực hiện một số\n dòng mã này.

14873
14:14:44,463 --> 14:14:46,171
Nhưng tôi sẽ tiếp tục và giả sử

14874
14:14:46,171 --> 14:14:48,661
rằng người dùng sẽ\nhợp tác và sử dụng thông tin đầu vào thích hợp.

14875
14:14:48,661 --> 14:14:52,831
Vì vậy, từ CS50, hãy nhập getInt,\n

14876
14:14:52,832 --> 14:15:00,162
X lấy getInt, hỏi người dùng\ncho Int x, y bằng getInt

14877
14:15:01,692 --> 14:15:03,531
Và sau đó, chúng ta hãy tiếp tục và làm điều này.

14878
14:15:03,531 --> 14:15:07,631
Hãy khai báo một biến có tên\n

14879
14:15:07,631 --> 14:15:09,371
Sau đó hãy tiếp tục và in z.

14880
14:15:09,372 --> 14:15:13,762
Vẫn không cần chuỗi định dạng, tôi\n

14881
14:15:13,762 --> 14:15:15,762
Hãy để tôi tiếp tục và chạy\nPython của Máy tính.py.

14882
14:15:15,762 --> 14:15:20,172
Hãy để tôi làm 1, 10 và tôi nhận được 0,1.

14883
14:15:20,171 --> 14:15:25,781
Tuy nhiên, tôi đã nhận được gì trong C,\nnếu bạn nghĩ lại.

14884
14:15:25,781 --> 14:15:28,597
Điều gì sẽ xảy ra ở C?

14885
14:15:29,942 --> 14:15:32,162
DAVID J. MALAN: Đúng vậy, chúng ta\nsẽ đạt được điểm 0 ở C.

14886
14:15:32,161 --> 14:15:34,519
Nhưng tại sao, trong C, khi bạn\nchia một Int cho một Int khác

14887
14:15:34,519 --> 14:15:36,436
và những Int đó lần lượt giống như\n1 và 10?

14888
14:15:36,436 --> 14:15:38,199
ĐỐI TƯỢNG: Nó sẽ trả lại cho bạn một số nguyên.

14889
14:15:38,199 --> 14:15:39,781
DAVID J. Malan: Nó sẽ mang lại cho bạn những gì?

14890
14:15:40,864 --> 14:15:44,432
DAVID J. Malan: Nó sẽ cho bạn một\n

14891
14:15:44,432 --> 14:15:46,381
phần nguyên của nó thực sự bằng không.

14892
14:15:46,381 --> 14:15:48,491
Vì vậy, đây là một ví dụ về cắt ngắn.

14893
14:15:48,491 --> 14:15:51,061
Vì vậy, việc cắt bớt là một vấn đề trong C. Nhưng nó sẽ

14894
14:15:51,061 --> 14:15:53,972
có vẻ như đây\nkhông còn là vấn đề trong Python nữa

14895
14:15:53,972 --> 14:15:57,811
trong chừng mực toán tử chia\thực sự xử lý việc đó cho chúng ta.

14896
14:15:57,811 --> 14:16:00,752
Ngoài ra, nếu bạn muốn hành vi\ncũ, bởi vì nó thực sự

14897
14:16:00,752 --> 14:16:03,542
đôi khi hữu ích cho\nlàm tròn hoặc làm giá trị sàn

14898
14:16:03,542 --> 14:16:06,092
bạn thực sự có thể sử dụng hai dấu gạch chéo.

14899
14:16:06,091 --> 14:16:08,141
Và bây giờ bạn có hành vi C.

14900
14:16:08,141 --> 14:16:10,231
Vậy bây giờ 1 chia cho 10 bằng 0.

14901
14:16:10,232 --> 14:16:12,752
Vì vậy bạn không từ bỏ\nkhả năng đó, nhưng ít nhất nó

14902
14:16:12,752 --> 14:16:14,131
thực hiện một mặc định hợp lý hơn.

14903
14:16:14,131 --> 14:16:17,551
Hầu hết mọi người, đặc biệt là những lập trình viên mới,\n

14904
14:16:17,552 --> 14:16:20,522
muốn nhận được 0,1,\nkhông phải 0, vì lý do

14905
14:16:20,521 --> 14:16:22,621
điều đó thực sự chúng tôi đã phải giải thích từ nhiều tuần trước.

14906
14:16:22,622 --> 14:16:26,461
Nhưng còn một vấn đề khác chúng ta\n

14907
14:16:26,461 --> 14:16:28,561
do đó có sự thiếu chính xác?

14908
14:16:28,561 --> 14:16:31,502
Hãy để tôi tiếp tục và, phần nào\n

14909
14:16:32,381 --> 14:16:34,862
Tôi sẽ định dạng\nit bằng chuỗi f.

14910
14:16:34,862 --> 14:16:39,241
Và tôi sẽ tiếp tục và định dạng,\n

14911
14:16:39,972 --> 14:16:43,141
Lưu ý điều này, nếu tôi thực hiện Python\nof Máy tính.py, 1 và 10

14912
14:16:43,141 --> 14:16:46,292
Theo mặc định, tôi chỉ nhận được\không có chữ số có nghĩa.

14913
14:16:46,292 --> 14:16:50,442
Nhưng nếu tôi sử dụng cú pháp này trong Python,\n

14914
14:16:50,442 --> 14:16:53,072
Tôi thực sự có thể làm trong\nC như tôi đã làm trước đây

14915
14:16:53,072 --> 14:16:56,171
50 chữ số có nghĩa\sau dấu thập phân.

14916
14:16:56,171 --> 14:17:00,542
Vậy bây giờ hãy để tôi chạy lại Python\nof Máy tính.py 1 và 10

14917
14:17:00,542 --> 14:17:03,512
và hãy xem liệu tính chính xác của dấu phẩy động\nkhông chính xác có còn tồn tại với chúng ta hay không.

14918
14:17:04,802 --> 14:17:07,472
Và bạn có thể thấy nhiều điều như vậy ở đây,\nchuỗi f, chuỗi định dạng

14919
14:17:07,472 --> 14:17:10,512
hiện chỉ hiển thị cho chúng ta 50 chữ số\thay vì chữ số mặc định.

14920
14:17:10,512 --> 14:17:12,632
Vậy là chúng ta chưa giải quyết được mọi vấn đề.

14921
14:17:12,631 --> 14:17:15,366
Nhưng ít nhất chúng tôi đã giải quyết được một số vấn đề.

14922
14:17:15,366 --> 14:17:18,241
Được rồi, trước khi chúng ta rời khỏi\n

14923
14:17:18,241 --> 14:17:21,871
bây giờ về cú pháp hoặc khái niệm hoặc tương tự?

14924
14:17:22,591 --> 14:17:25,841
ĐỐI TƯỢNG: Bạn có nghĩ\ndấu gạch chéo kép bạn nhận được

14925
14:17:25,841 --> 14:17:28,458
có công, bạn nhận xét thế nào về điều đó?

14926
14:17:28,459 --> 14:17:29,792
DAVID J. Malan: Bạn thế nào?

14927
14:17:30,750 --> 14:17:33,932
Câu hỏi thực sự hay, nếu bạn\nsử dụng dấu gạch chéo kép để chia

14928
14:17:33,932 --> 14:17:36,391
với sàn hoặc cắt ngắn,\nnhư tôi đã mô tả

14929
14:17:36,391 --> 14:17:38,372
làm thế nào để bạn bình luận bằng Python.

14930
14:17:39,902 --> 14:17:42,452
Và quy ước thực ra là\nsử dụng một câu hoàn chỉnh

14931
14:17:42,451 --> 14:17:43,994
giống như chữ T viết hoa ở đây.

14932
14:17:43,995 --> 14:17:46,412
Bạn không cần dấu chấm trừ khi\ncó nhiều câu.

14933
14:17:46,411 --> 14:17:49,361
Và về mặt kỹ thuật thì nó phải ở trên\n

14934
14:17:49,362 --> 14:17:51,641
Vì vậy, bạn sẽ sử dụng ký hiệu băm thay thế.

14935
14:17:53,942 --> 14:17:57,272
Được rồi, hãy tiếp tục và thực hiện\n

14936
14:17:57,271 --> 14:17:59,951
Hãy để tôi tiếp tục và\nmở ra chẳng hạn

14937
14:17:59,951 --> 14:18:05,612
một ví dụ có tên là Points1.c,\nmà chúng ta đã thấy cách đây vài tuần.

14938
14:18:05,612 --> 14:18:10,052
Và để tôi đi tiếp sang phía bên kia\n

14939
14:18:10,052 --> 14:18:13,412
Nhớ lại, đây là một chương trình\n

14940
14:18:13,411 --> 14:18:15,909
thua ngay trong nhiệm vụ đầu tiên.

14941
14:18:15,910 --> 14:18:17,702
Và sau đó nó tiếp tục\nvà được in ra

14942
14:18:17,701 --> 14:18:20,311
liệu họ có mất ít điểm hơn\nhơn tôi không, vì tôi đã mất hai điểm

14943
14:18:20,311 --> 14:18:23,638
nếu bạn nhớ lại bức ảnh, bạn sẽ được nhiều điểm hơn\n

14944
14:18:23,639 --> 14:18:26,222
Hãy để tôi tiếp tục và thu nhỏ để\nchúng ta có thể thấy thêm một chút về điều này.

14945
14:18:26,222 --> 14:18:30,730
Và hãy để tôi bây giờ, ở trên cùng ngay tại đây,\n

14946
14:18:30,730 --> 14:18:33,272
Vì vậy, trước tiên tôi muốn nhắc người dùng\n về một số điểm.

14947
14:18:33,271 --> 14:18:37,061
Vậy từ CS50 hãy nhập getInt,\n

14948
14:18:37,061 --> 14:18:39,932
Sau đó chúng ta hãy tính điểm\nebằng getInt và hỏi

14949
14:18:39,932 --> 14:18:43,951
người dùng, bạn bị mất bao nhiêu điểm\ndid, dấu chấm hỏi.

14950
14:18:43,951 --> 14:18:48,511
Vậy thì hãy tiếp tục và nói, nếu có điểm\n

14951
14:18:48,512 --> 14:18:52,322
print, bạn mất ít điểm hơn tôi.

14952
14:18:52,322 --> 14:18:59,792
Ngược lại, nếu khác nếu điểm\n

14953
14:18:59,792 --> 14:19:03,592
bạn mất nhiều điểm hơn tôi.

14954
14:19:03,591 --> 14:19:07,322
Nếu không, hãy tiếp tục và xử lý\ntình huống cuối cùng, đó là bạn

14955
14:19:07,322 --> 14:19:11,122
mất cùng số điểm với tôi.

14956
14:19:11,122 --> 14:19:15,752
Trước khi tôi chạy cái này, có ai muốn\n

14957
14:19:16,252 --> 14:19:17,912
ĐỐI TƯỢNG: Khác nếu phải là Elif.

14958
14:19:17,911 --> 14:19:21,211
DAVID J. Malan: Vâng, vậy thì nếu ở\n

14959
14:19:22,302 --> 14:19:26,312
Vậy hãy để tôi đổi cái này thành Elif, và bây giờ\n

14960
14:19:26,311 --> 14:19:29,851
giả sử bạn bị mất ba\nđiểm trong một bài tập nào đó.

14961
14:19:29,851 --> 14:19:31,711
Bạn mất nhiều điểm hơn hai điểm của tôi.

14962
14:19:31,711 --> 14:19:34,330
Nếu bạn chỉ mất một điểm,\nbạn mất ít điểm hơn tôi.

14963
14:19:35,372 --> 14:19:37,562
Nhưng lưu ý rằng mã chặt chẽ hơn nhiều.

14964
14:19:37,561 --> 14:19:41,222
Trong tổng số 10 dòng, chúng tôi đã thực hiện\ntổng cộng 24 dòng vì chúng tôi đã

14965
14:19:41,222 --> 14:19:42,872
vứt đi rất nhiều cú pháp.

14966
14:19:42,872 --> 14:19:44,891
Dấu ngoặc nhọn\nkhông còn cần thiết nữa.

14967
14:19:44,891 --> 14:19:46,752
Dấu ngoặc đơn\ng là dấu chấm phẩy.

14968
14:19:46,752 --> 14:19:50,192
Vì vậy đây là lý do tại sao nó có xu hướng\ndễ chịu hơn khá nhanh

14969
14:19:52,832 --> 14:19:55,292
Được rồi, hãy làm\không có ví dụ nào khác ở đây.

14970
14:19:55,292 --> 14:19:59,522
Trong C, hãy nhớ lại rằng chúng ta có thể\n

14971
14:19:59,521 --> 14:20:01,111
nếu một cái gì đó là chẵn hoặc lẻ.

14972
14:20:01,112 --> 14:20:05,522
Chà, bằng Python, để tôi tiếp tục\n

14973
14:20:05,521 --> 14:20:09,331
và chúng ta hãy xem trong giây lát\na phiên bản C ở bên trái.

14974
14:20:09,332 --> 14:20:13,202
Đây là đoạn mã trong C mà chúng tôi đã sử dụng\n

14975
14:20:13,201 --> 14:20:16,322
Và thực sự, điều mấu chốt rút ra từ tất cả những dòng này

14976
14:20:16,322 --> 14:20:17,811
chỉ là toán tử còn lại.

14977
14:20:17,811 --> 14:20:19,061
Và cái đó vẫn ở bên chúng ta.

14978
14:20:19,061 --> 14:20:21,519
Vì vậy, đây là một minh họa đơn giản,\nchỉ để thể hiện quan điểm đó

14979
14:20:21,519 --> 14:20:25,291
nếu bằng Python, tôi muốn xác định\n

14980
14:20:25,292 --> 14:20:29,671
Thôi, hãy tiếp tục và từ CS50,\n

14981
14:20:29,671 --> 14:20:35,131
và nhận một số như n từ người dùng,\n

14982
14:20:35,131 --> 14:20:40,741
Và sau đó chúng ta hãy tiếp tục và nói,\nnếu n phần trăm dấu 2 bằng 0

14983
14:20:40,741 --> 14:20:44,792
thì hãy tiếp tục và\nin trích dẫn bỏ trích dẫn "Chẵn.

14984
14:20:44,792 --> 14:20:50,275
Nếu không, hãy tiếp tục và in\nout Odd, nhưng trước khi tôi chạy cái này

14985
14:20:50,275 --> 14:20:53,192
bất cứ ai cũng muốn theo bản năng, thậm chí\n

14986
14:20:57,332 --> 14:20:58,957
DAVID J. Malan: Vâng, gấp đôi bằng nhau.

14987
14:20:58,957 --> 14:21:02,372
Một lần nữa, mặc dù một số thứ\n

14988
14:21:02,951 --> 14:21:05,041
Vì vậy, đây cũng phải là một dấu bằng kép

14989
14:21:05,042 --> 14:21:07,141
bởi vì tôi đang so sánh sự bình đẳng ở đây.

14990
14:21:07,141 --> 14:21:08,675
Và tại sao đây lại là phép toán đúng?

14991
14:21:08,675 --> 14:21:10,592
Vâng, nếu bạn chia một\nsố cho 2 thì đó là

14992
14:21:10,591 --> 14:21:12,811
sẽ có số dư là 0 hoặc 1.

14993
14:21:12,811 --> 14:21:15,551
Và điều đó sẽ quyết định\n liệu nó là chẵn hay lẻ đối với chúng ta.

14994
14:21:15,552 --> 14:21:18,722
Vậy hãy chạy Python của Parity.py,\nnhập một số như 50

14995
14:21:18,722 --> 14:21:21,182
và hy vọng chúng tôi thực sự có được sự đồng đều.

14996
14:21:21,182 --> 14:21:23,432
Một lần nữa, ý tưởng tương tự, nhưng bây giờ\nchúng ta chỉ còn tám dòng

14997
14:21:25,082 --> 14:21:27,332
Chà, bây giờ chúng ta hãy làm điều gì đó\na tương tác hơn một chút

14998
14:21:27,332 --> 14:21:31,202
và một chút đại diện về các công cụ\n

14999
14:21:31,201 --> 14:21:36,841
Trong C, hãy nhớ lại rằng chúng ta có chương trình thỏa thuận này, Agree.c.

15000
14:21:36,841 --> 14:21:40,801
Sau đó hãy tiếp tục và triển khai\n

15001
14:21:42,391 --> 14:21:45,091
Và trước tiên hãy xem phiên bản C.

15002
14:21:45,091 --> 14:21:47,221
Ở bên trái, chúng tôi sử dụng get char ở đây.

15003
14:21:47,222 --> 14:21:49,711
Và sau đó chúng tôi sử dụng\nthanh dọc đôi

15004
14:21:49,711 --> 14:21:52,951
để kiểm tra xem C có bằng\nviết hoa Y hay chữ thường y không.

15005
14:21:52,951 --> 14:21:55,021
Và sau đó chúng tôi đã làm\nđiều tương tự với n cho không.

15006
14:21:55,021 --> 14:22:00,901
Vì vậy hãy đi qua đây\nhãy thực hiện từ CS50, nhập get--

15007
14:22:00,902 --> 14:22:03,092
Được rồi, lấy char không phải là vấn đề.

15008
14:22:03,091 --> 14:22:05,611
Và đây là một điểm khác biệt khác với Python.

15009
14:22:05,612 --> 14:22:09,031
Không có kiểu dữ liệu cho\n ký tự riêng lẻ.

15010
14:22:09,031 --> 14:22:11,161
Bạn có các chuỗi, STR,\nvà thành thật mà nói, những chuỗi đó

15011
14:22:11,161 --> 14:22:13,141
không sao cả, bởi vì\nbạn có STR thì đó là

15012
14:22:13,141 --> 14:22:15,481
chỉ một ký tự, cho mọi ý định và mục đích

15013
14:22:15,482 --> 14:22:17,232
nó chỉ là một ký tự duy nhất.

15014
14:22:17,232 --> 14:22:18,482
Vì vậy, nó chỉ là một sự đơn giản hóa.

15015
14:22:18,482 --> 14:22:19,722
Bạn không cần phải suy nghĩ nhiều.

15016
14:22:19,722 --> 14:22:22,180
Bạn không phải lo lắng về\ndấu ngoặc kép, dấu ngoặc đơn.

15017
14:22:22,180 --> 14:22:25,872
Trên thực tế, trong Python, bạn có thể sử dụng\ndấu ngoặc kép hoặc dấu ngoặc đơn

15018
14:22:25,872 --> 14:22:27,452
miễn là bạn nhất quán.

15019
14:22:27,451 --> 14:22:29,491
Miễn là bạn\nnhất quán, dấu nháy đơn

15020
14:22:29,491 --> 14:22:32,191
không có ý nghĩa gì đó\nkhác biệt, giống như trong C.

15021
14:22:32,192 --> 14:22:34,862
Vì vậy tôi sẽ tiếp tục\nvà sử dụng getString tại đây

15022
14:22:34,862 --> 14:22:37,741
mặc dù, nói đúng ra, tôi\n

15023
14:22:39,002 --> 14:22:43,771
Tôi sẽ lấy một chuỗi từ\n

15024
14:22:43,771 --> 14:22:47,078
trích dẫn không trích dẫn, "Bạn có đồng ý không," như một\n

15025
14:22:47,078 --> 14:22:50,161
nơi bạn phải nói có hoặc không, bạn\n

15026
14:22:51,101 --> 14:22:54,631
Và bây giờ chúng ta hãy dịch\nđiều kiện sang Python.

15027
14:22:54,631 --> 14:23:02,371
Vậy nếu S bằng quote-unquote\n

15028
14:23:02,372 --> 14:23:08,702
hãy tiếp tục và in ra bản đồng ý,\n

15029
14:23:08,701 --> 14:23:12,061
bằng N hoặc S bằng bằng n nhỏ.

15030
14:23:12,061 --> 14:23:14,579
Vậy hãy tiếp tục\nvà in ra những điều không đồng ý.

15031
14:23:14,580 --> 14:23:17,372
Và có lẽ bạn đã có thể thấy,\n

15032
14:23:17,372 --> 14:23:20,222
Python có giống tiếng Anh hơn một chút không, trong đó

15033
14:23:20,222 --> 14:23:24,132
bạn chỉ cần sử dụng từ tiếng Anh theo đúng nghĩa đen\n

15034
14:23:24,131 --> 14:23:26,891
Nhưng cuối cùng\nnó cũng làm điều tương tự.

15035
14:23:26,891 --> 14:23:29,911
Tuy nhiên, chúng ta có thể đơn giản hóa mã này một chút không.

15036
14:23:29,911 --> 14:23:31,861
Điều này sẽ hơi khó chịu nếu chúng ta muốn

15037
14:23:31,862 --> 14:23:34,322
để thêm sự hỗ trợ, không chỉ\ncho Y lớn và Y nhỏ

15038
14:23:34,322 --> 14:23:40,752
nhưng Có hoặc lớn Có hoặc ít có hoặc\n

15039
14:23:40,752 --> 14:23:43,652
Có rất nhiều hoán vị\ncủa Y-E-S hoặc chỉ y

15040
14:23:43,652 --> 14:23:45,241
mà lý tưởng nhất là chúng ta nên chịu đựng.

15041
14:23:45,241 --> 14:23:47,991
Nếu không, người dùng sẽ\n

15042
14:23:47,991 --> 14:23:49,292
không thân thiện lắm với người dùng.

15043
14:23:49,292 --> 14:23:51,572
Bất kỳ trực giác nào về cách\nchúng ta có thể hợp lý

15044
14:23:51,572 --> 14:23:54,792
ngay cả khi bạn không biết cách\nlàm điều đó bằng mã, hãy làm điều này tốt hơn?

15045
14:23:55,292 --> 14:23:58,057
ĐỐI TƯỢNG: Viết qua\ndanh sách rồi viết lên

15046
14:23:58,057 --> 14:23:59,432
nó giống như những thứ trong danh sách.

15047
14:23:59,432 --> 14:24:03,572
DAVID J. Malan: Tốt lắm, vâng, chúng tôi đã thấy\n

15048
14:24:03,572 --> 14:24:06,421
Tại sao chúng ta không áp dụng ý tưởng đó\nvà đặt một câu hỏi tương tự.

15049
14:24:06,421 --> 14:24:11,341
Nếu S nằm trong danh sách\ngiá trị sau đây, Y hoặc y nhỏ

15050
14:24:11,341 --> 14:24:15,122
hoặc chết tiệt, hãy để tôi thêm vào danh sách\n

15051
14:24:15,122 --> 14:24:17,300
Và phải thừa nhận rằng nó sẽ hơi khó chịu một chút

15052
14:24:17,300 --> 14:24:20,271
nhưng điều này vẫn tốt hơn\n

15053
14:24:20,271 --> 14:24:22,161
Tôi có thể làm những việc như\nthế này, v.v.

15054
14:24:22,161 --> 14:24:24,261
Còn rất nhiều hoán vị nữa.

15055
14:24:24,262 --> 14:24:26,992
Nhưng hãy để chuyện này yên,\nvà để tôi đi vào đây

15056
14:24:26,991 --> 14:24:33,800
và thay đổi giá trị này thành, nếu S nằm trong\n

15057
14:24:33,800 --> 14:24:36,981
và tôi sẽ không làm như vậy, chúng ta đừng\n

15058
14:24:39,322 --> 14:24:42,472
Python của Agree.py, tôi có đồng ý không?

15059
14:24:45,262 --> 14:24:46,881
Được rồi, lớn thì sao.

15060
14:24:46,881 --> 14:24:48,372
Được rồi, điều đó có vẻ không hiệu quả.

15061
14:24:48,372 --> 14:24:50,872
Lưu ý rằng nó không nói là đồng ý,\nvà nó không nói là không đồng ý.

15062
14:24:53,701 --> 14:24:57,291
Chà, bạn biết tôi có thể\nlàm được gì, thực sự tôi không làm được gì

15063
14:24:57,292 --> 14:24:58,762
cần chữ hoa và chữ thường.

15064
14:24:58,762 --> 14:25:00,711
Hãy để tôi thắt chặt\ndanh sách này lại một chút.

15065
14:25:00,711 --> 14:25:04,162
Và tại sao tôi không\nbắt S phải viết thường.

15066
14:25:04,161 --> 14:25:07,521
S.low, nhớ lại, dù\nit là một ký tự hay nhiều hơn

15067
14:25:07,521 --> 14:25:10,701
bây giờ là một hàm được tích hợp trong\nSTR, các chuỗi trong Python

15068
14:25:10,701 --> 14:25:12,471
điều đó buộc toàn bộ chữ thường.

15069
14:25:13,972 --> 14:25:19,222
Python của Agree.py, y nhỏ,\nhoạt động được, Y lớn, hoạt động được.

15070
14:25:19,222 --> 14:25:24,362
Lớn Vâng, cách đó được, Y lớn,\ne nhỏ, S lớn, cũng được.

15071
14:25:24,362 --> 14:25:27,432
Vậy là chúng ta đã xử lý xong, chỉ trong một lần ngã\n

15072
14:25:27,432 --> 14:25:29,432
Và bạn biết không, chúng ta có thể\nthắt chặt điều này một chút.

15073
14:25:29,432 --> 14:25:32,872
Đây là một cơ hội, trong Python,\nđể có thiết kế tốt hơn một chút.

15074
14:25:32,872 --> 14:25:36,592
Tôi đã làm gì ở đây\nđiều đó có hơi dư thừa không?

15075
14:25:36,591 --> 14:25:40,701
Có ai nhìn thấy cơ hội\nđể loại bỏ sự dư thừa

15076
14:25:40,701 --> 14:25:43,341
làm điều gì đó nhiều\nlần hơn mức bạn cần.

15077
14:25:45,052 --> 14:25:47,685
ĐỐI TƯỢNG: Bạn có thể thực hiện S chấm thấp hơn, ở trên.

15078
14:25:47,684 --> 14:25:49,851
DAVID J. Malan: Chúng ta có thể\ndi chuyển dấu chấm S xuống phía trên.

15079
14:25:49,851 --> 14:25:51,832
Lưu ý rằng tôi đang sử dụng S dot Lower hai lần.

15080
14:25:51,832 --> 14:25:54,391
Nhưng nó sẽ cho tôi\ncâu trả lời giống nhau cả hai lần.

15081
14:25:54,391 --> 14:25:56,601
Vì vậy, tôi có thể làm một vài điều ở đây.

15082
14:25:56,601 --> 14:26:01,222
Trước hết tôi có thể loại bỏ\n

15083
14:26:01,222 --> 14:26:05,241
và trên hết, có lẽ tôi có thể\n

15084
14:26:05,241 --> 14:26:08,121
Tôi không thể chỉ làm điều này vì\nđiều đó sẽ làm mất đi giá trị.

15085
14:26:08,122 --> 14:26:10,762
Nó thực hiện phép toán nhưng không tự chuyển đổi chuỗi đó.

15086
14:26:10,762 --> 14:26:12,362
Nó sẽ trả về một giá trị.

15087
14:26:12,362 --> 14:26:14,781
Vì vậy tôi phải nói S bằng s.thấp hơn.

15088
14:26:15,862 --> 14:26:18,362
Hoặc thành thật mà nói, tôi có thể xâu chuỗi những thứ này lại với nhau.

15089
14:26:18,362 --> 14:26:22,592
Và đây không phải là thứ chúng tôi thấy trong\n

15090
14:26:22,591 --> 14:26:25,761
và các chuỗi có chức năng\nnhư hàm thấp hơn trong đó

15091
14:26:25,762 --> 14:26:28,851
bạn có thể xâu chuỗi các chức năng này\n

15092
14:26:28,851 --> 14:26:30,309
chấm cái đó, chấm cái kia.

15093
14:26:30,309 --> 14:26:33,351
Và cuối cùng bạn muốn dừng lại,\n

15094
14:26:33,351 --> 14:26:35,332
Nhưng điều này hợp lý,\nvẫn vừa vặn trên màn hình.

15095
14:26:36,082 --> 14:26:38,211
Nó thực hiện ở một nơi\nnhững gì tôi đang làm ở hai nơi.

15096
14:26:39,531 --> 14:26:42,502
Hãy để tôi tiếp tục và thực hiện Python\nof Agree.py lần cuối.

15097
14:26:43,641 --> 14:26:46,881
Và nó vẫn hoạt động như dự định.

15098
14:26:46,881 --> 14:26:49,221
Ngoài ra nếu tôi cũng đã thử những đầu vào đó.

15099
14:26:49,957 --> 14:26:55,812
ĐỐI TƯỢNG: Bạn có thể thêm vào như for\n không

15100
14:26:55,811 --> 14:26:59,222
và sau đó bao gồm tất cả các chức năng trong đó\n

15101
14:26:59,222 --> 14:27:01,972
trong đó nó cũng viết hoa hoặc\n

15102
14:27:05,616 --> 14:27:06,991
DAVID J. Malan: Hãy để tôi tóm tắt.

15103
14:27:06,991 --> 14:27:09,862
Chúng ta có thể xử lý chữ hoa và chữ thường cùng nhau dưới một dạng nào đó không?

15104
14:27:09,862 --> 14:27:11,542
Thực ra tôi đang làm điều đó rồi.

15105
14:27:12,891 --> 14:27:15,828
Tôi phải viết toàn chữ thường\theo logic của tôi hoặc toàn chữ hoa

15106
14:27:15,828 --> 14:27:17,661
và đừng lo lắng về\nnhững gì con người gõ vào

15107
14:27:17,661 --> 14:27:19,761
bởi vì bất kể con người thuộc loại nào, tôi vẫn

15108
14:27:19,762 --> 14:27:21,472
buộc đầu vào của họ phải viết thường.

15109
14:27:21,472 --> 14:27:24,802
Và sau đó tôi đang sử dụng danh sách các giá trị\nchữ thường.

15110
14:27:24,802 --> 14:27:26,042
Nếu tôi muốn lật nó, tốt thôi.

15111
14:27:26,042 --> 14:27:27,561
Tôi chỉ cần phải kiên định với chính mình.

15112
14:27:27,561 --> 14:27:28,941
Nhưng tôi đang xử lý việc đó rồi.

15113
14:27:29,745 --> 14:27:33,475
ĐỐI TƯỢNG: Các chuỗi không còn là một mảng ký tự nữa phải không?

15114
14:27:33,474 --> 14:27:35,391
DAVID J. Malan: Một câu hỏi thực sự\nhay

15115
14:27:35,391 --> 14:27:38,601
chuỗi không còn là mảng ký tự nữa phải không?

15116
14:27:38,601 --> 14:27:40,641
Về mặt khái niệm thì có,\ndưới mui xe thì không.

15117
14:27:40,641 --> 14:27:42,711
Họ phức tạp hơn thế một chút

15118
14:27:42,711 --> 14:27:45,112
bởi vì với chuỗi,\nbạn có một vài thay đổi.

15119
14:27:45,112 --> 14:27:47,122
Chúng không chỉ có\nchức năng được tích hợp sẵn

15120
14:27:47,122 --> 14:27:49,102
bởi vì chuỗi bây giờ\nlà thứ mà chúng ta gọi là đối tượng

15121
14:27:49,101 --> 14:27:51,021
trong cái gọi là\nlập trình hướng đối tượng.

15122
14:27:51,021 --> 14:27:53,563
Và chúng ta sẽ tiếp tục xem\ncác ví dụ về toán tử dấu chấm này.

15123
14:27:53,563 --> 14:27:58,072
Chúng cũng bất biến, có thể nói như vậy, I-M-M-U-T-A-B-L-E.

15124
14:27:58,072 --> 14:28:01,701
Bất biến có nghĩa là chúng không thể\nthay đổi được, nghĩa là không giống như C

15125
14:28:01,701 --> 14:28:05,271
bạn không thể đi vào một chuỗi và\nthay đổi các ký tự riêng lẻ của nó.

15126
14:28:05,271 --> 14:28:08,002
Bạn có thể tạo một bản sao của chuỗi\nđể thực hiện thay đổi

15127
14:28:08,002 --> 14:28:10,220
nhưng bạn không thể thay đổi\nchuỗi gốc.

15128
14:28:10,220 --> 14:28:12,262
Điều này đôi khi có thể hơi khó chịu một chút.

15129
14:28:12,262 --> 14:28:14,887
Nhưng nó cũng có tác dụng bảo vệ khá tốt,\nvì bạn không thể vặn vít

15130
14:28:14,887 --> 14:28:18,202
giống như tôi đã làm cách đây vài tuần, khi tôi đang cố gắng sao chép S và gọi nó là T.

15131
14:28:18,201 --> 14:28:19,791
Và sau đó cái này ảnh hưởng đến cái kia.

15132
14:28:19,792 --> 14:28:23,601
Python, bên dưới mui xe, là\n

15133
14:28:23,601 --> 14:28:25,072
và các con trỏ và tất cả những thứ đó.

15134
14:28:25,072 --> 14:28:27,561
Không có con trỏ trong Python.

15135
14:28:27,561 --> 14:28:32,362
Vì vậy, nếu điều đó không rõ ràng, tất cả những điều đó\n

15136
14:28:32,362 --> 14:28:36,802
hiện được xử lý bằng ngôn ngữ\n

15137
14:28:36,802 --> 14:28:38,962
Được rồi, vậy hãy\giới thiệu một số vòng lặp

15138
14:28:38,961 --> 14:28:40,911
như chúng ta đã có thói quen làm.

15139
14:28:40,911 --> 14:28:44,691
Để tôi mở Meow.c, đó là\nan ví dụ trong C, chỉ kêu meo meo

15140
14:28:46,252 --> 14:28:49,322
Hãy để tôi tạo một tập tin có tên\nMeow.py ở đây bên phải.

15141
14:28:49,322 --> 14:28:51,711
Và chú ý ở bên trái,\nđây là mã đúng trong C

15142
14:28:51,711 --> 14:28:53,192
nhưng nó được thiết kế kém.

15143
14:28:53,692 --> 14:28:55,972
Bởi vì đó là một cơ hội bị bỏ lỡ cho một vòng lặp.

15144
14:28:55,972 --> 14:28:58,982
Tại sao phải nói điều gì đó ba lần\nkhi bạn có thể nói điều đó chỉ một lần?

15145
14:28:58,982 --> 14:29:02,512
Vì vậy, trong Python, trước tiên hãy để tôi thực hiện\ntheo cách được thiết kế kém.

15146
14:29:03,921 --> 14:29:07,731
Và, như tôi thường không nên làm,\n

15147
14:29:07,732 --> 14:29:10,192
chạy Python của Meow.py và nó hoạt động.

15148
14:29:11,839 --> 14:29:13,881
Vậy hãy để tôi tiếp tục và\nicải thiện điều này một chút.

15149
14:29:13,881 --> 14:29:15,511
Và có một số cách để làm điều này.

15150
14:29:15,512 --> 14:29:20,572
Nếu tôi muốn làm điều này ba lần, tôi\n

15151
14:29:20,572 --> 14:29:24,531
Đối với tôi ở phạm vi 3, hãy nhớ rằng\nđó là phiên bản tốt hơn

15152
14:29:24,531 --> 14:29:27,891
thay vì liệt kê tùy tiện\n

15153
14:29:27,891 --> 14:29:30,012
và in ra trích dẫn "Meow.

15154
14:29:30,012 --> 14:29:32,599
Bây giờ nếu tôi chạy Python của\nMeow, dường như vẫn hoạt động.

15155
14:29:32,599 --> 14:29:34,432
Vậy là nó chật hơn một chút,\nvà Chúa ơi, kiểu như

15156
14:29:34,432 --> 14:29:36,474
các chương trình thực sự không thể ngắn hơn thế này nhiều.

15157
14:29:36,474 --> 14:29:40,822
Chúng ta chỉ còn hai dòng mã, không\n

15158
14:29:40,822 --> 14:29:43,101
Bây giờ chúng ta hãy cải tiến\nthiết kế hơn nữa, giống như chúng ta

15159
14:29:43,101 --> 14:29:46,072
đã làm trong C, bằng cách giới thiệu hàm\na có tên

15160
14:29:46,072 --> 14:29:47,752
meo meo, điều đó thực sự tạo ra tiếng kêu meo meo.

15161
14:29:47,752 --> 14:29:49,521
Vì vậy, đây là sự\ntrừu tượng đầu tiên của chúng tôi, hãy nhớ lại

15162
14:29:49,521 --> 14:29:54,621
cả trong Scratch và C. Hãy để tôi tập trung\n

15163
14:29:55,281 --> 14:30:00,006
Hãy để tôi tiếp tục và\nđầu tiên hãy định nghĩa một hàm.

15164
14:30:03,411 --> 14:30:06,771
Trước tiên hãy để tôi tiếp tục và làm\nđiều này, vì tôi ở trong phạm vi 3

15165
14:30:06,771 --> 14:30:09,951
tạm thời hãy giả sử\nrằng có chức năng kêu meo meo

15166
14:30:09,951 --> 14:30:11,241
mà tôi sắp gọi.

15167
14:30:11,241 --> 14:30:14,841
Bây giờ chúng ta hãy tiếp tục và xác định bằng cách sử dụng\n

15168
14:30:14,841 --> 14:30:17,691
với cách đánh vần\biểu diễn, một hàm

15169
14:30:17,692 --> 14:30:19,402
được gọi là meo mà không cần tranh luận.

15170
14:30:19,402 --> 14:30:21,982
Và tất cả những gì nó làm bây giờ là in meo meo.

15171
14:30:21,982 --> 14:30:27,142
Bây giờ hãy để tôi tiếp tục chạy\nPython của Meow.py Enter, huh, một

15172
14:30:28,472 --> 14:30:30,601
Vì vậy, đây là một lỗi tên khác.

15173
14:30:30,601 --> 14:30:33,601
Và một lần nữa, tên meo meo không được xác định.

15174
14:30:33,601 --> 14:30:35,601
Bản năng của bạn ở đây là gì,\mặc dù chúng tôi không

15175
14:30:35,601 --> 14:30:37,281
đã vấp phải điều này chưa bằng Python?

15176
14:30:37,281 --> 14:30:39,652
Tâm trí của bạn đi đâu ở đây?

15177
14:30:40,192 --> 14:30:42,602
ĐỐI TƯỢNG: Nó có đọc từ trên\n xuống dưới, từ trái sang phải không?

15178
14:30:42,601 --> 14:30:46,121
Tôi đoán chúng ta có thể tìm ra một vụ án mới.

15179
14:30:46,122 --> 14:30:49,542
DAVID J. Malan: Hoàn hảo, thông minh,\n

15180
14:30:49,542 --> 14:30:51,292
nó vẫn đưa ra những giả định nhất định.

15181
14:30:51,292 --> 14:30:54,531
Và nếu nó không nhìn thấy từ khóa\nyet thì nó không tồn tại.

15182
14:30:54,531 --> 14:30:57,521
Vì vậy nếu muốn nó tồn tại thì chúng ta phải khéo léo một chút ở đây.

15183
14:30:57,521 --> 14:31:00,611
Tôi chỉ cần đặt nó, lật ngược lại, như thế này.

15184
14:31:00,612 --> 14:31:02,991
Nhưng thực sự thì đây không phải là một thiết kế đặc biệt tốt.

15185
14:31:03,491 --> 14:31:06,911
Bởi vì bây giờ, nếu bạn, người đọc mã của bạn, cho dù bạn

15186
14:31:06,911 --> 14:31:09,491
đã viết nó hoặc ai đó khác, bây giờ bạn\nphải đi câu cá.

15187
14:31:09,491 --> 14:31:11,081
Giống như chương trình này bắt đầu từ đâu?

15188
14:31:11,082 --> 14:31:14,652
Và mặc dù, vâng, điều đó là hiển nhiên\n

15189
14:31:14,652 --> 14:31:17,232
kiểu như, nếu tệp dài hơn,\nbạn sẽ khó chịu

15190
14:31:17,232 --> 14:31:19,702
và tìm kiếm\n dòng mã phù hợp một cách trực quan.

15191
14:31:20,919 --> 14:31:22,752
Và thực sự, đây sẽ\nlà một mô hình phổ biến.

15192
14:31:22,752 --> 14:31:25,902
Khi bạn muốn bắt đầu có\n

15193
14:31:25,902 --> 14:31:29,982
chỉ cần đặt mã của riêng bạn vào main, để\n

15194
14:31:29,982 --> 14:31:32,172
bạn có thể giải quyết vấn đề\nchúng ta vừa gặp phải.

15195
14:31:32,171 --> 14:31:35,381
Vì vậy, hãy để tôi định nghĩa một hàm có tên\nmain có cùng vòng lặp đó

15196
14:31:38,561 --> 14:31:43,871
Hãy để tôi vào terminal và\nchạy Python của Meow.py, Enter.

15197
14:31:47,021 --> 14:31:50,572
Được rồi, điều tra chuyện này đi.

15198
14:31:50,572 --> 14:31:52,811
Điều gì có thể giải thích triệu chứng này.

15199
14:31:52,811 --> 14:31:54,542
Tôi vẫn chưa nói cho bạn biết câu trả lời.

15200
14:31:54,542 --> 14:31:56,292
Vì vậy tất cả những gì bạn có là\nbản năng của bạn, giả sử

15201
14:31:56,292 --> 14:31:58,241
bạn chưa bao giờ chạm vào Python trước đây.

15202
14:31:58,241 --> 14:32:03,322
Điều gì có thể giải thích cho triệu chứng này\nnơi không có tiếng kêu meo meo?

15203
14:32:03,822 --> 14:32:05,491
ĐỐI TƯỢNG: Không chạy chức năng chính.

15204
14:32:05,491 --> 14:32:07,699
DAVID J. Malan: Vâng, tôi không chạy chức năng chính.

15205
14:32:07,699 --> 14:32:09,911
Vì vậy, trong C, đây là chức năng\nbạn nhận được miễn phí.

15206
14:32:09,911 --> 14:32:11,286
Bạn phải có một chức năng chính.

15207
14:32:11,286 --> 14:32:14,101
Nhưng, chết tiệt, miễn là bạn kiếm được\nit, nó sẽ được gọi cho bạn.

15208
14:32:14,101 --> 14:32:17,911
Trong Python, đây chỉ là quy ước,\nđể tạo một hàm chính

15209
14:32:17,911 --> 14:32:19,721
mượn một cái tên rất phổ biến cho nó.

15210
14:32:19,722 --> 14:32:22,842
Nhưng nếu bạn muốn gọi hàm\nmain đó thì bạn phải thực hiện.

15211
14:32:22,841 --> 14:32:24,631
Vì vậy, phải thừa nhận rằng điều này có vẻ hơi kỳ lạ

15212
14:32:24,631 --> 14:32:26,551
rằng bây giờ bạn phải gọi hàm main\nown của mình

15213
14:32:26,552 --> 14:32:28,382
và nó phải ở\ncuối tập tin

15214
14:32:28,381 --> 14:32:31,561
bởi vì chỉ một lần người phiên dịch\n

15215
14:32:31,561 --> 14:32:34,981
tất cả các chức năng của bạn\nđã được xác định, cao hơn.

15216
14:32:34,982 --> 14:32:36,512
Nhưng điều này giải quyết được cả hai vấn đề.

15217
14:32:36,512 --> 14:32:38,972
Nó giữ mã của bạn, đó\nlà phần chính trong mã của bạn

15218
14:32:38,972 --> 14:32:40,182
ở đầu tập tin.

15219
14:32:40,182 --> 14:32:43,502
Vì vậy, điều đó là hiển nhiên đối với bạn và\n

15220
14:32:43,502 --> 14:32:45,662
nơi chương trình bắt đầu một cách hợp lý.

15221
14:32:45,661 --> 14:32:49,831
Nhưng nó cũng đảm bảo rằng main không phải là\n

15222
14:32:52,182 --> 14:32:54,169
Vì vậy, đây là một\nví dụ hoàn hảo khác về việc chúng tôi

15223
14:32:54,169 --> 14:32:55,961
học một ngôn ngữ mới\nlần đầu tiên.

15224
14:32:55,961 --> 14:32:57,542
Trước đây bạn sẽ không nghe thấy\n tất cả các câu trả lời.

15225
14:32:57,542 --> 14:33:01,351
Chỉ cần áp dụng một số logic, như, tất cả\n

15226
14:33:01,351 --> 14:33:04,711
Bắt đầu suy ra cách\nngôn ngữ hoạt động hoặc không hoạt động.

15227
14:33:04,711 --> 14:33:08,972
Nếu bây giờ tôi chạy cái này, Python của\n

15228
14:33:08,972 --> 14:33:11,882
Và đúng như vậy\nbạn đã thấy nó, có một câu trích dẫn

15229
14:33:11,881 --> 14:33:15,362
bỏ trích dẫn cách "tốt hơn" để thực hiện việc này,\n

15230
14:33:15,362 --> 14:33:18,572
sẽ không gặp phải,\nchắc chắn là trong những ngày đầu này.

15231
14:33:18,572 --> 14:33:21,961
Thông thường, bạn sẽ thấy các sách hoặc hướng dẫn\không trực tuyến

15232
14:33:21,961 --> 14:33:25,921
thứ gì đó trông như thế này, ở đâu\n

15233
14:33:27,332 --> 14:33:30,992
Về mặt chức năng thì điều đó cũng tương tự,\n

15234
14:33:30,991 --> 14:33:34,362
nếu chính chúng ta đang thực hiện một\n

15235
14:33:34,362 --> 14:33:37,404
Nhưng chúng tôi sẽ làm mọi thứ đơn giản hơn\n

15236
14:33:37,404 --> 14:33:39,877
bởi vì chúng ta chưa gặp phải vấn đề đó.

15237
14:33:39,877 --> 14:33:42,752
Được rồi, hãy thực hiện một thay đổi đối với\n

15238
14:33:42,752 --> 14:33:47,942
Trong C, phiên bản cuối cùng của meo cũng\n

15239
14:33:47,942 --> 14:33:50,432
lấy đối số cho hàm meo meo.

15240
14:33:50,432 --> 14:33:53,012
Vì vậy, giả sử rằng tôi muốn\n tính đến yếu tố này.

15241
14:33:53,012 --> 14:33:55,772
Và tôi chỉ muốn gọi meo là\n

15242
14:33:55,771 --> 14:33:57,601
kêu meo meo nhiều lần thế này.

15243
14:33:57,601 --> 14:34:00,811
Và tôi tìm ra bao nhiêu lần\n

15244
14:34:00,811 --> 14:34:03,511
hoặc sử dụng getInt hoặc thứ gì đó\nnhư thế để tìm ra

15245
14:34:05,072 --> 14:34:08,341
Chà, bây giờ, tôi phải xác định\bên trong hàm meo meo của mình, trong đầu vào

15246
14:34:08,341 --> 14:34:14,851
hãy gọi nó là n, rồi sử dụng nó,\n

15247
14:34:14,851 --> 14:34:18,161
để tôi tiếp tục và in\nout meo meo nhiều lần như vậy.

15248
14:34:18,161 --> 14:34:20,341
Một lần nữa, điều duy nhất\nkhác ở C

15249
14:34:20,341 --> 14:34:24,151
là chúng ta không cần chỉ định trả lại\n

15250
14:34:24,152 --> 14:34:28,752
và chúng tôi không bận tâm chỉ định\n

15251
14:34:28,752 --> 14:34:31,451
Vì vậy, những ý tưởng tương tự, đơn giản hơn theo một nghĩa nào đó.

15252
14:34:31,451 --> 14:34:33,182
Chúng tôi chỉ đang vứt bỏ tổ hợp phím.

15253
14:34:33,182 --> 14:34:35,972
Được rồi, để tôi chạy\nlần cuối nhé, Python của Meow.py

15254
14:34:35,972 --> 14:34:38,912
và chúng ta vẫn có chương trình tương tự.

15255
14:34:38,911 --> 14:34:40,631
Được rồi, tôi xin tạm dừng ở đây.

15256
14:34:41,302 --> 14:34:42,552
Và tôi biết điều này đang diễn ra nhanh chóng.

15257
14:34:42,552 --> 14:34:47,877
Nhưng hy vọng rằng mã C\nis vẫn còn phần nào quen thuộc.

15258
14:34:48,377 --> 14:34:54,052
ĐỐI TƯỢNG: Có sự khác biệt nào không\n

15259
14:34:54,052 --> 14:34:55,302
DAVID J. Malan: Câu hỏi hay.

15260
14:34:55,302 --> 14:34:57,760
Có sự khác biệt nào giữa\nbiến toàn cục và biến cục bộ không?

15261
14:34:57,760 --> 14:35:00,372
Câu trả lời ngắn gọn là có, và chúng ta\nsẽ gặp phải vấn đề tương tự

15262
14:35:00,372 --> 14:35:01,842
nếu chúng ta khai báo một biến\nin một hàm

15263
14:35:01,841 --> 14:35:03,966
một chức năng khác sẽ không có quyền truy cập vào nó.

15264
14:35:03,966 --> 14:35:07,181
Chúng ta có thể giải quyết vấn đề đó bằng cách\nhập các biến trên toàn cầu.

15265
14:35:07,182 --> 14:35:09,281
Nhưng chúng tôi không có tất cả\ncác tính năng mà chúng tôi có trong C

15266
14:35:09,281 --> 14:35:11,682
như thể không có thứ gì như vậy\na là hằng số trong Python.

15267
14:35:11,682 --> 14:35:13,421
Tâm lý trong cộng đồng\nPython là

15268
14:35:13,421 --> 14:35:16,002
nếu bạn không muốn một số giá trị\nthay đổi, đừng chạm vào nó.

15269
14:35:17,152 --> 14:35:18,762
Vì vậy, cũng có sự đánh đổi ở đây.

15270
14:35:18,762 --> 14:35:21,522
Một số ngôn ngữ mạnh hơn\cũng không mang tính phòng thủ hơn thế.

15271
14:35:21,521 --> 14:35:25,511
Nhưng đó cũng là một phần của tư duy\n

15272
14:35:27,167 --> 14:35:29,459
KHÁN GIẢ: Thực sự\không có một đường màu xanh lá cây nào, trong--

15273
14:35:29,459 --> 14:35:30,959
DAVID J. Malan: Ồ, xin lỗi, ở đâu--

15274
14:35:31,601 --> 14:35:34,864
ĐỐI TƯỢNG: Chỉ có\không có dòng màu xanh lá cây nào được in tại một thời điểm.

15275
14:35:34,864 --> 14:35:36,572
DAVID J. Malan: Đó\là một sự chuyển tiếp đáng ngạc nhiên.

15276
14:35:36,572 --> 14:35:37,891
Hãy đi đến vấn đề đó trong giây lát\na, bởi vì chúng ta

15277
14:35:37,891 --> 14:35:40,141
cũng sẽ tạo lại\nví dụ về Mario đó, trong đó

15278
14:35:40,141 --> 14:35:43,447
chúng tôi thích những dấu chấm hỏi cho\n

15279
14:35:43,447 --> 14:35:45,072
Vì vậy, hãy quay lại vấn đề đó sau một giây.

15280
14:35:46,177 --> 14:35:49,883
ĐỐI TƯỢNG: Nếu chuỗi là bất biến,\n

15281
14:35:49,883 --> 14:35:51,841
DAVID J. Malan: Đúng,\ncác chuỗi là bất biến.

15282
14:35:51,841 --> 14:35:55,741
Bất cứ lúc nào bạn dường như đang sửa đổi\n

15283
14:35:57,002 --> 14:35:59,461
Vì vậy, nó sẽ chiếm thêm một chút\nbộ nhớ ở đâu đó.

15284
14:35:59,461 --> 14:36:02,667
Nhưng bạn không cần phải đối mặt với việc\nit Python đang làm điều đó cho bạn.

15285
14:36:02,667 --> 14:36:05,414
ĐỐI TƯỢNG: Vì vậy, bạn không giải phóng bất cứ điều gì.

15286
14:36:05,413 --> 14:36:06,621
DAVID J. Malan: Nói lại lần nữa nhé?

15287
14:36:07,747 --> 14:36:11,184
ĐỐI TƯỢNG: Bạn không thích\nthích nghỉ việc.

15288
14:36:11,184 --> 14:36:12,851
DAVID J. Malan: Bạn không giải phóng bất cứ thứ gì.

15289
14:36:12,851 --> 14:36:15,391
Vì vậy, nếu bạn không phải là người hâm mộ cuồng nhiệt\ntrong vài tuần qua

15290
14:36:15,391 --> 14:36:19,381
của malloc hoặc miễn phí hoặc\nbộ nhớ hoặc địa chỉ, hoặc tất cả

15291
14:36:19,381 --> 14:36:21,511
của các chi tiết thực hiện\nở mức độ thấp đó

15292
14:36:21,512 --> 14:36:23,912
Python là ngôn ngữ dành cho\nbạn, bởi vì tất cả những điều đó

15293
14:36:23,911 --> 14:36:25,861
được xử lý tự động cho bạn.

15294
14:36:28,982 --> 14:36:34,766
ĐỐI TƯỢNG: Mỗi lần lên biến, bạn\n

15295
14:36:36,222 --> 14:36:40,307
Chà, nếu không có chức năng chính trong\n

15296
14:36:40,307 --> 14:36:42,432
DAVID J. Malan: Bạn\nxác định một biến toàn cục như thế nào

15297
14:36:42,432 --> 14:36:44,014
nếu không có chức năng chính trong Python?

15298
14:36:44,014 --> 14:36:48,002
Các biến toàn cục, theo định nghĩa, luôn luôn\n

15299
14:36:49,002 --> 14:36:51,822
Nếu tôi muốn có một\nchức năng nằm ngoài

15300
14:36:51,822 --> 14:36:56,224
và do đó, toàn cầu tới\nang trong số này, như toàn cầu--

15301
14:36:56,224 --> 14:36:59,141
thực ra, đừng dùng từ toàn cầu,\n

15302
14:36:59,141 --> 14:37:03,972
biến bằng Foo, F-O-O,\ngiống như một chuỗi tùy ý

15303
14:37:03,972 --> 14:37:07,932
giá trị mà một nhà khoa học máy tính sẽ\n

15304
14:37:07,932 --> 14:37:10,521
Tuy nhiên, có một số lưu ý về cách bạn truy cập vào đó.

15305
14:37:10,521 --> 14:37:12,531
Nhưng chúng ta hãy quay lại\nđiều đó vào lúc khác.

15306
14:37:12,531 --> 14:37:14,551
Nhưng vấn đề đó cũng có thể giải quyết được.

15307
14:37:15,052 --> 14:37:16,302
Vì vậy chúng ta hãy tiếp tục và làm điều này.

15308
14:37:16,302 --> 14:37:19,572
Để quay lại câu hỏi về\n

15309
14:37:19,572 --> 14:37:21,822
và tạo một tệp có tên Mario.py.

15310
14:37:21,822 --> 14:37:24,222
Sẽ không bận tâm hiển thị mã C nữa.

15311
14:37:24,222 --> 14:37:26,112
Chúng tôi sẽ chỉ tập trung vào\nngôn ngữ mới ở đây.

15312
14:37:26,112 --> 14:37:31,061
Nhưng hãy nhớ lại rằng, trong Python, trong Mario, chúng ta\n

15313
14:37:31,061 --> 14:37:34,121
Đây là một màn hình ngẫu nhiên từ\nphiên bản cuộn bên 1

15314
14:37:35,322 --> 14:37:39,341
Và chúng tôi chỉ muốn in như ba\n

15315
14:37:39,341 --> 14:37:41,471
Chà, trong Python, chúng ta có thể\nlàm điều gì đó như thế này

15316
14:37:41,472 --> 14:37:47,802
in, ồ, xin lỗi, vì tôi nằm trong phạm vi\n

15317
14:37:48,349 --> 14:37:50,141
Và tôi nghĩ việc này\nkhá đơn giản.

15318
14:37:50,141 --> 14:37:52,781
Python của Mario.py, chúng tôi nhận được ba hàm băm.

15319
14:37:52,781 --> 14:37:55,371
Tuy nhiên, bạn có thể tưởng tượng\nviệc tham số hóa điều này ngay bây giờ

15320
14:37:55,372 --> 14:37:56,872
và nhận được đầu vào thực tế của người dùng.

15321
14:37:58,252 --> 14:38:03,942
Hãy để tôi lên đây và để tôi đi\n

15322
14:38:03,942 --> 14:38:07,612
và sau đó hãy lấy\đầu vào từ người dùng.

15323
14:38:07,612 --> 14:38:09,732
Vì vậy, nó thực sự là một\ngiá trị n, kiểu như, được rồi

15324
14:38:09,732 --> 14:38:14,712
lấyInt chiều cao của cột\ncác viên gạch mà bạn muốn làm.

15325
14:38:14,711 --> 14:38:18,792
Sau đó, hãy tiếp tục và in\n

15326
14:38:20,082 --> 14:38:21,906
Hãy in ra như năm giá trị băm.

15327
14:38:21,906 --> 14:38:24,281
Được rồi, một, hai, ba, bốn,\nnăm, có vẻ như cũng được.

15328
14:38:24,281 --> 14:38:26,199
Và nó sẽ hoạt động\nvới bất kỳ giá trị dương nào.

15329
14:38:26,199 --> 14:38:29,921
Nhưng nó sẽ không có tác dụng\nvì vậy còn âm 1 thì sao?

15330
14:38:29,921 --> 14:38:31,182
Điều đó không làm được gì cả.

15331
14:38:32,269 --> 14:38:35,351
Nhưng cũng hãy nhớ rằng điều đó sẽ không xảy ra\n

15332
14:38:35,351 --> 14:38:40,512
kỳ lạ, kiểu như, ồ, xin lỗi, nó đang diễn ra\n

15333
14:38:42,311 --> 14:38:45,341
Chúng tôi đang sử dụng hàm\ngetInt của CS50, đó là

15334
14:38:45,341 --> 14:38:48,231
xử lý tất cả những vấn đề đau đầu đó cho chúng tôi.

15335
14:38:48,232 --> 14:38:51,702
Tuy nhiên, điều gì sẽ xảy ra nếu người dùng thực sự\nnhập một số âm?

15336
14:38:52,631 --> 14:38:54,381
Vậy đó chính là lỗi mà tôi\n muốn nêu bật.

15337
14:38:54,381 --> 14:38:56,771
Sẽ thật tuyệt nếu bạn nhắc lại\n chúng và nhắc lại chúng.

15338
14:38:56,771 --> 14:38:59,081
Và trong C,\ncấu trúc lập trình mà chúng ta đã làm là gì

15339
14:38:59,082 --> 14:39:01,542
được sử dụng khi chúng tôi muốn\đặt câu hỏi cho người dùng.

15340
14:39:01,542 --> 14:39:05,802
Và sau đó, nếu họ không hợp tác,\n

15341
14:39:07,271 --> 14:39:08,621
DAVID J. Malan: Vâng,\nthực hiện vòng lặp while, phải không?

15342
14:39:08,622 --> 14:39:11,352
Điều đó rất hữu ích vì nó\gần giống với vòng lặp while.

15343
14:39:11,351 --> 14:39:14,621
Nhưng thay vì kiểm tra\nđiều kiện và sau đó làm điều gì đó

15344
14:39:14,622 --> 14:39:16,470
bạn làm điều gì đó và\nsau đó kiểm tra một điều kiện

15345
14:39:16,470 --> 14:39:18,762
điều này hợp lý với thông tin người dùng\đầu vào, bởi vì bạn là ai

15346
14:39:18,762 --> 14:39:21,137
thậm chí còn kiểm tra xem\nuser chưa làm gì cả?

15347
14:39:21,137 --> 14:39:22,722
Bạn cần logic đảo ngược đó.

15348
14:39:22,722 --> 14:39:26,531
Thật không may trong Python,\nkhông có vòng lặp do while.

15349
14:39:29,262 --> 14:39:32,112
Và thành thật mà nói, những thứ đó\đủ để tạo lại ý tưởng này.

15350
14:39:32,112 --> 14:39:35,682
Và cách thực hiện điều này trong\nPython, cách Pythonic,

15351
14:39:35,682 --> 14:39:38,682
là một thuật ngữ nghệ thuật khác trong\ncộng đồng, là để nói điều này.

15352
14:39:38,682 --> 14:39:42,822
Cố tình tạo ra một vòng lặp vô hạn,\n

15353
14:39:42,822 --> 14:39:46,451
Và sau đó làm những gì bạn phải làm,\nchẳng hạn như lấy Int từ người dùng

15354
14:39:46,451 --> 14:39:48,581
hỏi họ về tầm quan trọng của việc này.

15355
14:39:48,582 --> 14:39:54,792
Và sau đó, nếu đó là điều bạn muốn, hãy like\n

15356
14:39:56,542 --> 14:40:01,961
Vì vậy, đây là cách, trong Python, bạn có thể\n

15357
14:40:01,961 --> 14:40:03,836
Bạn cố tình tạo ra\nan vòng lặp vô hạn.

15358
14:40:03,836 --> 14:40:05,711
Vì vậy, điều gì đó sẽ\xảy ra ít nhất một lần.

15359
14:40:05,711 --> 14:40:08,801
Sau đó, nếu bạn nhận được câu trả lời\nbạn muốn, bạn sẽ thoát khỏi nó

15360
14:40:08,802 --> 14:40:10,852
đạt được logic tương tự một cách hiệu quả.

15361
14:40:10,851 --> 14:40:13,601
Vì vậy đây là cách\ncủa Python để thực hiện vòng lặp do while.

15362
14:40:13,601 --> 14:40:18,281
Hãy để tôi tiếp tục và chạy Python\nof Mario.py, lần này gõ vào 3.

15363
14:40:18,281 --> 14:40:21,192
Và bây giờ tôi chỉ lấy lại\n3 giá trị băm.

15364
14:40:21,192 --> 14:40:26,832
Tuy nhiên, điều gì sẽ xảy ra nếu tôi muốn\ngloại bỏ, cuối cùng thì sao?

15365
14:40:26,832 --> 14:40:31,580
chức năng thư viện CS50 đó, và\n

15366
14:40:31,580 --> 14:40:33,622
Nào, hãy tiếp tục và\nlàm yếu điều này một chút.

15367
14:40:33,622 --> 14:40:35,592
Hãy để tôi tiếp tục và\nxóa mục này tạm thời.

15368
14:40:35,591 --> 14:40:38,201
Hãy tạo cho tôi một chức năng chính để\ntôi không mắc lỗi tương tự

15369
14:40:39,881 --> 14:40:43,631
Và để tôi tự tạo cho mình một hàm tên là\n

15370
14:40:43,631 --> 14:40:47,141
Và bên trong hàm đó\nis sẽ có cùng một đoạn mã.

15371
14:40:47,141 --> 14:40:50,802
Nhưng tôi không muốn đột nhập vào\ntrường hợp này, tôi muốn trả về n.

15372
14:40:50,802 --> 14:40:53,815
Vì vậy, hãy nhớ lại rằng nếu bạn quay về\ntừ một hàm, bạn đã hoàn thành

15373
14:40:53,815 --> 14:40:55,732
bạn sẽ thoát\nngay tại thời điểm đó.

15374
14:40:56,841 --> 14:40:59,201
Bạn chỉ có thể nói return\nn bên trong vòng lặp

15375
14:40:59,201 --> 14:41:01,841
hoặc, nếu bạn muốn\nthoát ra, bạn

15376
14:41:01,841 --> 14:41:03,461
thay vào đó có thể làm điều gì đó như thế này.

15377
14:41:03,461 --> 14:41:09,222
Nghỉ ngơi rồi xuống đây\nbạn có thể quay lại, xuống đây

15378
14:41:11,152 --> 14:41:13,812
Và hãy để tôi nói một điểm ở đây\ntrước khi chúng ta quay lại vấn đề chính.

15379
14:41:13,811 --> 14:41:18,011
Điều này hơi khác\nvới C. Và điều này rất tinh tế.

15380
14:41:18,012 --> 14:41:23,772
Tôi đã làm gì ở đây mà trong C sẽ\n

15381
14:41:27,381 --> 14:41:28,741
Cái này siêu tinh tế.

15382
14:41:29,241 --> 14:41:32,432
ĐỐI TƯỢNG: Vậy chẳng phải chúng ta thích\nxác định hầu hết đối tượng

15383
14:41:32,432 --> 14:41:35,991
giống như chúng ta đang sử dụng nó\nđầu tiên, định nghĩa một đối tượng?

15384
14:41:40,796 --> 14:41:43,671
DAVID J. Malan: Rất giống, nó\n

15385
14:41:43,671 --> 14:41:47,502
Vì vậy, bạn không nên khai báo một\nbiến giống như kiểu dữ liệu.

15386
14:41:47,502 --> 14:41:51,942
Chúng tôi đã giải quyết vấn đề đó trước đây nhưng trực tuyến\n

15387
14:41:51,942 --> 14:41:55,122
Và sau đó chúng ta trả về n ở dòng 12.

15388
14:41:56,711 --> 14:42:01,932
Trong thế giới của C, nếu chúng ta đã tuyên bố\n

15389
14:42:01,932 --> 14:42:04,722
nó sẽ nằm trong phạm vi\nvòng lặp đó, mà

15390
14:42:04,722 --> 14:42:08,052
có nghĩa là ngay khi bạn thoát khỏi đó\n

15391
14:42:09,862 --> 14:42:12,612
Nó sẽ là cục bộ của\ndấu ngoặc nhọn trong đó.

15392
14:42:12,612 --> 14:42:16,241
Ở đây, về mặt logic, các dấu ngoặc nhọn\na đã biến mất, nhưng phần thụt lề

15393
14:42:16,241 --> 14:42:20,771
làm rõ rằng n vẫn ở bên trong\n

15394
14:42:20,771 --> 14:42:23,801
Nhưng thực ra n vẫn nằm trong phạm vi\nin trong Python.

15395
14:42:23,802 --> 14:42:26,902
Thời điểm bạn tạo một biến\n

15396
14:42:26,902 --> 14:42:30,281
Nó có sẵn ở mọi nơi trong\nchức năng đó, ngay cả bên ngoài

15397
14:42:30,281 --> 14:42:32,211
của vòng lặp mà bạn đã xác định nó.

15398
14:42:32,211 --> 14:42:35,591
Vì vậy, logic này thực sự ổn trong Python.

15399
14:42:35,591 --> 14:42:38,659
Trong C, hãy gọi lại, để giải quyết\nvấn đề tương tự

15400
14:42:38,660 --> 14:42:41,202
chúng ta sẽ phải làm điều gì đó\na hơi hack như thế này

15401
14:42:41,201 --> 14:42:46,121
như định nghĩa n ở đây trên dòng 8,\n

15402
14:42:46,122 --> 14:42:48,522
và do đó nó tồn tại trên dòng 13.

15403
14:42:48,521 --> 14:42:52,221
Đó không còn là một vấn đề hay nhu cầu trong Python nữa.

15404
14:42:52,222 --> 14:42:54,222
Sau khi bạn tạo một biến,\ngay cả khi nó được lồng vào nhau

15405
14:42:54,222 --> 14:42:56,389
lồng nhau, lồng bên trong\nmột số vòng lặp hoặc điều kiện

15406
14:42:56,389 --> 14:43:00,042
nó vẫn tồn tại trong\nchính hàm đó.

15407
14:43:00,042 --> 14:43:04,391
Được rồi, nếu bạn có câu hỏi nào về vấn đề này,\n

15408
14:43:04,391 --> 14:43:08,201
lại thoát khỏi thư viện CS50?

15409
14:43:08,201 --> 14:43:10,822
Được rồi, hãy để tôi tiếp tục và\n lấy chiều cao từ người dùng.

15410
14:43:10,822 --> 14:43:13,279
Hãy tiếp tục và tạo một\nbiến có tên là chiều cao.

15411
14:43:13,279 --> 14:43:14,981
Hãy gọi đây là hàm lấy chiều cao.

15412
14:43:14,982 --> 14:43:19,902
Sau đó hãy sử dụng giá trị chiều cao đó,\n

15413
14:43:19,902 --> 14:43:21,522
Và hãy để tôi xem bây giờ tất cả điều này có hiệu quả không.

15414
14:43:22,932 --> 14:43:25,631
Hy vọng là tôi đã không làm sai, nhưng tôi đã làm vậy.

15415
14:43:25,631 --> 14:43:27,981
Nhưng bây giờ đây là một sửa chữa dễ dàng.

15416
14:43:28,482 --> 14:43:29,607
ĐỐI TƯỢNG: Phải gọi main.

15417
14:43:29,607 --> 14:43:31,065
DAVID J. Malan: Tôi phải gọi main.

15418
14:43:31,065 --> 14:43:32,502
Vì vậy, một lần nữa, tôi đã xóa nó trước đó.

15419
14:43:33,442 --> 14:43:34,650
Vì vậy, tôi thực sự đang gọi main.

15420
14:43:34,650 --> 14:43:38,711
Hãy để tôi chạy lại Python của\nMario.py, thế là xong, chiều cao 3.

15421
14:43:40,402 --> 14:43:42,402
Vậy hãy làm điều cuối cùng\nvới Mario, chỉ

15422
14:43:42,402 --> 14:43:45,502
để gắn kết ý tưởng đó bây giờ với những ngoại lệ từ trước.

15423
14:43:45,502 --> 14:43:47,591
Một lần nữa, ngoại lệ là\na tính năng của Python

15424
14:43:47,591 --> 14:43:49,581
nhờ đó bạn có thể cố gắng làm điều gì đó.

15425
14:43:49,582 --> 14:43:53,232
Và nếu có vấn đề, bạn có thể\n

15426
14:43:53,232 --> 14:43:56,592
Trước đây tôi chỉ xử lý bằng cách la hét\n

15427
14:43:56,591 --> 14:43:59,981
Nhưng hãy thực sự sử dụng điều này để\ntriển khai lại getInt của CS50

15428
14:44:00,762 --> 14:44:03,652
Hãy để tôi vứt bỏ hàm getInt của\nCS50.

15429
14:44:03,652 --> 14:44:09,402
Và bây giờ hãy để tôi tiếp tục và\nthay thế getInt bằng đầu vào.

15430
14:44:09,402 --> 14:44:12,192
Nhưng chỉ sử dụng đầu vào thôi thì chưa đủ.

15431
14:44:12,192 --> 14:44:16,002
Tôi phải thêm gì vào\ndòng mã ở dòng 8 này?

15432
14:44:16,002 --> 14:44:17,262
Nếu tôi muốn lấy lại Int?

15433
14:44:18,311 --> 14:44:20,353
DAVID J. Malan: Vâng, tôi\nphải chuyển nó sang Int

15434
14:44:20,353 --> 14:44:23,021
bằng cách gọi hàm Int\n xung quanh giá trị đó

15435
14:44:23,021 --> 14:44:25,271
hoặc tôi có thể thực hiện việc đó trên một\ndòng riêng biệt, cho rõ ràng.

15436
14:44:25,271 --> 14:44:28,631
Tôi cũng có thể làm n bằng Int của n.

15437
14:44:28,631 --> 14:44:31,542
Điều đó cũng có tác dụng, nhưng đó\nlà một dòng bổ sung không cần thiết.

15438
14:44:31,542 --> 14:44:34,512
Điều này là chưa đủ, vì\nđiều đó không thay đổi giá trị.

15439
14:44:35,457 --> 14:44:36,582
Nhưng rồi nó lại vứt nó đi.

15440
14:44:37,713 --> 14:44:40,421
Vì vậy, cách thông thường để thực hiện việc này\n

15441
14:44:40,421 --> 14:44:41,879
chỉ để giữ mọi thứ tốt đẹp và chặt chẽ.

15442
14:44:43,302 --> 14:44:47,992
Nếu tôi chạy Python của Mario.py, tôi có thể\n

15443
14:44:47,991 --> 14:44:52,241
Tôi vẫn có thể gõ âm 1, vì\n

15444
14:44:52,241 --> 14:44:55,271
Những gì tôi chưa xử lý\là thông tin đầu vào kỳ lạ như con mèo

15445
14:44:55,271 --> 14:44:58,281
hoặc một chuỗi nào đó\nkhông phải là số cơ sở 10.

15446
14:44:58,281 --> 14:45:00,402
Vì vậy, một lần nữa, đây là dấu vết của tôi.

15447
14:45:00,402 --> 14:45:03,522
Và để ý rằng ở đây,\ntôi hãy cuộn lên một chút

15448
14:45:03,521 --> 14:45:08,141
ở đây chúng ta thực sự có thể thấy\nchi tiết hơn trong quá trình truy nguyên.

15449
14:45:08,141 --> 14:45:13,421
Lưu ý rằng, giống như trong C, hoặc chỉ\n

15450
14:45:14,622 --> 14:45:18,012
Bạn có thể thấy đề cập đến mô-đun, đó\n

15451
14:45:18,012 --> 14:45:19,535
là chức năng chính của tôi và đạt được chiều cao.

15452
14:45:19,535 --> 14:45:20,952
Vì vậy hãy chú ý, nó hơi ngược.

15453
14:45:20,951 --> 14:45:23,241
Nó từ trên xuống dưới thay vì\ntừ dưới lên như chúng ta đã vẽ

15454
14:45:23,241 --> 14:45:25,241
trên bảng\nngày hôm trước, và như chúng tôi đã hình dung

15455
14:45:25,241 --> 14:45:27,042
chồng khay trong quán cà phê.

15456
14:45:27,042 --> 14:45:29,202
Nhưng đây là ngăn xếp của bạn,\nof có chức năng

15457
14:45:29,201 --> 14:45:30,851
đã được gọi, từ trên xuống dưới.

15458
14:45:30,851 --> 14:45:33,881
Lấy chiều cao là cái gần đây nhất,\nmain là cái đầu tiên

15459
14:45:35,722 --> 14:45:40,262
Vậy chúng ta hãy cố gắng làm, hãy cố gắng làm điều này\n

15460
14:45:41,262 --> 14:45:46,242
Tôi sẽ đi vào đây, và tôi\n

15461
14:45:46,241 --> 14:45:53,591
Rất tiếc, hãy thử làm như sau, ngoại trừ\n

15462
14:45:53,591 --> 14:45:57,161
sau đó hãy tiếp tục và nói điều gì đó,\nà, giống như trước đây, hãy in

15463
14:45:57,161 --> 14:46:00,351
đó không phải là dấu chấm than số nguyên.

15464
14:46:00,351 --> 14:46:03,281
Nhưng điểm khác biệt lần này là\nvì tôi đang ở trong một vòng lặp nên người dùng

15465
14:46:03,281 --> 14:46:05,722
sẽ có cơ hội\nkhắc phục sau sự cố này.

15466
14:46:05,722 --> 14:46:08,862
Vì vậy, nếu tôi chạy Mario.py, 3\n vẫn hoạt động như trước.

15467
14:46:08,862 --> 14:46:12,402
Nếu tôi chạy Mario.py và gõ\nin cat, tôi sẽ phát hiện ra nó ngay bây giờ

15468
14:46:12,402 --> 14:46:15,762
và bởi vì tôi vẫn còn ở trong vòng lặp đó,\n

15469
14:46:15,762 --> 14:46:19,572
bởi vì tôi đã bắt được, có thể nói như vậy,\n

15470
14:46:19,572 --> 14:46:23,472
đây, đó là cách trong Python\nđể phát hiện những loại lỗi này

15471
14:46:23,472 --> 14:46:26,202
nếu không thì nó sẽ hiển thị\ntrên màn hình của chính người dùng.

15472
14:46:26,201 --> 14:46:28,061
Nếu tôi gõ vào mèo, chó,\nđiều đó không có tác dụng.

15473
14:46:28,061 --> 14:46:33,341
Tuy nhiên, nếu tôi nhập vào 2, tôi sẽ nhận được hai\n

15474
14:46:33,341 --> 14:46:35,261
Có câu hỏi nào về\nđiều này không và chúng ta sẽ không đi

15475
14:46:35,262 --> 14:46:37,272
dành quá nhiều thời gian cho\ngoại lệ, nhưng chỉ muốn

15476
14:46:37,271 --> 14:46:40,201
để cho bạn thấy những gì liên quan đến\n

15477
14:46:40,701 --> 14:46:42,284
ĐỐI TƯỢNG: Sau đó, dấu thăng ở dòng.

15478
14:46:42,285 --> 14:46:43,827
DAVID J. Malan: Được rồi, vậy chúng ta hãy làm điều này.

15479
14:46:43,826 --> 14:46:45,661
Điều đó thực sự liên quan đến\ncâu hỏi trước đó

15480
14:46:45,661 --> 14:46:47,581
về việc in\nhash trên cùng một dòng

15481
14:46:47,582 --> 14:46:50,330
hoặc có thể điều gì đó như thế này,\nnơi chúng ta có những viên gạch nhỏ

15482
14:46:50,330 --> 14:46:51,872
trên bầu trời, hoặc những dấu hỏi nhỏ.

15483
14:46:51,872 --> 14:46:54,247
Hãy tạo lại ý tưởng này,\nvì vấn đề với việc in ấn

15484
14:46:54,247 --> 14:46:57,452
như đã được lưu ý trước đó, có phải bạn\n

15485
14:46:57,451 --> 14:46:58,981
Nhưng nếu chúng ta không muốn điều đó thì sao?

15486
14:46:58,982 --> 14:47:01,262
Nào, hãy thay đổi hoàn toàn\nchương trình này.

15487
14:47:01,262 --> 14:47:02,832
Hãy để tôi vứt bỏ tất cả các chức năng.

15488
14:47:02,832 --> 14:47:05,742
Hãy hướng tới một thế giới đơn giản hơn\nnơi chúng ta đang thực hiện việc này.

15489
14:47:05,741 --> 14:47:07,434
Vì vậy, hãy để tôi bắt đầu lại với Mario.py.

15490
14:47:07,434 --> 14:47:09,641
Tôi sẽ không bận tâm đến\ngoại lệ hoặc chức năng.

15491
14:47:09,641 --> 14:47:15,932
Chúng ta hãy thực hiện một chương trình rất đơn giản, để\n

15492
14:47:15,932 --> 14:47:19,381
lần này, vì có\n4 thứ này trên bầu trời.

15493
14:47:19,381 --> 14:47:21,752
Hãy tiếp tục và\nin ra một dấu chấm hỏi

15494
14:47:21,752 --> 14:47:23,972
để đại diện cho mỗi viên gạch đó.

15495
14:47:23,972 --> 14:47:27,662
Kỳ lạ là bạn biết chuyện này sẽ không kết thúc\n

15496
14:47:27,661 --> 14:47:30,971
như bạn đã dự đoán, trên các dòng riêng biệt.

15497
14:47:30,972 --> 14:47:33,902
Vì vậy hóa ra hàm\nprint thực sự

15498
14:47:33,902 --> 14:47:36,842
nhận nhiều đối số, không phải\n

15499
14:47:36,841 --> 14:47:40,171
mà còn có một số đối số bổ sung,\ncho phép bạn chỉ định

15500
14:47:40,171 --> 14:47:42,691
kết thúc dòng mặc định sẽ là gì.

15501
14:47:42,692 --> 14:47:45,632
Nhưng điều thú vị\nvề điều này là nếu bạn

15502
14:47:45,631 --> 14:47:49,151
muốn thay đổi dòng\nending thành một cái gì đó như

15503
14:47:49,152 --> 14:47:53,312
trích dẫn bỏ trích dẫn, "đó\nkhông có gì," thay vì dấu gạch chéo ngược n

15504
14:47:53,311 --> 14:47:55,831
điều này vẫn chưa đủ,\nvì trong Python, bạn

15505
14:47:55,832 --> 14:47:58,292
có thể có hai loại\đối số hoặc tham số.

15506
14:47:58,292 --> 14:48:01,682
Một số đối số mang tính vị trí,\n

15507
14:48:01,682 --> 14:48:03,211
một danh sách các đối số được phân tách bằng dấu phẩy.

15508
14:48:03,211 --> 14:48:06,061
Và đó là điều chúng tôi đã làm mọi lúc\n

15509
14:48:06,061 --> 14:48:08,186
dấu phẩy, điều gì đó, chúng tôi đã làm\nit trong printf mọi lúc

15510
14:48:08,186 --> 14:48:10,502
và trong các hàm khác\nnhận nhiều đối số.

15511
14:48:10,502 --> 14:48:14,402
Trong Python, bạn có, không phải các đối số vị trí

15512
14:48:14,402 --> 14:48:18,182
nơi bạn chỉ cần phân tách chúng bằng dấu phẩy,\n

15513
14:48:19,171 --> 14:48:22,741
Ngoài ra còn có các đối số được đặt tên,\ntrông có vẻ kỳ lạ nhưng lại

15514
14:48:22,741 --> 14:48:24,661
hữu ích vì những lý do như thế này.

15515
14:48:24,661 --> 14:48:27,421
Nếu bạn đọc\ntài liệu, bạn sẽ thấy

15516
14:48:27,421 --> 14:48:31,261
rằng có một đối số được đặt tên\nmà Python chấp nhận, được gọi là end.

15517
14:48:31,262 --> 14:48:34,202
Và nếu bạn đặt cái đó\nbằng cái gì đó, cái đó

15518
14:48:34,201 --> 14:48:36,721
thay vào đó sẽ được sử dụng ở cuối\ncủa mỗi dòng

15519
14:48:36,722 --> 14:48:39,272
mặc định, mà\ntài liệu cũng sẽ nói

15520
14:48:39,271 --> 14:48:41,221
là trích dẫn dấu gạch chéo ngược n.

15521
14:48:41,222 --> 14:48:45,522
Vì vậy, dòng này ở đây không có tác dụng\n logic của tôi vào lúc này.

15522
14:48:45,521 --> 14:48:49,801
Nhưng nếu tôi thay đổi nó thành trích dẫn\nunquote, về cơ bản sẽ ghi đè

15523
14:48:49,802 --> 14:48:54,992
ký tự dòng mới mặc định và\n

15524
14:48:55,800 --> 14:48:57,092
Tuy nhiên, có một chút lỗi.

15525
14:48:57,091 --> 14:49:00,131
Lời nhắc của tôi không có nghĩa là\nở trên cùng một dòng.

15526
14:49:00,131 --> 14:49:02,161
Vì vậy tôi có thể khắc phục điều đó bằng cách\nkhông in gì cả.

15527
14:49:02,161 --> 14:49:05,161
Nhưng thực sự thì cũng chẳng là gì đâu\n

15528
14:49:05,161 --> 14:49:09,451
Vì vậy, hãy để tôi chạy lại Python của\nMario.py và bây giờ chúng ta

15529
14:49:09,451 --> 14:49:12,661
có những gì tôi dự định lúc đầu\n

15530
14:49:13,692 --> 14:49:17,432
Và đây chỉ là một ví dụ\nvề một đối số có tên.

15531
14:49:17,432 --> 14:49:19,802
Nhưng đây là mô hình\nphổ biến trong Python 2

15532
14:49:19,802 --> 14:49:22,772
không chỉ phân tách mọi thứ bằng\ndấu phẩy mà còn phải rất cụ thể

15533
14:49:22,771 --> 14:49:27,331
bởi vì chức năng in có thể mất\n

15534
14:49:27,332 --> 14:49:31,150
Và Chúa ơi, nếu bạn phải\nét như 10 hoặc 20 dấu phẩy

15535
14:49:32,192 --> 14:49:34,109
Bạn sẽ nhận được\nmọi thứ không đúng thứ tự.

15536
14:49:34,108 --> 14:49:37,121
Các đối số được đặt tên cho phép bạn\ncó khả năng kiên cường chống lại điều đó.

15537
14:49:37,122 --> 14:49:39,211
Vì vậy, bạn chỉ xác định\các đối số theo tên và nó

15538
14:49:39,211 --> 14:49:42,525
không quan trọng chúng theo thứ tự nào.

15539
14:49:42,525 --> 14:49:46,682
Được rồi, có bất kỳ câu hỏi nào, sau đó,\n

15540
14:49:46,682 --> 14:49:50,792
Và để rõ ràng, bạn có thể làm\nđiều gì đó như, rất kỳ lạ

15541
14:49:50,792 --> 14:49:56,432
nhưng được mong đợi một cách hợp lý, như thế này, bởi\n

15542
14:49:56,432 --> 14:49:58,351
Nhưng cách đúng đắn để\ngiải quyết vấn đề Mario

15543
14:49:58,351 --> 14:50:02,173
sẽ chỉ ghi đè\nit để không giống như thế này.

15544
14:50:02,173 --> 14:50:03,631
Được rồi, thế này cho mát mẻ nhé.

15545
14:50:03,631 --> 14:50:05,521
Và đây là lý do tại sao rất nhiều người thích Python.

15546
14:50:05,521 --> 14:50:06,961
Giả sử bạn không thực sự thích vòng lặp.

15547
14:50:06,961 --> 14:50:08,491
Bạn không thực sự thích\ncác chương trình ba dòng

15548
14:50:08,491 --> 14:50:11,158
bởi vì nó dài hơn gấp ba lần mức cần thiết.

15549
14:50:11,158 --> 14:50:15,722
Điều gì sẽ xảy ra nếu bạn vừa in\na dấu chấm hỏi bốn lần?

15550
14:50:15,722 --> 14:50:19,902
Python, rất tiếc, Python của\nMario.py, nó cũng hoạt động.

15551
14:50:19,902 --> 14:50:23,072
Hóa ra là, giống như\ntoán tử dấu cộng trong Python

15552
14:50:23,072 --> 14:50:27,091
có thể nối các thứ lại với nhau,\ntoán tử nhân thì không

15553
14:50:28,362 --> 14:50:32,592
Nó thực sự có nghĩa là, hãy lấy cái này và\nghép nó lại bốn lần.

15554
14:50:32,591 --> 14:50:35,521
Vì vậy, đó là một cách\chưng cất thành một dòng những gì

15555
14:50:35,521 --> 14:50:39,271
nếu không thì sẽ lấy nhiều\n

15556
14:50:39,271 --> 14:50:43,651
dòng trong Python, nhưng thực sự\nbây giờ khá ngắn gọn trong Python

15557
14:50:44,906 --> 14:50:48,031
Hãy làm một ví dụ cuối cùng về Mario,\n

15558
14:50:48,031 --> 14:50:50,612
Nếu đây là một phần khác\ncủa giao diện Mario

15559
14:50:50,612 --> 14:50:53,322
ví dụ: nó giống như một lưới có\n3 x 3 viên gạch.

15560
14:50:53,322 --> 14:50:57,211
Vậy bây giờ là hai chiều, không chỉ\n

15561
14:50:57,211 --> 14:50:59,652
Hãy in ra thứ gì đó\nnhư thế bằng cách sử dụng hàm băm.

15562
14:50:59,652 --> 14:51:02,592
Vâng, làm thế nào để tôi làm điều này.

15563
14:51:02,591 --> 14:51:05,731
Vậy đối với i trong phạm vi 3 thì sao?

15564
14:51:05,732 --> 14:51:10,802
Sau đó tôi có thể làm cho j trong phạm vi\n

15565
14:51:10,802 --> 14:51:12,332
và điều đó là hợp lý để đếm.

15566
14:51:12,332 --> 14:51:17,522
Bây giờ tôi có thể in ra một biểu tượng băm,\n

15567
14:51:17,521 --> 14:51:24,182
Python của Mario.py, được rồi, đó\nchỉ là một cột dài khủng khiếp.

15568
14:51:24,182 --> 14:51:27,762
Tôi cần sửa cái gì và ở đâu\n

15569
14:51:27,762 --> 14:51:32,372
Vì vậy, 3 x 3 viên gạch, thay vì một cột dài.

15570
14:51:32,972 --> 14:51:37,022
ĐỐI TƯỢNG: Tại sao chúng ta không tạo\na một dòng rồi bỏ qua nó.

15571
14:51:37,021 --> 14:51:39,971
DAVID J. Malan: Được rồi, vậy là sau\nin 3, chúng ta muốn bỏ qua một dòng.

15572
14:51:39,972 --> 14:51:42,272
Vì vậy, có thể in\nout một dòng trống ở đây.

15573
14:51:43,262 --> 14:51:46,442
Tôi thích bản năng đó, phải không, print\n

15574
14:51:46,442 --> 14:51:48,781
Hãy tiếp tục và chạy\nPython của Mario.py.

15575
14:51:48,781 --> 14:51:53,101
Được rồi, nó rõ hơn,\ntôi đang làm gì nhưng vẫn sai.

15576
14:51:53,101 --> 14:51:55,631
Tuy nhiên, tôi có thể làm gì,\ncách khắc phục còn lại là gì?

15577
14:51:56,131 --> 14:51:59,311
KHÁN GIẢ: Vì vậy, ngay phía sau hai.

15578
14:51:59,311 --> 14:52:02,201
DAVID J. Malan: Vâng, tôi đang ghi thêm một dòng mới ở đây

15579
14:52:02,201 --> 14:52:04,391
điều mà tôi không muốn\nkhi tôi ở hàng này.

15580
14:52:04,391 --> 14:52:08,372
Vì vậy, hãy để tôi thực hiện n bằng trích dẫn không trích dẫn,\n

15581
14:52:10,472 --> 14:52:13,866
Python của Mario.py, thì đấy, bây giờ\nchúng ta đã có nó, ở dạng hai chiều.

15582
14:52:13,866 --> 14:52:15,241
Và thậm chí điều này, chúng ta có thể thắt chặt hơn.

15583
14:52:15,241 --> 14:52:17,741
Giống như, chúng ta có thể sử dụng\nthủ thuật nhỏ mà chúng ta đã học được.

15584
14:52:17,741 --> 14:52:21,752
Vì vậy chúng ta chỉ có thể nói,\nin một hàm băm 3 lần

15585
14:52:21,752 --> 14:52:24,332
và chúng ta có thể loại bỏ hoàn toàn một\nvòng lặp đó.

15586
14:52:24,332 --> 14:52:27,452
Tất cả những gì nó đang làm là, rất tiếc, tất cả chỉ là\n

15587
14:52:27,451 --> 14:52:29,581
Nhưng không, tôi không muốn làm điều đó.

15588
14:52:29,582 --> 14:52:31,353
Tôi phải làm sao đây, làm cách nào để khắc phục điều này.

15589
14:52:31,353 --> 14:52:33,061
Tôi không nghĩ mình muốn\nđiều này nữa, phải không?

15590
14:52:33,061 --> 14:52:34,871
Bởi vì điều đó mang lại\ncho tôi thêm một dòng mới.

15591
14:52:34,872 --> 14:52:37,782
Vì thế bây giờ chương trình này\nđã thực sự được thắt chặt.

15592
14:52:37,781 --> 14:52:39,572
Điều tương tự, hai dòng mã.

15593
14:52:39,572 --> 14:52:43,741
Nhưng chúng tôi hiện đang triển khai điều này\n

15594
14:52:43,741 --> 14:52:46,961
Được rồi, có câu hỏi nào về những điều này không?

15595
14:52:47,461 --> 14:52:53,311
KHÁN GIẢ: Có lý do thực tế nào không\n

15596
14:52:53,311 --> 14:52:56,371
chức năng in, bạn\nkhông được đặt dấu cách nào trong đó.

15597
14:52:56,372 --> 14:52:58,952
DAVID J. Malan: Nếu tôi\n in n, bất kỳ khoảng trắng nào.

15598
14:52:59,822 --> 14:53:01,961
ĐỐI TƯỢNG: Bất cứ khi nào chúng ta\nviết n chẳng hạn

15599
14:53:01,961 --> 14:53:05,372
chức năng in\nis, bạn biết đấy, theo thứ tự

15600
14:53:05,372 --> 14:53:10,342
để ngăn nó chuyển sang\ndòng mới, có vẻ như bất kỳ khoảng trắng nào

15601
14:53:10,341 --> 14:53:14,322
chúng tôi đã làm như n bằng và sau đó quá gần.

15602
14:53:20,764 --> 14:53:24,552
Vì vậy, trong phiên bản trước, hãy để tôi\n

15603
14:53:25,692 --> 14:53:28,242
Quy ước trong Python\nis không làm điều đó.

15604
14:53:28,872 --> 14:53:30,785
Nó chỉ bắt đầu thêm quá nhiều không gian.

15605
14:53:30,785 --> 14:53:32,952
Và điều này hơi\không nhất quán, bởi vì, trước đó

15606
14:53:32,951 --> 14:53:34,991
khi chúng ta nói về\nnhư dấu cộng hoặc dấu cách

15607
14:53:34,991 --> 14:53:37,271
xung quanh các dấu nhỏ hơn hoặc bằng\n, tôi đã nói thêm nó.

15608
14:53:37,271 --> 14:53:39,531
Ở đây thực sự\nrõ ràng hơn và được đề xuất

15609
14:53:39,531 --> 14:53:40,781
để giữ chúng chặt chẽ hơn với nhau.

15610
14:53:40,781 --> 14:53:44,082
Nếu không,\nviệc đọc các khoảng trống ở đâu sẽ trở nên khó khăn hơn.

15611
14:53:45,341 --> 14:53:50,878
Được rồi, chúng ta hãy làm,\n\nnghỉ giải lao thêm năm phút nữa.

15612
14:53:51,461 --> 14:53:54,254
Và sau đó chúng ta sẽ đi sâu vào\n

15613
14:53:54,254 --> 14:53:57,682
và cuối cùng xây dựng với một số\n

15614
14:53:59,652 --> 14:54:04,781
Được rồi, hầu như tất cả\n ví dụ chúng ta vừa làm

15615
14:54:04,781 --> 14:54:07,061
là sự tái hiện\nnhững gì chúng tôi đã làm trong tuần 1.

15616
14:54:07,061 --> 14:54:09,641
Và hãy nhớ lại rằng tuần 1 là tuần nặng về cú pháp nhất.

15617
14:54:09,641 --> 14:54:13,451
Đó là khi chúng tôi lần đầu tiên học\n

15618
14:54:13,451 --> 14:54:16,421
chúng tôi bắt đầu tập trung hơn một chút vào các ý tưởng, như mảng

15619
14:54:16,421 --> 14:54:18,161
và các cấu trúc cấp cao khác.

15620
14:54:18,161 --> 14:54:21,401
Và chúng ta sẽ làm điều đó một lần nữa ở đây, cô đọng\n

15621
14:54:21,402 --> 14:54:23,772
thành một tập hợp ít ví dụ hơn trong Python.

15622
14:54:23,771 --> 14:54:26,541
Và chúng ta sẽ đạt đến đỉnh cao bằng cách\nthực sự thử nghiệm Python

15623
14:54:26,542 --> 14:54:28,822
và làm những việc\nsẽ khó thực hiện hơn nhiều

15624
14:54:28,822 --> 14:54:33,351
và tốn nhiều thời gian hơn để làm trong C,\n

15625
14:54:33,351 --> 14:54:36,311
Nhưng làm thế nào để bạn tìm ra\không biết những chức năng nào tồn tại

15626
14:54:36,311 --> 14:54:39,491
nếu bạn không nghe thấy nó trong\nlớp học thì bạn sẽ không thấy nó trên mạng

15627
14:54:39,491 --> 14:54:43,002
nhưng bạn muốn xem nó một cách chính thức, bạn\n

15628
14:54:44,741 --> 14:54:47,862
Và tôi sẽ từ chối điều đó, thành thật mà nói,\n

15629
14:54:49,271 --> 14:54:51,761
Google thường sẽ là\nbạn của bạn, vì vậy hãy tìm kiếm thông tin trên Google

15630
14:54:51,762 --> 14:54:55,872
bạn quan tâm, hãy tìm đường đi\n

15631
14:54:55,872 --> 14:54:58,932
hoặc StackOverflow.com là\nantrang web phổ biến khác.

15632
14:54:58,932 --> 14:55:01,302
Tuy nhiên, như mọi khi,\ndòng này sẽ được tìm kiếm trên Google

15633
14:55:01,302 --> 14:55:04,122
những thứ như làm cách nào để chuyển đổi chuỗi\na thành chữ thường.

15634
14:55:04,122 --> 14:55:05,592
Giống như điều đó hợp lý với Google.

15635
14:55:05,591 --> 14:55:09,681
Hoặc cách chuyển đổi sang chữ hoa hoặc\n

15636
14:55:09,682 --> 14:55:14,472
Nhưng tất nhiên, việc tìm kiếm trên Google những thứ như\n

15637
14:55:14,472 --> 14:55:15,641
tất nhiên là vượt qua ranh giới.

15638
14:55:15,641 --> 14:55:18,599
Nhưng tiến về phía trước và thực sự với\n

15639
14:55:18,599 --> 14:55:20,741
và Stack Overflow là\nbạn bè của bạn, nhưng dòng

15640
14:55:20,741 --> 14:55:23,061
nằm giữa cái hợp lý\n và cái không hợp lý.

15641
14:55:23,061 --> 14:55:26,411
Vì vậy, hãy để tôi chính thức sử dụng tính năng tìm kiếm tài liệu\nPython, chỉ cần

15642
14:55:26,411 --> 14:55:29,051
để tìm kiếm thứ gì đó\nnhư hàm viết thường.

15643
14:55:29,052 --> 14:55:31,062
Giống như, tôi biết tôi có thể\nviết thường mọi thứ trong Python.

15644
14:55:32,502 --> 14:55:34,391
Vậy hãy để tôi tìm kiếm\ntừ thấp hơn.

15645
14:55:34,391 --> 14:55:37,332
Bạn sẽ thường nhận được một\nkết quả vô cùng ấn tượng

15646
14:55:37,332 --> 14:55:40,200
vì Python khá lớn\n

15647
14:55:40,199 --> 14:55:42,491
Và bạn sẽ muốn\ntìm kiếm những hình mẫu quen thuộc.

15648
14:55:42,491 --> 14:55:45,581
Vì bất kỳ lý do gì,\nstring.low, có lẽ là

15649
14:55:45,582 --> 14:55:48,942
phổ biến hơn hoặc được sử dụng phổ biến hơn\n

15650
14:55:48,942 --> 14:55:51,982
Nhưng nó có màu tím vì tôi đã nhấp vào\n

15651
14:55:51,982 --> 14:55:54,972
Vì vậy, str.low có lẽ\nlà điều tôi muốn, bởi vì tôi

15652
14:55:54,972 --> 14:55:57,582
hiện tại tôi đang quan tâm\nin các chuỗi viết hoa thường.

15653
14:55:57,582 --> 14:56:01,779
Khi tôi nhấp vào đó, đây là một ví dụ\n

15654
14:56:02,322 --> 14:56:03,862
Nó ở định dạng chung này.

15655
14:56:03,862 --> 14:56:05,862
Đây là hàm str.low của tôi.

15656
14:56:05,862 --> 14:56:08,061
Điều này trả về một bản sao của\nchuỗi, với tất cả

15657
14:56:08,061 --> 14:56:10,271
của các ký tự được viết hoa\nđược chuyển thành chữ thường

15658
14:56:10,271 --> 14:56:12,191
và thuật toán\thuật toán viết dưới, dot dot dot.

15659
14:56:12,192 --> 14:56:13,690
Vì vậy, điều đó không mang lại cho tôi nhiều.

15660
14:56:13,690 --> 14:56:14,982
Nó không cho tôi mã mẫu.

15661
14:56:14,982 --> 14:56:16,732
Nhưng nó cho biết chức năng đó làm gì.

15662
14:56:16,732 --> 14:56:20,412
Và nếu chúng ta tiếp tục tìm kiếm, bạn sẽ thấy\n

15663
14:56:20,411 --> 14:56:24,641
Trước đây tôi đã sử dụng tín hiệu analog của nó, Rstrip, phải\n

15664
14:56:24,641 --> 14:56:27,521
đó là dải, từ cuối a\n

15665
14:56:27,521 --> 14:56:29,451
như một dòng mới, hoặc thậm chí một cái gì đó khác.

15666
14:56:29,451 --> 14:56:32,932
Và nếu bạn cuộn qua\nstring, trang web này sẽ ở đây.

15667
14:56:32,932 --> 14:56:34,631
Và chúng ta đã đi được nửa trang rồi.

15668
14:56:34,631 --> 14:56:36,701
Nếu bạn thấy thanh cuộn\ncủa tôi, nhỏ ở bên phải

15669
14:56:36,701 --> 14:56:41,771
có rất nhiều chức năng\n

15670
14:56:41,771 --> 14:56:44,981
Và đây chỉ là bằng chứng cho thấy\n

15671
14:56:44,982 --> 14:56:49,142
Nhưng đó cũng là lý do để\nđảm bảo rằng mục tiêu, khi

15672
14:56:49,141 --> 14:56:51,391
chơi đùa với một số\nngôn ngữ mới và học nó

15673
14:56:51,391 --> 14:56:53,120
không phải là học nó một cách thấu đáo.

15674
14:56:53,120 --> 14:56:54,912
Giống như trong tiếng Anh\cũng như bất kỳ ngôn ngữ nào của con người

15675
14:56:54,911 --> 14:56:57,161
luôn có những\ntừ vựng bạn không biết

15676
14:56:57,161 --> 14:57:00,084
cách trình bày\nthông tin giống nhau bằng một số ngôn ngữ.

15677
14:57:00,084 --> 14:57:01,752
Đó sẽ là trường hợp của Python.

15678
14:57:01,752 --> 14:57:05,141
Và những gì chúng ta sẽ làm hôm nay và\ntuần này trong tập bài tập 6 thực sự là

15679
14:57:05,141 --> 14:57:06,641
có được chỗ đứng với ngôn ngữ này.

15680
14:57:06,641 --> 14:57:09,822
Nhưng bạn sẽ không biết hết Python,\n

15681
14:57:09,822 --> 14:57:12,822
Và thành thật mà nói, bạn sẽ không biết tất cả\n

15682
14:57:12,822 --> 14:57:15,322
trừ khi có lẽ bạn đang sử dụng\nchúng toàn thời gian một cách chuyên nghiệp

15683
14:57:15,322 --> 14:57:18,891
và thậm chí sau đó còn có nhiều thư viện hơn\n

15684
14:57:18,891 --> 14:57:21,942
Vì vậy, bây giờ chúng ta hãy\nchuyển sang một vài ý tưởng khác

15685
14:57:21,942 --> 14:57:24,082
rằng chúng tôi sẽ triển khai\nin Python ngay sau đây.

15686
14:57:24,082 --> 14:57:26,531
Hãy để tôi chuyển trở lại Mã VS ở đây.

15687
14:57:26,531 --> 14:57:31,781
Và hãy để tôi bắt đầu, chẳng hạn, một trò giải trí\n

15688
14:57:31,781 --> 14:57:34,404
nơi chúng tôi đạt trung bình\n3 điểm cùng nhau.

15689
14:57:34,404 --> 14:57:36,822
Và đó là cơ hội\nin tuần 2 để chơi với mảng

15690
14:57:36,822 --> 14:57:38,951
để nhận ra mảng bị hạn chế như thế nào.

15691
14:57:40,241 --> 14:57:41,561
Bạn phải quyết định trước.

15692
14:57:41,561 --> 14:57:43,631
Nhưng hãy xem có gì khác biệt\nở đây trong Python.

15693
14:57:43,631 --> 14:57:48,101
Vậy hãy để tôi thực hiện Scores.py và để\n

15694
14:57:48,101 --> 14:57:52,301
đã gọi là điểm, xin lỗi, hãy để tôi cống hiến hết mình\n

15695
14:57:52,302 --> 14:57:54,462
Đặt nó bằng một danh sách\n3 điểm, trong đó

15696
14:57:54,461 --> 14:57:59,082
là những cái chúng tôi đã sử dụng\ntrước đây, 72, 73, 33, trong bối cảnh này

15697
14:57:59,082 --> 14:58:01,152
có nghĩa là điểm số, không phải giá trị ASCII.

15698
14:58:01,152 --> 14:58:03,042
Và sau đó chúng ta hãy tính\ntrung bình của những thứ này.

15699
14:58:03,042 --> 14:58:05,152
Vì vậy, trung bình sẽ là một biến khác.

15700
14:58:05,152 --> 14:58:09,432
Và hóa ra là tôi có thể làm được,\nlàm thế nào tôi có thể tính tổng những thứ này trước đây?

15701
14:58:09,432 --> 14:58:13,101
Có lẽ tôi đã có một vòng lặp for để thêm\n

15702
14:58:13,101 --> 14:58:16,101
Hóa ra trong Python, bạn\nchỉ cần nói tổng điểm

15703
14:58:16,101 --> 14:58:18,051
chia cho độ dài của điểm.

15704
14:58:18,052 --> 14:58:19,652
Điều đó sẽ cho tôi mức trung bình.

15705
14:58:19,652 --> 14:58:22,732
Vì vậy, tổng là một hàm lấy\na danh sách, trong trường hợp này làm đầu vào

15706
14:58:22,732 --> 14:58:25,522
và nó chỉ tính tổng cho\nbạn, bằng vòng lặp for hoặc bất cứ thứ gì

15707
14:58:26,451 --> 14:58:30,002
Len cung cấp cho bạn độ dài của\ndanh sách, có bao nhiêu thứ trong đó.

15708
14:58:30,002 --> 14:58:31,762
Vì vậy, tôi có thể tự động tìm ra điều đó.

15709
14:58:31,762 --> 14:58:36,862
Bây giờ hãy để tôi tiếp tục và in ra,\n

15710
14:58:36,862 --> 14:58:40,150
trong dấu ngoặc nhọn, dấu ngoặc kép thực\naverage, đóng.

15711
14:58:40,150 --> 14:58:42,442
Được rồi, hãy chạy\ncode này, Python của Scores.py.

15712
14:58:42,442 --> 14:58:47,572
Và đây là mức trung bình của tôi,\ntrong trường hợp này là 59,33333, v.v.

15713
14:58:48,832 --> 14:58:51,022
Thực ra, bây giờ chúng ta hãy\nthay đổi điều này một chút

15714
14:58:51,021 --> 14:58:54,146
và làm cho nó thú vị hơn một chút,\n

15715
14:58:54,146 --> 14:58:55,711
thay vì mã hóa cứng này.

15716
14:58:55,711 --> 14:58:59,089
Hãy để tôi quay lại đây và\nuse from CS50 import getInt

15717
14:58:59,089 --> 14:59:01,881
bởi vì tôi không muốn giải quyết\n

15718
14:59:01,881 --> 14:59:04,341
Giống như, tôi chỉ muốn sử dụng\nchức năng của người khác ở đây.

15719
14:59:04,341 --> 14:59:08,121
Hãy để tôi tự tạo cho mình một danh sách\ntrống có tên là điểm số.

15720
14:59:08,122 --> 14:59:11,002
Và đây không phải là điều chúng ta có thể làm được trong C, phải không?

15721
14:59:11,002 --> 14:59:13,131
Bởi vì trong C, nếu bạn cố gắng\ntạo một mảng trống

15722
14:59:13,131 --> 14:59:16,112
à, điều đó thật ngu ngốc,\nvì bạn không thể thêm gì vào đó.

15723
14:59:17,432 --> 14:59:19,171
Vì vậy, nó thậm chí sẽ không cho phép bạn làm điều đó.

15724
14:59:19,171 --> 14:59:22,161
Nhưng tôi chỉ có thể tạo\nan danh sách trống bằng Python

15725
14:59:22,161 --> 14:59:24,861
bởi vì danh sách, không giống như mảng,\nang thực sự không dài.

15726
14:59:26,271 --> 14:59:29,391
Nhưng bạn và tôi không đối phó với nhau\n

15727
14:59:31,292 --> 14:59:34,957
Bây giờ, hãy tiếp tục và lấy\n

15728
14:59:34,957 --> 14:59:36,332
Tổng cộng có ba người trong số họ thì sao?

15729
14:59:36,332 --> 14:59:41,872
Vì vậy, đối với tôi trong phạm vi 3, hãy bắt đầu\n

15730
14:59:41,872 --> 14:59:44,332
sử dụng getInt, yêu cầu họ cho điểm.

15731
14:59:44,332 --> 14:59:51,362
Và sau đó chúng ta hãy tiếp tục và thêm vào\n

15732
14:59:51,362 --> 14:59:53,722
Hóa ra là một danh sách\nvà tôi có thể đọc Python

15733
14:59:53,722 --> 14:59:57,802
tài liệu để xác nhận càng nhiều,\n

15734
14:59:57,802 --> 15:00:01,677
và các hàm được xây dựng trong các đối tượng\nathường được gọi là các phương thức

15735
15:00:01,677 --> 15:00:03,052
nếu bạn đã từng nghe thuật ngữ đó trước đây.

15736
15:00:03,052 --> 15:00:05,842
Cùng một ý tưởng, nhưng trong khi một chức năng\ncó thể tự đứng vững

15737
15:00:05,841 --> 15:00:09,951
một phương thức là một hàm được xây dựng\ntrong một đối tượng, giống như một danh sách ở đây.

15738
15:00:09,951 --> 15:00:12,438
Việc đó sẽ đạt được\nkết quả tương tự. Nói đúng ra

15739
15:00:13,521 --> 15:00:17,125
Giống như trong C, tôi có thể thắt chặt điều này\n

15740
15:00:17,125 --> 15:00:19,042
Nhưng tôi không biết, tôi có vẻ thích thế này.

15741
15:00:19,042 --> 15:00:22,491
Ít nhất thì với tôi, điều đó rõ ràng hơn\n

15742
15:00:22,491 --> 15:00:24,360
và sau đó thêm nó vào danh sách.

15743
15:00:24,360 --> 15:00:26,152
Bây giờ phần còn lại của\ncode có thể giữ nguyên.

15744
15:00:26,152 --> 15:00:31,222
Python của Scores.py,\nscore sẽ là 72, 73, 33.

15745
15:00:32,341 --> 15:00:35,361
Nhưng bây giờ chương trình năng động hơn một chút, điều này thật tuyệt.

15746
15:00:35,362 --> 15:00:37,461
Nhưng có\ncú pháp khác tôi có thể sử dụng ở đây.

15747
15:00:37,461 --> 15:00:40,851
Như bạn đã thấy, Python có\n

15748
15:00:40,851 --> 15:00:43,371
theo đó, nếu bạn không muốn ghi điểm.append

15749
15:00:43,372 --> 15:00:47,812
thực ra bạn có thể nói điểm\ncộng bằng điểm này.

15750
15:00:47,811 --> 15:00:52,252
Vì vậy, bạn thực sự có thể nối các danh sách\nvới nhau trong Python 2.

15751
15:00:52,252 --> 15:00:54,862
Giống như chúng ta đã sử dụng dấu cộng để\nnối hai chuỗi lại với nhau

15752
15:00:54,862 --> 15:00:57,921
bạn có thể dùng dấu cộng để\nnối hai danh sách lại với nhau.

15753
15:00:57,921 --> 15:01:00,561
Điều hấp dẫn là, bạn cần\n ghi điểm mà tôi đang có

15754
15:01:00,561 --> 15:01:03,292
thêm vào đây vào danh sách\now của nó, điều này thật ngớ ngẩn.

15755
15:01:03,292 --> 15:01:07,851
Nhưng điều đó là cần thiết, vì vậy\n

15756
15:01:07,851 --> 15:01:10,491
Để làm điều này một cách chi tiết hơn,\nđiều mà hầu hết các lập trình viên sẽ không làm

15757
15:01:10,491 --> 15:01:12,831
làm, nhưng để cho rõ ràng,\nđiều này cũng giống như vậy

15758
15:01:12,832 --> 15:01:15,472
như nói điểm cộng với điểm này.

15759
15:01:15,472 --> 15:01:19,432
Vậy bây giờ có lẽ là nhiều hơn một chút\n

15760
15:01:19,432 --> 15:01:24,201
số nhiều, xin lỗi, số ít, đều là cả hai\n

15761
15:01:25,381 --> 15:01:28,261
Vậy là hai cách khác nhau, không chắc\không có cách nào tốt hơn cách kia.

15762
15:01:28,262 --> 15:01:34,162
Cách này khá phổ biến, nhưng .append\n

15763
15:01:34,161 --> 15:01:36,861
Được rồi, còn một\nví dụ khác từ tuần thứ hai thì sao.

15764
15:01:36,862 --> 15:01:39,592
Cái này được gọi là chữ hoa.

15765
15:01:39,591 --> 15:01:42,841
Vì vậy, lần này hãy để tôi thực hiện việc này trong\nUppercase.py.

15766
15:01:42,841 --> 15:01:46,701
Và để tôi nhập từ\nCS50, lấy lại chuỗi.

15767
15:01:46,701 --> 15:01:50,541
Và hãy để tôi tiếp tục và nói,\ntrước đây sẽ là biến đầu tiên của tôi.

15768
15:01:50,542 --> 15:01:54,022
Hãy để tôi lấy một chuỗi từ người dùng,\n

15769
15:01:54,021 --> 15:01:59,182
Và sau đó hãy để tôi tiếp tục và nói,\n

15770
15:01:59,182 --> 15:02:01,711
viết hoa cho chuỗi này.

15771
15:02:01,711 --> 15:02:04,372
Hãy để tôi thay đổi kết thúc dòng của tôi thành\nnhư vậy, sử dụng thủ thuật mới của chúng tôi.

15772
15:02:04,372 --> 15:02:08,012
Và đây là lúc mọi thứ trở nên thú vị\n

15773
15:02:08,012 --> 15:02:11,572
Nếu tôi muốn lặp lại tất cả\ncác ký tự trong một chuỗi

15774
15:02:11,572 --> 15:02:14,661
và in chúng ra bằng chữ hoa,\n

15775
15:02:14,661 --> 15:02:22,553
Đối với c ở chuỗi trước, hãy tiếp tục và\n

15776
15:02:22,553 --> 15:02:25,761
nhưng đừng kết thúc dòng này vì tôi\n

15777
15:02:28,012 --> 15:02:31,492
Python của Uppercase.py, hãy để tôi\nnhập Hello bằng tất cả chữ thường.

15778
15:02:31,491 --> 15:02:33,531
Tôi vừa viết hoa toàn bộ chuỗi.

15779
15:02:34,222 --> 15:02:36,652
Lần đầu tiên tôi nhận được chuỗi, gọi nó trước.

15780
15:02:36,652 --> 15:02:39,202
Sau đó tôi chỉ cần in ra một số\nvăn bản mượt mà có nội dung sau dấu hai chấm

15781
15:02:39,201 --> 15:02:41,362
và tôi bỏ dòng kết thúc,\n

15782
15:02:41,362 --> 15:02:43,154
Lưu ý rằng tôi đã nhấn phím cách\na vài lần

15783
15:02:43,154 --> 15:02:45,141
chỉ để các chữ cái xếp hàng cho đẹp.

15784
15:02:45,141 --> 15:02:47,302
Đối với c và trước đó, điều này là mới.

15785
15:02:47,302 --> 15:02:51,022
Điều này rất mạnh trong C,\nxin lỗi, trong Python, nhờ đó

15786
15:02:51,021 --> 15:02:54,111
bạn không cần phải làm như Int i\nequals 0 và i ít hơn thế này

15787
15:02:54,112 --> 15:02:58,832
bạn chỉ có thể nói, với c trong\n

15788
15:02:58,832 --> 15:03:02,031
Và đây chỉ là cách viết hoa\nký tự cụ thể đó

15789
15:03:02,031 --> 15:03:04,222
và đảm bảo chúng tôi không xuất dòng mới quá sớm.

15790
15:03:04,222 --> 15:03:06,442
Nhưng thực ra việc này còn nhiều\nviệc hơn mức tôi cần làm.

15791
15:03:06,442 --> 15:03:10,522
Dựa trên những gì chúng ta đã thấy cho đến nay,\n

15792
15:03:10,521 --> 15:03:12,141
Tôi có thể thắt chặt điều này hơn nữa không?

15793
15:03:12,141 --> 15:03:16,862
Tôi có thể thu gọn tất cả các dòng 5 và 6,\nthậm chí là 7 không?

15794
15:03:16,862 --> 15:03:23,072
Nếu mục tiêu của chương trình này chỉ là\n

15795
15:03:27,002 --> 15:03:28,809
KHÁN GIẢ: Đó có phải là str.upper không?

15796
15:03:28,809 --> 15:03:31,141
DAVID J. Malan: Str.upper,\nyeah, vậy tôi có thể làm gì đó

15797
15:03:31,141 --> 15:03:34,021
như thế này, sau được trước.upper.

15798
15:03:34,021 --> 15:03:36,271
Vậy là không khuấy\nnghĩa đen là chấm trên, khuấy

15799
15:03:36,271 --> 15:03:38,021
chỉ đại diện cho chuỗi được đề cập.

15800
15:03:38,021 --> 15:03:41,141
Vì vậy, nó sẽ là before.upper,\nnhưng ý tưởng ngược lại là đúng.

15801
15:03:41,141 --> 15:03:44,652
Vậy hãy để tôi tiếp tục và chỉnh sửa\n

15802
15:03:44,652 --> 15:03:49,332
Hãy để tôi tiếp tục và in ra\n

15803
15:03:49,332 --> 15:03:51,961
Vì vậy, dòng này cũng giống nhau, tôi\nget một chuỗi được gọi trước đó.

15804
15:03:51,961 --> 15:03:55,051
Tôi đang tạo một biến khác\nđược gọi theo sau, và như bạn đề xuất

15805
15:03:55,052 --> 15:03:58,482
Nói chung tôi đang gọi phía trên\n

15806
15:03:59,881 --> 15:04:03,871
Và một lần nữa, trong Python không có\n

15807
15:04:03,872 --> 15:04:05,282
Dù sao cũng chỉ có dây thôi.

15808
15:04:05,281 --> 15:04:07,121
Vì vậy, tôi cũng có thể làm tất cả chúng cùng một lúc.

15809
15:04:07,122 --> 15:04:10,742
Vì vậy nếu bây giờ tôi chạy lại mã,\nPython của Uppercase.py.

15810
15:04:10,741 --> 15:04:15,601
Bây giờ tôi sẽ gõ Xin chào bằng tất cả\nchữ thường và, ồ, thật gần

15811
15:04:15,601 --> 15:04:18,631
Tôi nghĩ tôi có thể loại bỏ\nviệc ghi đè này, bởi vì tôi

15812
15:04:18,631 --> 15:04:22,031
in toàn bộ nội dung ra tại\n

15813
15:04:22,031 --> 15:04:26,402
Vì vậy bây giờ nếu tôi gõ Xin chào trước đó,\n

15814
15:04:28,601 --> 15:04:32,432
Được rồi, nếu có bất kỳ câu hỏi nào,\nthì về danh sách hoặc trên chuỗi

15815
15:04:32,432 --> 15:04:37,762
và loại chức năng này là gì\n

15816
15:04:38,262 --> 15:04:41,281
Được rồi, vậy còn một vài\nkhối xây dựng khác trước khi chúng ta bắt đầu.

15817
15:04:44,531 --> 15:04:46,572
DAVID J. Malan: Bên phải, bên phải.

15818
15:04:47,561 --> 15:04:53,723
KHÁN GIẢ: Bạn có thể viết được không, rất gần\n

15819
15:04:53,724 --> 15:04:55,779
bạn bắt đầu tạo một biến trên.

15820
15:04:55,779 --> 15:04:58,362
DAVID J. Malan: Vâng, tôi có\ntạo ra biến số này không, phía trên?

15821
15:04:59,112 --> 15:05:01,391
Thực ra tôi có thể thắt chặt\nđiều này lại, và nếu bạn thực sự

15822
15:05:01,391 --> 15:05:04,692
muốn thấy thứ gì đó gọn gàng,\bên trong dấu ngoặc nhọn

15823
15:05:04,692 --> 15:05:07,572
bạn không cần phải chỉ đặt\ntên của các biến.

15824
15:05:07,572 --> 15:05:10,122
Bạn có thể đặt một lượng logic nhỏ, lâu như vậy

15825
15:05:10,122 --> 15:05:13,302
vì nó không bắt đầu có vẻ ngu ngốc và\n

15826
15:05:13,302 --> 15:05:15,462
rằng ở điểm đó nó có\nthiết kế tồi.

15827
15:05:15,461 --> 15:05:17,061
Tôi có thể thắt chặt nó lại như thế này.

15828
15:05:17,061 --> 15:05:21,131
Và bây giờ chúng ta đang sử dụng Python của\nUppercase.py, viết lại Hello.

15829
15:05:22,252 --> 15:05:23,802
Nhưng tôi sẽ cẩn thận về điều này.

15830
15:05:23,802 --> 15:05:27,005
Bạn muốn chống lại sự cám dỗ của\n

15831
15:05:27,004 --> 15:05:29,921
bên trong dấu ngoặc nhọn, bởi vì\n

15832
15:05:29,921 --> 15:05:32,411
Nhưng, hoàn toàn, bạn\nthực sự cũng có thể làm được điều đó.

15833
15:05:32,411 --> 15:05:35,471
Được rồi, còn dòng lệnh\narguments thì sao, đó là một chuyện

15834
15:05:35,472 --> 15:05:39,552
chúng tôi cũng đã giới thiệu vào tuần thứ hai, vì vậy\n

15835
15:05:39,552 --> 15:05:43,272
để lấy đầu vào từ người dùng, rất tiếc.

15836
15:05:43,271 --> 15:05:46,791
Vì vậy, chúng tôi thực sự có thể lấy dữ liệu đầu vào\n

15837
15:05:46,792 --> 15:05:49,732
để hiểu theo nghĩa đen\ncác đối số dòng lệnh.

15838
15:05:49,732 --> 15:05:52,542
Những điều này hơi khác một chút,\nnhưng nó tuân theo cùng một mô hình.

15839
15:05:52,542 --> 15:05:56,381
Theo mặc định, không có main.\nVà không có Def main int

15840
15:05:56,381 --> 15:06:02,572
arg c char hoặc chúng tôi gọi nó là chuỗi,\n

15841
15:06:02,572 --> 15:06:07,031
Vì vậy, nếu bạn muốn truy cập vào\n

15842
15:06:07,031 --> 15:06:11,621
Và hóa ra còn có một cái khác\n

15843
15:06:11,622 --> 15:06:15,702
được gọi là CIS và bạn có thể nhập từ\n

15844
15:06:15,701 --> 15:06:17,879
Vì vậy, cùng một ý tưởng, nơi khác nhau.

15845
15:06:17,879 --> 15:06:19,461
Bây giờ tôi sẽ tiếp tục và làm điều này.

15846
15:06:19,461 --> 15:06:24,341
Hãy viết một chương trình chỉ yêu cầu\n

15847
15:06:24,341 --> 15:06:26,572
sau\ntên của chương trình hoặc không có gì cả.

15848
15:06:26,572 --> 15:06:33,192
Vậy nếu độ dài của argv bằng 2,\n

15849
15:06:33,192 --> 15:06:41,610
Xin chào dấu phẩy argv ngoặc 1 đóng,\n

15850
15:06:41,610 --> 15:06:44,652
tổng số tại dấu nhắc, hãy nói\n

15851
15:06:45,682 --> 15:06:48,701
Vì vậy, điều duy nhất mới ở đây\n

15852
15:06:48,701 --> 15:06:51,971
và chúng tôi đang sử dụng chuỗi f ưa thích này\n

15853
15:06:51,972 --> 15:06:55,031
Ngoài ra, nó còn phức tạp hơn\nlogic trong các dấu ngoặc nhọn.

15854
15:06:55,792 --> 15:07:00,412
Trong trường hợp này, đó là một danh sách có tên argv,\n

15855
15:07:00,411 --> 15:07:04,301
Hãy làm Python của Argv.py,\nEnter, Hello, world.

15856
15:07:04,302 --> 15:07:08,002
Điều gì sẽ xảy ra nếu tôi thực hiện Argv.py\nDavid ở dòng lệnh.

15857
15:07:09,252 --> 15:07:11,201
Vì vậy, có một sự tò mò ở đây.

15858
15:07:11,201 --> 15:07:15,896
Python không được bao gồm trong\nargv, trong khi trong C, dấu chấm

15859
15:07:15,896 --> 15:07:18,461
chém bất cứ điều gì là điều đầu tiên.

15860
15:07:18,461 --> 15:07:22,031
Nếu từ tương tự trong Python là\ntên chương trình Python của bạn

15861
15:07:22,031 --> 15:07:26,322
là điều đầu tiên, trong ngoặc 0,\n

15862
15:07:26,322 --> 15:07:32,262
từ Python không xuất hiện trong\n

15863
15:07:32,262 --> 15:07:34,512
Nhưng mặt khác,\ný tưởng của những lập luận này

15864
15:07:34,512 --> 15:07:36,904
hoàn toàn giống như trước đây.

15865
15:07:36,904 --> 15:07:39,072
Và trên thực tế, những gì bạn có thể\nlàm, điều đó thật tuyệt

15866
15:07:39,072 --> 15:07:42,252
là, bởi vì argv là một danh sách,\nbạn có thể làm những việc như thế này.

15867
15:07:42,252 --> 15:07:47,412
Đối với arg trong argv, hãy tiếp tục\nvà in ra từng đối số.

15868
15:07:47,411 --> 15:07:49,511
Vì vậy, thay vì sử dụng vòng lặp\nfor và i và tất cả

15869
15:07:49,512 --> 15:07:53,742
về điều này, nếu tôi thực hiện Python của argv Enter,\n

15870
15:07:53,741 --> 15:07:58,481
Nếu tôi làm Python của argv Foo,\nit sẽ đặt Argv.py và Foo.

15871
15:07:58,482 --> 15:08:03,042
Nếu tôi làm vậy, xin lỗi, nếu tôi làm Foo và\nbar, tất cả những từ đó sẽ được in ra.

15872
15:08:03,042 --> 15:08:05,292
Nếu tôi làm Foobar baz, chúng cũng được in ra.

15873
15:08:05,292 --> 15:08:08,351
Và Foo và bar hoặc baz giống như x và y và z của nhà toán học

15874
15:08:08,351 --> 15:08:11,722
đối với các nhà khoa học máy tính, khi bạn\n

15875
15:08:12,942 --> 15:08:16,542
Nó đọc giống tiếng Anh hơn một chút và\n

15876
15:08:16,542 --> 15:08:20,052
cho phép bạn lặp lại rất nhanh\n

15877
15:08:20,052 --> 15:08:22,692
Giả sử tôi chỉ muốn những\ntừ thực sự mà con người đã gõ

15878
15:08:23,771 --> 15:08:26,981
Giống như, giả sử tôi muốn bỏ qua Argv.py.

15879
15:08:26,982 --> 15:08:30,162
Ý tôi là tôi có thể làm điều gì đó\nhackish như thế này.

15880
15:08:30,161 --> 15:08:35,626
Nếu arg bằng Argv.py,\ntôi có thể bỏ qua

15881
15:08:35,627 --> 15:08:37,002
bạn biết đấy, hãy đảo ngược logic.

15882
15:08:37,002 --> 15:08:39,052
Tôi có thể làm điều này chẳng hạn.

15883
15:08:39,052 --> 15:08:41,622
Vì vậy, nếu arg không\nbằng tên chương trình

15884
15:08:41,622 --> 15:08:44,412
sau đó tiếp tục và in ra từ đó.

15885
15:08:44,411 --> 15:08:46,361
Vì vậy tôi chỉ nhận được Foobar và baz.

15886
15:08:46,362 --> 15:08:50,921
Hoặc, đây mới là điều thú vị\n

15887
15:08:50,921 --> 15:08:54,921
Và thay vào đó hãy để tôi lấy một phần\nmảng của danh sách.

15888
15:08:54,921 --> 15:08:59,332
Vì vậy, hóa ra, nếu argv là\na danh sách, tôi thực sự có thể nói

15889
15:08:59,332 --> 15:09:03,582
bạn biết không, hãy vào danh sách đó,\n

15890
15:09:03,582 --> 15:09:05,722
rồi đi đến cùng.

15891
15:09:05,722 --> 15:09:08,322
Và chúng tôi chưa thấy\nscú pháp này trong C. Nhưng cái này

15892
15:09:08,322 --> 15:09:10,932
là một cách cắt danh sách trong Python.

15893
15:09:12,341 --> 15:09:17,381
Nếu tôi chạy Python của\nArgv.py, Foo bar baz Enter

15894
15:09:17,381 --> 15:09:21,252
Tôi chỉ nhận được một tập hợp con của\ndanh sách, bắt đầu từ vị trí 1

15895
15:09:21,252 --> 15:09:23,413
đi đến tận cùng.

15896
15:09:23,413 --> 15:09:25,121
Và bạn thậm chí có thể làm\nđiều ngược lại.

15897
15:09:25,122 --> 15:09:27,852
Nếu vì lý do nào đó bạn muốn bỏ qua phần tử cuối cùng

15898
15:09:27,851 --> 15:09:33,551
bạn có thể nói dấu hai chấm, chúng ta\ncó thể nói dấu hai chấm âm 1

15899
15:09:33,552 --> 15:09:36,082
và sử dụng số âm\nmà chúng tôi chưa từng thấy trước đây

15900
15:09:36,082 --> 15:09:38,992
cũng cắt bỏ phần cuối\ncủa danh sách.

15901
15:09:38,991 --> 15:09:42,521
Vì vậy, có một số thủ thuật cú pháp\n

15902
15:09:42,521 --> 15:09:46,661
ngay cả khi thoạt nhìn, bạn có thể\n

15903
15:09:46,661 --> 15:09:49,319
Được rồi, hãy làm một\nví dụ khác với lối ra

15904
15:09:49,319 --> 15:09:51,612
và sau đó chúng ta sẽ bắt đầu\thực sự áp dụng một số thuật toán

15905
15:09:51,612 --> 15:09:52,737
để làm cho mọi thứ trở nên thú vị.

15906
15:09:52,737 --> 15:09:56,991
Vì vậy, trong chương trình cuối cùng ở đây, hãy cùng thực hiện\n

15907
15:09:56,991 --> 15:09:58,731
trước khi chúng tôi giới thiệu một số thuật toán.

15908
15:10:00,741 --> 15:10:05,421
Hãy nhập từ CIS, nhập argv.

15909
15:10:07,012 --> 15:10:09,722
Hãy đảm bảo rằng người dùng cung cấp\ncho tôi một đối số dòng lệnh.

15910
15:10:09,722 --> 15:10:16,101
Vì vậy nếu độ dài của argv không\n

15911
15:10:16,101 --> 15:10:19,311
và in ra thứ gì đó như\nthiếu đối số dòng lệnh

15912
15:10:19,311 --> 15:10:21,112
chỉ để giải thích vấn đề là gì.

15913
15:10:25,101 --> 15:10:27,231
Nhưng tôi sẽ sử dụng một\nphiên bản thoát tốt hơn ở đây.

15914
15:10:27,232 --> 15:10:29,422
Hãy để tôi nhập hai hàm từ CIS.

15915
15:10:29,421 --> 15:10:33,561
Hóa ra cách tốt hơn để làm điều này là\n

15916
15:10:33,561 --> 15:10:36,514
cụ thể là 2, với mã thoát này.

15917
15:10:36,514 --> 15:10:38,932
Nếu không thì xuống đây, tôi\nsẽ tiếp tục in ra

15918
15:10:38,932 --> 15:10:43,340
đại loại như Xin chào, dấu phẩy\nargv khung 1, giống như trước.

15919
15:10:43,339 --> 15:10:44,881
Và sau đó tôi sẽ thoát ra với số 0.

15920
15:10:44,881 --> 15:10:46,932
Vì vậy, một lần nữa, đây là một\nđiều tinh tế mà chúng tôi đã giới thiệu

15921
15:10:46,932 --> 15:10:49,432
vào tuần thứ hai, nơi bạn thực sự có thể thoát khỏi chương trình của mình

15922
15:10:49,432 --> 15:10:51,951
với một số số, trong đó\n0 biểu thị thành công

15923
15:10:51,951 --> 15:10:53,871
và bất cứ điều gì khác biểu thị lỗi.

15924
15:10:53,872 --> 15:10:55,762
Đây chỉ là ý tưởng tương tự trong Python.

15925
15:10:55,762 --> 15:11:00,442
Vì vậy, nếu tôi chẳng hạn, chỉ cần chạy\n

15926
15:11:00,442 --> 15:11:03,141
Ý tôi là thoát khỏi đây và thoát khỏi đây.

15927
15:11:04,232 --> 15:11:07,022
Nếu tôi chạy như thế này thì tôi\nđang thiếu một đối số dòng lệnh.

15928
15:11:07,021 --> 15:11:09,721
Vì vậy, hãy để tôi chạy lại nó với\nnhư tên tôi ở dấu nhắc.

15929
15:11:09,722 --> 15:11:13,552
Vậy là tôi có đúng hai dòng lệnh\n

15930
15:11:14,572 --> 15:11:16,864
Và nếu tôi làm như vậy với David Malan,\nnó cũng sẽ không hiệu quả

15931
15:11:16,864 --> 15:11:18,682
bởi vì bây giờ argv không bằng 2.

15932
15:11:18,682 --> 15:11:21,381
Nhưng sự khác biệt ở đây\nlà chúng ta đang thoát với 1

15933
15:11:21,381 --> 15:11:26,421
để các chương trình đặc biệt có thể phát hiện\n

15934
15:11:26,421 --> 15:11:28,701
Và bây giờ cũng có một\ncách khác để thực hiện việc này.

15935
15:11:28,701 --> 15:11:30,981
Giả sử bạn đang\ninhập nhiều hàm

15936
15:11:30,982 --> 15:11:33,465
và bạn thực sự không muốn\nlàm mọi thứ trở nên lộn xộn

15937
15:11:33,464 --> 15:11:35,631
và chỉ cần có sẵn tất cả các tên hàm\nnày

15938
15:11:35,631 --> 15:11:38,151
mà không rõ\nhọ đến từ đâu.

15939
15:11:38,152 --> 15:11:39,982
Hãy nhập tất cả CIS.

15940
15:11:39,982 --> 15:11:43,702
Và hãy thay đổi cú pháp của chúng ta,\n

15941
15:11:43,701 --> 15:11:46,491
nơi chúng tôi chỉ thêm vào trước tất cả\ncác chức năng thư viện này

15942
15:11:46,491 --> 15:11:49,941
CIS, chỉ để nói rõ hơn\nhọ đến từ đâu

15943
15:11:49,942 --> 15:11:55,359
và nếu có giá trị\nexit hoặc argv khác

15944
15:11:55,358 --> 15:11:58,441
mà chúng tôi muốn nhập từ thư viện,\n

15945
15:11:58,442 --> 15:12:01,672
Vì vậy, nếu tôi làm điều đó lần cuối ở đây,\nsẽ thiếu đối số dòng lệnh.

15946
15:12:01,671 --> 15:12:03,711
Nhưng thực tế David vẫn làm việc.

15947
15:12:03,711 --> 15:12:06,771
Được rồi, chỉ để chứng minh cách\n

15948
15:12:06,771 --> 15:12:09,651
Bây giờ chúng ta hãy làm điều gì đó mạnh mẽ hơn\nnhư thuật toán tìm kiếm

15949
15:12:10,553 --> 15:12:13,011
Tôi sẽ tiếp tục và mở\nup một tệp có tên Numbers.py

15950
15:12:13,012 --> 15:12:16,942
và chúng ta hãy thực hiện một số tìm kiếm\hoặc tìm kiếm tuyến tính, thay vào đó

15951
15:12:20,582 --> 15:12:23,572
Còn việc nhập CIS như trước thì sao.

15952
15:12:23,572 --> 15:12:29,362
Hãy để tôi đưa cho mình một danh sách\ncác số, như 4, 6, 8, 2, 7, 5, 0

15953
15:12:29,362 --> 15:12:31,192
vì vậy chỉ là một loạt các số nguyên.

15954
15:12:32,692 --> 15:12:36,112
Nếu bạn nhớ lại từ tuần thứ ba,\nchúng ta đã tìm kiếm số 0

15955
15:12:36,112 --> 15:12:38,402
ở cuối tủ đựng đồ trên sân khấu.

15956
15:12:38,402 --> 15:12:40,641
Vậy chúng ta hãy hỏi\ncâu hỏi đó bằng Python.

15957
15:12:40,641 --> 15:12:42,381
Không cần vòng lặp hay bất cứ thứ gì tương tự.

15958
15:12:42,381 --> 15:12:46,072
Nếu có số 0, hãy tiếp tục và in ra kết quả tìm thấy.

15959
15:12:46,072 --> 15:12:49,942
Và sau đó chúng ta hãy thoát thành công,\n

15960
15:12:49,942 --> 15:12:52,192
giả sử không tìm thấy bản in.

15961
15:12:52,192 --> 15:12:55,732
Và sau đó chúng ta sẽ thoát CIS bằng 1.

15962
15:12:55,732 --> 15:12:58,342
Vì vậy, đây là lúc Python\nbắt đầu hoạt động mạnh mẽ trở lại.

15963
15:12:59,572 --> 15:13:02,254
Đây là vòng lặp của bạn, nó đang thực hiện\n việc kiểm tra giúp bạn.

15964
15:13:02,254 --> 15:13:04,671
Bên dưới mui xe, Python\nis sẽ sử dụng tìm kiếm tuyến tính.

15965
15:13:04,671 --> 15:13:06,338
Bạn không cần phải tự thực hiện nó.

15966
15:13:06,338 --> 15:13:08,841
Không có vòng lặp while, không có vòng lặp for,\nbạn chỉ cần đặt một câu hỏi.

15967
15:13:08,841 --> 15:13:12,752
Nếu 0 là số,\nthì hãy làm như sau.

15968
15:13:12,752 --> 15:13:14,872
Đó là một tính năng\nhiện chúng tôi có với Python

15969
15:13:14,872 --> 15:13:16,862
và phải vứt bỏ\na rất nhiều mã đó.

15970
15:13:16,862 --> 15:13:18,351
Chúng ta cũng có thể làm điều đó với chuỗi.

15971
15:13:18,351 --> 15:13:21,362
Thay vào đó, hãy để tôi mở một tệp\ncó tên là Names.py

15972
15:13:21,362 --> 15:13:23,512
và làm điều gì đó thậm chí còn liên quan nhiều hơn đến C

15973
15:13:23,512 --> 15:13:26,542
bởi vì chúng tôi cần Str Comp và\nvòng lặp for, v.v.

15974
15:13:26,542 --> 15:13:28,522
Hãy để tôi nhập CIS cho tập tin này.

15975
15:13:28,521 --> 15:13:30,981
Hãy đặt cho mình một loạt\ntên giống như chúng ta đã làm trong C.

15976
15:13:30,982 --> 15:13:38,152
Và đó là Bill và Charlie\nand Fred và George và Ginny

15977
15:13:38,152 --> 15:13:41,961
và hai người nữa, Percy, và cuối cùng là Ron.

15978
15:13:41,961 --> 15:13:43,911
Và hãy nhớ lại, vào lúc đó, chúng tôi đang tìm kiếm Ron.

15979
15:13:43,911 --> 15:13:45,953
Vì vậy chúng tôi phải lặp lại\ntoàn bộ sự việc

15980
15:13:45,953 --> 15:13:48,331
đang làm Str Comp và i plus\nplus và tất cả những thứ đó.

15981
15:13:48,332 --> 15:13:55,281
Bây giờ chỉ cần đặt câu hỏi, nếu Ron\n

15982
15:13:55,281 --> 15:13:56,961
và, rất tiếc, hãy để tôi giấu điều đó.

15983
15:13:58,771 --> 15:14:02,701
Hãy để tôi tiếp tục và nói\nin, tìm thấy, như trước đây.

15984
15:14:02,701 --> 15:14:06,231
CIS thoát 1, chỉ để biểu thị\thành công, rồi xuống đây

15985
15:14:06,232 --> 15:14:09,362
nếu chúng ta đi đến điểm này,\nchúng ta có thể nói là không tìm thấy.

15986
15:14:09,362 --> 15:14:12,692
Và sau đó chúng ta sẽ chỉ dùng CIS exit 1.

15987
15:14:12,692 --> 15:14:17,482
Vì vậy, một lần nữa, điều này chỉ thực hiện tìm kiếm tuyến tính\n

15988
15:14:17,482 --> 15:14:20,932
chúng tôi đã tìm thấy Ron, bởi vì, thực sự, anh ấy\n

15989
15:14:20,932 --> 15:14:24,711
Nhưng chúng ta không cần phải giải quyết tất cả cơ chế của nó.

15990
15:14:24,711 --> 15:14:27,051
Được rồi, hãy tiến\nmọi thứ thêm một bước nữa.

15991
15:14:27,052 --> 15:14:29,362
Trong tuần thứ ba, chúng tôi cũng\nđã triển khai ý tưởng

15992
15:14:29,362 --> 15:14:33,502
của một danh bạ điện thoại, thực sự\nliên kết các khóa với các giá trị.

15993
15:14:33,502 --> 15:14:36,531
Nhưng hãy nhớ rằng, danh bạ điện thoại ở\nC, là một dạng hack, phải không?

15994
15:14:36,531 --> 15:14:40,042
Bởi vì lần đầu tiên chúng tôi có hai mảng,\n

15995
15:14:40,042 --> 15:14:43,851
Sau đó chúng tôi giới thiệu các cấu trúc và\n

15996
15:14:43,851 --> 15:14:47,421
Và sau đó chúng tôi có một loạt người.

15997
15:14:47,421 --> 15:14:51,561
Bạn có thể thực hiện việc này bằng Python bằng cách sử dụng\n

15998
15:14:51,561 --> 15:14:54,191
Nhưng chúng ta cũng có thể sử dụng\ntừ điển có mục đích chung

15999
15:14:54,192 --> 15:14:57,942
vì cũng giống như trong tập P 5, bạn\n

16000
15:14:59,622 --> 15:15:02,922
Tương tự,\nPython có thể làm việc này cho chúng ta được không.

16001
15:15:02,921 --> 15:15:05,771
Từ CS50, hãy nhập chuỗi get.

16002
15:15:05,771 --> 15:15:09,281
Và bây giờ hãy tự cho mình\na từ điển về mọi người

16003
15:15:09,281 --> 15:15:13,061
D-I-C-T () open paren close\nparen cung cấp cho bạn một từ điển.

16004
15:15:13,061 --> 15:15:15,822
Hoặc thực ra bạn có thể đơn giản hóa\ncú pháp

16005
15:15:15,822 --> 15:15:18,881
và từ điển lại chỉ là chìa khóa\n

16006
15:15:18,881 --> 15:15:21,581
Thay vào đó, bạn cũng có thể chỉ sử dụng\ndấu ngoặc nhọn.

16007
15:15:21,582 --> 15:15:23,542
Điều đó mang lại cho tôi một cuốn từ điển trống rỗng.

16008
15:15:23,542 --> 15:15:26,921
Nhưng nếu tôi biết tôi muốn đặt gì vào đó\n

16009
15:15:26,921 --> 15:15:34,311
với số cộng 1-617-495-1000,\n

16010
15:15:34,311 --> 15:15:40,298
David, với số cộng 1-949-468-2750.

16011
15:15:40,298 --> 15:15:42,881
Và điều đó khiến tôi chú ý,\thật bi thảm, sau giờ học ngày hôm đó

16012
15:15:42,881 --> 15:15:44,673
rằng chúng tôi đã gặp lỗi trong quả trứng Phục sinh nhỏ bé của mình.

16013
15:15:44,673 --> 15:15:47,711
Nếu hôm nay bạn muốn gọi\nhoặc nhắn tin cho tôi, theo số đó

16014
15:15:47,711 --> 15:15:50,652
chúng tôi đã sửa mã\nlàm nền tảng cho quả trứng Phục sinh nhỏ đó.

16015
15:15:51,612 --> 15:15:53,561
Được rồi, bây giờ\ncho tôi một biến

16016
15:15:53,561 --> 15:15:57,641
được gọi là mọi người, đó\nliên kết các khóa với các giá trị.

16017
15:15:57,641 --> 15:16:01,752
Có một số cú pháp mới ở đây trong\n

16018
15:16:01,752 --> 15:16:04,811
mà là dấu hai chấm và dấu ngoặc kép\không phải bên trái và bên phải.

16019
15:16:04,811 --> 15:16:07,901
Đây là một cách, trong Python,\ncủa các khóa liên kết

16020
15:16:07,902 --> 15:16:11,872
với các giá trị, các từ có định nghĩa,\n

16021
15:16:11,872 --> 15:16:15,072
Và nó sẽ trở nên cực kỳ phổ biến\n

16022
15:16:15,072 --> 15:16:18,972
khi chúng ta xem xét CSS và HTML và\n

16023
15:16:18,972 --> 15:16:22,362
giống như ý tưởng có mặt khắp nơi này trong\n

16024
15:16:22,362 --> 15:16:25,822
bởi vì đó chỉ là một cách thực sự hữu ích\n

16025
15:16:25,822 --> 15:16:29,211
Vì vậy, tại thời điểm này trong câu chuyện, chúng ta\n

16026
15:16:29,211 --> 15:16:32,711
nếu bạn muốn, trong số mọi người, liên kết\ntên với số điện thoại

16027
15:16:32,711 --> 15:16:34,197
giống như một cuốn danh bạ điện thoại trong thế giới thực.

16028
15:16:34,197 --> 15:16:37,722
Vì vậy hãy viết một chương trình có\n

16029
15:16:37,722 --> 15:16:39,912
số điện thoại mà họ muốn tra cứu.

16030
15:16:39,911 --> 15:16:46,031
Vậy thì hãy tiếp tục và nói, nếu điều đó\n

16031
15:16:46,031 --> 15:16:48,612
hãy tiếp tục và in ra\nsố của người đó

16032
15:16:48,612 --> 15:16:51,252
bằng cách đi vào từ điển mọi người và đi

16033
15:16:51,252 --> 15:16:56,002
với tên cụ thể đó, trong đó,\n

16034
15:16:56,002 --> 15:16:58,482
Vì vậy, điều này có tinh thần tương tự như trước đây.

16035
15:16:58,482 --> 15:17:02,652
Tìm kiếm tuyến tính và tra cứu từ điển\n

16036
15:17:02,652 --> 15:17:05,802
bằng Python, chỉ bằng cách đặt\ncâu hỏi, tên và người.

16037
15:17:05,802 --> 15:17:07,692
Và dòng này sắp được in ra

16038
15:17:07,692 --> 15:17:12,232
ai có trong từ điển nhân dân thì có tên đó.

16039
15:17:12,232 --> 15:17:16,722
Vì vậy tôi đang sử dụng dấu ngoặc vuông, bởi vì\n

16040
15:17:16,722 --> 15:17:19,842
giống như bạn có thể lập chỉ mục vào mảng\nan hoặc danh sách trong Python

16041
15:17:19,841 --> 15:17:24,671
bằng cách sử dụng các số 0, 1, 2, bạn\ncó thể lập chỉ mục rất thuận tiện

16042
15:17:24,671 --> 15:17:29,601
vào một từ điển bằng Python,\ncũng sử dụng dấu ngoặc vuông.

16043
15:17:29,601 --> 15:17:32,591
Và để làm rõ chuyện gì đang xảy ra ở đây, hãy để tôi đi

16044
15:17:32,591 --> 15:17:37,002
và tạo một biến tạm thời,\n

16045
15:17:37,002 --> 15:17:41,531
Và sau đó chúng ta hãy, hoặc, xin lỗi, hãy\n

16046
15:17:41,531 --> 15:17:44,411
Và điều đó sẽ chỉ in\n ra số được đề cập.

16047
15:17:44,411 --> 15:17:48,371
Trong C và trước đó là trong Python,\n

16048
15:17:48,372 --> 15:17:53,472
lẽ ra đã đến một địa điểm ở\n

16049
15:17:53,472 --> 15:17:57,311
Nhưng đó thực sự có thể là một chuỗi,\n

16050
15:17:57,311 --> 15:17:59,351
Và đây là điều tuyệt vời\nvề từ điển

16051
15:17:59,351 --> 15:18:02,411
nó không giống như một\nline lớn, một thứ tuyến tính lớn.

16052
15:18:02,411 --> 15:18:05,261
Đây là bảng mà bạn có thể\ntra cứu tên trong một cột

16053
15:18:05,262 --> 15:18:07,582
và lấy lại số ở cột\nother.

16054
15:18:07,582 --> 15:18:09,641
Vì vậy hãy tiếp tục và chạy\nPython của Phonebook.py

16055
15:18:14,622 --> 15:18:18,402
Đó hoàn toàn không phải là điều đáng lẽ phải xảy ra.

16056
15:18:18,402 --> 15:18:19,961
Tôi nghĩ mình đang chơi sai.

16057
15:18:32,351 --> 15:18:36,491
Python của Phonebook.py, cái quái gì--

16058
15:18:55,661 --> 15:18:57,776
Tôi không hiểu điều gì ở đây?

16059
15:19:00,701 --> 15:19:03,869
Được rồi, Roxanne, Carter, bạn\ncó thấy tôi đang làm gì sai không?

16060
15:19:10,752 --> 15:19:14,631
LOA 47: Khi bạn tìm thấy bài kiểm tra\n

16061
15:19:14,631 --> 15:19:19,911
DAVID J. Malan: Ồ, vâng, đã tìm ra,\nOK, chúng ta sẽ làm điều này.

16062
15:19:31,881 --> 15:19:33,792
Tất cả điều này xuất phát từ video.

16063
15:19:42,805 --> 15:19:44,722
Tôi sẽ cố gắng tìm hiểu\nđiều gì đã xảy ra.

16064
15:19:44,722 --> 15:19:47,322
Điều tốt nhất tôi có thể biết là nó\nđã chạy sai chương trình.

16065
15:19:47,322 --> 15:19:49,341
Tôi không hiểu tại sao.

16066
15:19:49,341 --> 15:19:50,691
Vì vậy, chúng tôi sẽ chẩn đoán điều này sau.

16067
15:19:50,692 --> 15:19:53,484
Tôi chỉ đặt tập tin vào một nơi tạm thời\n

16068
15:19:53,483 --> 15:19:59,231
Vậy hãy để tôi tiếp tục và chạy\ncái này, Python của Phonebook.py

16069
15:19:59,232 --> 15:20:00,762
gõ vào, ví dụ, tên của tôi.

16070
15:20:00,762 --> 15:20:02,940
Và có số tương ứng của tôi.

16071
15:20:02,940 --> 15:20:04,482
Không biết chuyện gì vừa xảy ra nữa.

16072
15:20:04,482 --> 15:20:06,582
Nhưng tôi sẽ đi tới\nphần cuối và cập nhật cho bạn

16073
15:20:06,582 --> 15:20:07,882
nếu chúng ta có thể đặt ngón tay vào nó.

16074
15:20:07,881 --> 15:20:11,411
Vì vậy, bây giờ đây chỉ là một ví dụ\n về cách triển khai danh bạ điện thoại.

16075
15:20:11,411 --> 15:20:14,111
Bây giờ chúng ta hãy xem xét những gì chúng ta có thể làm nhiều hơn một chút

16076
15:20:14,112 --> 15:20:16,932
mạnh mẽ, trong những ví dụ này,\nnhư một danh bạ điện thoại

16077
15:20:16,932 --> 15:20:18,671
thực sự giữ thông tin này xung quanh.

16078
15:20:18,671 --> 15:20:22,031
Cho đến nay, những danh bạ điện thoại đơn giản này\n

16079
15:20:22,031 --> 15:20:25,301
Nhưng khi sử dụng tệp CSV,\ncác giá trị được phân tách bằng dấu phẩy

16080
15:20:25,302 --> 15:20:28,077
có lẽ chúng ta thực sự có thể giữ\nnhững cái tên và con số

16081
15:20:28,076 --> 15:20:29,951
để, giống như trên\nđiện thoại của bạn, bạn thực sự có thể

16082
15:20:29,951 --> 15:20:32,301
giữ liên lạc của bạn lâu dài.

16083
15:20:32,302 --> 15:20:35,582
Vì vậy bây giờ tôi sẽ tiếp tục và\n

16084
15:20:35,582 --> 15:20:39,762
Và hãy để tôi ẩn\nchi tiết này để nó không gây nhầm lẫn.

16085
15:20:39,762 --> 15:20:43,152
Rất tiếc, tôi sẽ tạm thời thay đổi\nlời nhắc của mình.

16086
15:20:43,152 --> 15:20:47,062
Vì vậy bây giờ hãy để tôi tiếp tục và\ntinh chỉnh ví dụ này như sau.

16087
15:20:47,061 --> 15:20:50,351
Tôi sẽ truy cập\nPhonebook.py và tôi

16088
15:20:50,351 --> 15:20:52,811
sẽ nhập toàn bộ\nthư viện có tên là CSV.

16089
15:20:52,811 --> 15:20:54,671
Và đây là một công cụ mạnh mẽ\nkhông, bởi vì Python

16090
15:20:54,671 --> 15:20:58,391
đi kèm với một thư viện\nxử lý các tệp CSV cho bạn.

16091
15:20:58,391 --> 15:21:02,122
Tệp CSV chỉ là một tệp\ncó các giá trị được phân tách bằng dấu phẩy.

16092
15:21:02,122 --> 15:21:06,102
Và, trên thực tế, để chứng minh\nđiều này, hãy để tôi kiểm tra một điều

16093
15:21:06,101 --> 15:21:08,981
ở đây, chỉ để làm cho điều này\na thực tế hơn một chút.

16094
15:21:08,982 --> 15:21:15,532
Để chứng minh điều này, chúng ta hãy\ntiếp tục và thực hiện điều này.

16095
15:21:15,531 --> 15:21:18,491
Hãy để tôi nhập thư viện CSV từ CS50.

16096
15:21:20,351 --> 15:21:24,072
Hãy để tôi mở một tập tin\nsử dụng chức năng mở

16097
15:21:24,072 --> 15:21:28,932
mở một tệp có tên\nPhonebook.csv, ở định dạng chắp thêm

16098
15:21:28,932 --> 15:21:31,421
ngược lại với định dạng đọc\n và ghi.

16099
15:21:31,421 --> 15:21:34,972
Viết chỉ cần thổi bay nó nếu nó tồn tại,\n

16100
15:21:34,972 --> 15:21:37,452
Vì vậy tôi giữ danh bạ điện thoại này\ở xung quanh, giống như bạn

16101
15:21:37,451 --> 15:21:39,389
tiếp tục thêm danh bạ vào điện thoại của bạn.

16102
15:21:39,389 --> 15:21:41,932
Bây giờ hãy để tôi tiếp tục và nhận một\nmột vài giá trị từ người dùng.

16103
15:21:41,932 --> 15:21:45,342
Hãy để tôi nói getString và\nask người dùng cho một cái tên.

16104
15:21:45,341 --> 15:21:50,681
Sau đó, hãy để tôi getString lần nữa và\yêu cầu người dùng lấy số của họ.

16105
15:21:50,682 --> 15:21:52,707
Và bây giờ, hãy để tôi tiếp tục và làm điều này.

16106
15:21:52,707 --> 15:21:54,582
Và đây là tính năng mới và\ndành riêng cho Python.

16107
15:21:54,582 --> 15:21:57,342
Và bạn sẽ chỉ biết điều này\nbằng cách làm theo hướng dẫn

16108
15:21:57,341 --> 15:21:59,002
hoặc đọc tài liệu.

16109
15:21:59,002 --> 15:22:01,391
Hãy để tôi đặt cho mình một\nbiến được gọi là nhà văn

16110
15:22:01,391 --> 15:22:06,472
và yêu cầu thư viện CSV\n cung cấp trình ghi tệp đó.

16111
15:22:06,472 --> 15:22:09,912
Sau đó, hãy để tôi tiếp tục và\nsử dụng biến nhà văn đó

16112
15:22:09,911 --> 15:22:13,241
sử dụng một hàm hoặc một phương thức\bên trong nó, được gọi là hàng ghi

16113
15:22:13,241 --> 15:22:17,722
để viết ra một danh sách chứa\ntên và số điện thoại của người đó.

16114
15:22:17,722 --> 15:22:20,832
Lưu ý dấu ngoặc vuông\bên trong dấu ngoặc đơn

16115
15:22:20,832 --> 15:22:25,872
vì tôi vừa in một danh sách\n

16116
15:22:25,872 --> 15:22:27,622
Và sau đó tôi sẽ\nđóng tập tin.

16117
15:22:27,622 --> 15:22:29,264
Vậy tác dụng của tất cả những điều này là gì?

16118
15:22:29,264 --> 15:22:31,722
Được rồi, hãy để tôi tiếp tục và chạy\nphiên bản Phonebook.py này

16119
15:22:31,722 --> 15:22:33,202
và tôi được nhắc đặt tên.

16120
15:22:33,201 --> 15:22:41,651
Trước tiên hãy thực hiện thao tác của Carter, cộng\n1-617-495-1000, sau đó

16121
15:22:44,292 --> 15:22:47,482
Thông báo trong thư mục hiện tại của tôi,\n

16122
15:22:47,482 --> 15:22:50,952
mà tôi đã viết và\rõ ràng là Phonebook.csv.

16123
15:22:50,951 --> 15:22:53,351
CSV chỉ là viết tắt của\ncác giá trị được phân tách bằng dấu phẩy.

16124
15:22:53,351 --> 15:22:56,902
Và nó giống như một cách rất đơn giản\n

16125
15:22:56,902 --> 15:23:00,192
nếu bạn muốn, dấu phẩy đại diện cho đâu\n

16126
15:23:00,192 --> 15:23:02,891
Chỉ có hai cột\nở đây, tên và số.

16127
15:23:02,891 --> 15:23:06,101
Tuy nhiên, vì tôi đang ghi vào\ntệp này ở chế độ chắp thêm

16128
15:23:06,101 --> 15:23:09,741
để tôi chạy lại lần nữa,\nPython của Phonebook.py

16129
15:23:09,741 --> 15:23:18,011
và để tôi tiếp tục và thực hiện David\nand plus 1-949-468-2750, Enter.

16130
15:23:18,012 --> 15:23:19,872
Và hãy để ý điều gì đã xảy ra\trong tệp CSV.

16131
15:23:19,872 --> 15:23:22,902
Nó tự động cập nhật,\nvì tôi hiện đang kiên trì

16132
15:23:22,902 --> 15:23:25,522
dữ liệu này vào tập tin được đề cập.

16133
15:23:25,521 --> 15:23:27,881
Vì vậy nếu bây giờ tôi muốn\nđọc tập tin này, tôi

16134
15:23:27,881 --> 15:23:32,201
thực sự có thể tiếp tục và\nthực hiện tìm kiếm tuyến tính trên dữ liệu

16135
15:23:32,201 --> 15:23:35,171
sử dụng chức năng đọc để\thực sự đọc từ CSV.

16136
15:23:35,171 --> 15:23:37,871
Tuy nhiên, bây giờ, chúng ta sẽ chỉ để lại\nit đơn giản như viết.

16137
15:23:37,872 --> 15:23:39,792
Và hãy để tôi thực hiện một sàng lọc ở đây.

16138
15:23:39,792 --> 15:23:43,542
Hóa ra là, nếu bạn có thói quen\nmở lại một tập tin

16139
15:23:43,542 --> 15:23:45,851
bạn thậm chí không cần phải đóng nó một cách rõ ràng.

16140
15:23:47,442 --> 15:23:52,572
Thay vào đó bạn có thể nói, với phần mở đầu\n

16141
15:23:52,572 --> 15:23:57,822
trong chế độ chắp thêm, gọi tệp sự việc,\n

16142
15:23:58,872 --> 15:24:00,899
Vì vậy, từ khóa with là\na một điều mới trong Python.

16143
15:24:00,898 --> 15:24:03,731
Và nó được sử dụng ở một số nơi khác\n

16144
15:24:03,732 --> 15:24:04,857
là thắt chặt mã ở đây.

16145
15:24:04,857 --> 15:24:06,940
Và tôi sẽ chuyển các biến\ncủa mình ra bên ngoài

16146
15:24:06,940 --> 15:24:09,432
bởi vì họ không cần phải ở\nằm trong câu lệnh with

16147
15:24:10,389 --> 15:24:12,974
Điều này chỉ có tác dụng\đảm bảo rằng bạn, người lập trình

16148
15:24:12,974 --> 15:24:15,312
đừng làm hỏng việc và vô tình\nđừng đóng tệp của bạn.

16149
15:24:15,311 --> 15:24:17,201
Trên thực tế, bạn có thể\nnhớ lại, từ C, Valgrind

16150
15:24:17,201 --> 15:24:21,758
có thể đã phàn nàn với bạn nếu bạn có\n

16151
15:24:21,758 --> 15:24:24,341
kết quả là bạn có thể đã bị rò rỉ bộ nhớ\nas. Từ khóa với

16152
15:24:24,341 --> 15:24:28,361
cũng lo tất cả\nđiều đó cho bạn.

16153
15:24:28,362 --> 15:24:31,192
Hãy làm đi, muốn làm điều này.

16154
15:24:31,192 --> 15:24:34,482
Thế còn, hãy làm một việc khác.

16155
15:24:35,752 --> 15:24:38,802
Hãy để tôi tiếp tục và cầu hôn\nđiều đó trên điện thoại hoặc máy tính xách tay của bạn

16156
15:24:38,802 --> 15:24:43,992
tại đây hoặc trực tuyến, hãy truy cập URL này tại đây,\n

16157
15:24:43,991 --> 15:24:46,811
Và chỉ để cho thấy rằng những CSV này\n

16158
15:24:46,811 --> 15:24:48,371
và nếu bạn đã từng\nthích sử dụng Google Biểu mẫu

16159
15:24:48,372 --> 15:24:50,082
or managed a student group,\nor something where you've

16160
15:24:50,082 --> 15:24:52,272
collected data via Google\nForms, you can actually

16161
15:24:52,271 --> 15:24:55,161
xuất tất cả dữ liệu đó qua tệp CSV.

16162
15:24:55,161 --> 15:24:57,671
Vì vậy hãy tiếp tục với URL này tại đây.

16163
15:24:57,671 --> 15:24:59,472
Và những người trong số các bạn\nxem theo yêu cầu sau này

16164
15:24:59,472 --> 15:25:01,061
sẽ thấy rằng biểu mẫu\nis không còn hoạt động nữa

16165
15:25:01,061 --> 15:25:02,551
vì chúng tôi chỉ thực hiện việc này trực tiếp.

16166
15:25:02,552 --> 15:25:04,302
Nhưng điều đó sẽ dẫn đến\na Biểu mẫu của Google

16167
15:25:04,302 --> 15:25:07,272
going to let everyone input\ntheir answer to a question

16168
15:25:07,271 --> 15:25:10,182
bạn\nmuốn vào nhà nào

16169
15:25:10,182 --> 15:25:13,152
sort of an approximation of the\nsorting hat in Harry Potter.

16170
15:25:13,152 --> 15:25:17,202
And via this form, will we then\nhave the ability to export

16171
15:25:20,302 --> 15:25:24,132
Vậy hãy cho bạn một chút thời gian để làm điều đó.

16172
15:25:24,131 --> 15:25:26,981
In just a moment, I'll share\nmy version of the screen, which

16173
15:25:26,982 --> 15:25:30,852
is going to let me actually\nopen the file, the form itself.

16174
15:25:30,851 --> 15:25:35,591
Và chỉ trong chốc lát, tôi sẽ chuyển đổi.

16175
15:25:35,591 --> 15:25:37,541
Được rồi, bây giờ đây là\nphiên bản biểu mẫu của tôi

16176
15:25:37,542 --> 15:25:40,811
ở đây, nơi chúng tôi có hơn 200 câu trả lời\n

16177
15:25:40,811 --> 15:25:44,531
cậu thuộc về nhà nào, Gryffindor,\n

16178
15:25:44,531 --> 15:25:49,322
Nếu tôi đi tới phần phản hồi, tôi sẽ thấy tất cả\n

16179
15:25:49,322 --> 15:25:51,822
Vì vậy, giao diện đồ họa người dùng,\nvà chúng ta có thể lướt qua phần này.

16180
15:25:51,822 --> 15:25:56,531
Và thật thú vị, có vẻ như\n40% sinh viên Harvard

16181
15:25:56,531 --> 15:26:00,745
muốn vào Gryffindor, 22%\nin Slytherin và những người khác

16182
15:26:01,661 --> 15:26:03,791
Nhưng bạn có thể đã nhận thấy,\nnếu đã từng sử dụng Google Biểu mẫu

16183
15:26:03,792 --> 15:26:05,241
liên kết Bảng tính Google này.

16184
15:26:05,241 --> 15:26:06,531
Vì vậy, tôi sẽ tiếp tục và nhấp vào đó.

16185
15:26:06,531 --> 15:26:08,981
Và nó sẽ tự động mở,\n

16186
15:26:08,982 --> 15:26:11,812
Nhưng bạn cũng có thể làm điều tương tự\nvới Office 365.

16187
15:26:11,811 --> 15:26:14,561
Và bây giờ bạn thấy dữ liệu thô\ndưới dạng bảng tính.

16188
15:26:14,561 --> 15:26:19,421
Nhưng trong Bảng tính Google, nếu tôi đi\n

16189
15:26:19,421 --> 15:26:23,322
lưu ý rằng tôi có thể tải xuống tệp này dưới dạng\nan Excel, PDF và cả

16190
15:26:23,322 --> 15:26:25,432
một giá trị CSV, được phân tách bằng dấu phẩy.

16191
15:26:25,432 --> 15:26:27,141
Vậy hãy để tôi tiếp tục và làm điều đó.

16192
15:26:27,141 --> 15:26:30,442
Điều đó mang lại cho tôi một tệp trong thư mục\nTải xuống trên máy tính của tôi.

16193
15:26:30,442 --> 15:26:34,492
Bây giờ tôi sẽ quay lại\ntrình soạn thảo mã của mình ở đây.

16194
15:26:34,491 --> 15:26:36,701
Và điều tôi sắp làm\ntiếp theo là tải lên

16195
15:26:36,701 --> 15:26:40,841
tệp này, từ thư mục\nTải xuống của tôi tới Mã VS

16196
15:26:40,841 --> 15:26:43,131
để chúng ta có thể thực sự\nthấy nó ở đây.

16197
15:26:43,131 --> 15:26:44,741
Và bây giờ bạn có thể thấy tập tin đang mở này.

16198
15:26:44,741 --> 15:26:47,741
Và tôi sẽ rút ngắn tên của nó,\n

16199
15:26:47,741 --> 15:26:52,511
Tôi sẽ đổi tên cái này bằng cách sử dụng\n

16200
15:26:52,512 --> 15:26:55,889
Và sau đó chúng ta có thể thấy, trong tập tin,\n

16201
15:26:55,889 --> 15:26:57,972
ngôi nhà, nơi bạn có\ncả đống dấu thời gian

16202
15:26:57,972 --> 15:27:00,792
khi mọi người điền vào biểu mẫu,\n

16203
15:27:00,792 --> 15:27:02,502
Và sau đó là những người khác\nchỉ một lúc trước.

16204
15:27:02,502 --> 15:27:05,832
Và giá trị thứ hai, sau mỗi giá trị\n

16205
15:27:05,832 --> 15:27:08,562
Vâng, hãy để tôi tiếp tục\nvà thực hiện một chương trình

16206
15:27:08,561 --> 15:27:12,621
trong một tập tin tên là Hogwarts.py,\nđể xử lý dữ liệu này.

16207
15:27:12,622 --> 15:27:14,802
Vì vậy, trong Hogwarts.py, chúng ta hãy\nviết một chương trình

16208
15:27:14,802 --> 15:27:17,962
hiện đọc CSV, trong\ntrường hợp này không phải là danh bạ điện thoại

16209
15:27:17,961 --> 15:27:19,932
nhưng thông tin mũ phân loại của mọi người.

16210
15:27:19,932 --> 15:27:21,972
Và tôi sẽ tiếp tục\nahead và Nhập CSV.

16211
15:27:21,972 --> 15:27:25,182
Và giả sử tôi muốn trả lời một\ncâu hỏi hợp lý, bỏ qua

16212
15:27:25,182 --> 15:27:28,991
thực tế là GUI hoặc đồ họa của Google\n

16213
15:27:28,991 --> 15:27:31,841
Tôi chỉ muốn đếm xem ai sẽ ở nhà nào thôi.

16214
15:27:31,841 --> 15:27:36,161
Vậy hãy để tôi cho mình một cuốn từ điển\n

16215
15:27:37,302 --> 15:27:39,312
Và hãy để tôi tạo trước một vài chìa khóa.

16216
15:27:39,311 --> 15:27:44,021
Hãy để tôi nói rằng Gryffindor sẽ được khởi tạo thành 0

16217
15:27:44,021 --> 15:27:48,341
Hufflepuff cũng sẽ được khởi tạo\nthành 0, Ravenclaw

16218
15:27:49,722 --> 15:27:53,292
Và cuối cùng, Slytherin\nsẽ được khởi tạo thành 0.

16219
15:27:53,292 --> 15:27:56,472
Đây là một ví dụ khác về từ điển\na hoặc bảng băm

16220
15:27:56,472 --> 15:27:58,662
chỉ là một phần dữ liệu có mục đích chung.

16221
15:27:58,661 --> 15:28:00,281
Bạn có thể có khóa và giá trị.

16222
15:28:00,281 --> 15:28:01,991
Chìa khóa trong trường hợp này là những ngôi nhà.

16223
15:28:01,991 --> 15:28:05,021
Các giá trị ban đầu bằng 0,\nnhưng tôi sẽ sử dụng giá trị này

16224
15:28:05,021 --> 15:28:10,121
thay vì bốn biến riêng biệt,\n

16225
15:28:12,252 --> 15:28:19,701
Khi mở Hogwarts.csv, ở chế độ đọc,\n

16226
15:28:19,701 --> 15:28:22,961
Tôi chỉ muốn đọc nó, dưới dạng\nfile làm tên biến của tôi.

16227
15:28:22,961 --> 15:28:26,051
Hãy tiếp tục và tạo\na trình đọc lần này

16228
15:28:26,052 --> 15:28:31,232
đó là sử dụng chức năng đọc trong\n

16229
15:28:31,232 --> 15:28:33,732
Tôi sẽ tiếp tục và bỏ qua\ndòng đầu tiên của tệp

16230
15:28:33,732 --> 15:28:36,792
bởi vì, hãy nhớ lại, đó là lần đầu tiên\n

16231
15:28:36,792 --> 15:28:37,972
Tôi muốn có được dữ liệu thực sự.

16232
15:28:37,972 --> 15:28:40,061
Vì vậy, chức năng tiếp theo này\nis chỉ là một thủ thuật nhỏ

16233
15:28:40,061 --> 15:28:43,252
vì đã bỏ qua dòng đầu tiên của tập tin.

16234
15:28:44,322 --> 15:28:48,701
Đối với mỗi hàng khác trong\nreader, đó là từng dòng một

16235
15:28:48,701 --> 15:28:51,941
lấy nhà của người hiện tại\nnằm trong khung hàng 1.

16236
15:28:51,942 --> 15:28:54,735
Đây là những gì thư viện\ntrình đọc CSV đang làm cho chúng tôi.

16237
15:28:54,735 --> 15:28:56,652
Nó đang xử lý tất cả việc\nđọc tệp này.

16238
15:28:56,652 --> 15:29:00,281
Nó tìm ra dấu phẩy ở đâu,\n

16239
15:29:00,281 --> 15:29:02,771
nó đưa lại cho bạn một danh sách có kích thước 2.

16240
15:29:02,771 --> 15:29:07,611
Trong ngoặc 0 là mốc thời gian,\nin ngoặc 1 là tên nhà.

16241
15:29:07,612 --> 15:29:11,351
Vì vậy, trong mã của tôi, tôi có thể nói\nhouse bằng khung hàng 1.

16242
15:29:11,351 --> 15:29:13,491
Tôi không quan tâm đến dấu thời gian\ncủa chương trình này.

16243
15:29:13,491 --> 15:29:17,591
Và sau đó hãy vào từ điển của tôi\n

16244
15:29:17,591 --> 15:29:23,891
vào nó tại vị trí ngôi nhà, bởi\n

16245
15:29:23,891 --> 15:29:26,802
Và bây giờ, ở cuối\n khối mã này

16246
15:29:26,802 --> 15:29:29,562
có tác dụng lặp lại\nover mỗi dòng của tệp

16247
15:29:29,561 --> 15:29:31,991
đang cập nhật từ điển của tôi\ở bốn nơi khác nhau

16248
15:29:31,991 --> 15:29:35,711
dựa trên việc ai đó đã gõ\n

16249
15:29:36,222 --> 15:29:40,332
Và lưu ý rằng tôi đang sử dụng tên của\n

16250
15:29:40,332 --> 15:29:44,022
về cơ bản là đi tới mức nhỏ này\n

16251
15:29:44,021 --> 15:29:46,541
1 thành 2, 2 thành\na 3, thay vì có

16252
15:29:46,542 --> 15:29:48,522
giống như bốn biến\n riêng biệt, sẽ chỉ

16253
15:29:48,521 --> 15:29:50,591
khó chịu hơn nhiều để duy trì.

16254
15:29:50,591 --> 15:29:52,811
Ở phía dưới cùng, chúng ta hãy\nin ra kết quả.

16255
15:29:52,811 --> 15:29:56,141
Đối với mỗi ngôi nhà trong những ngôi nhà đó, lặp đi lặp lại

16256
15:29:56,141 --> 15:29:58,271
các khóa chứa chúng\ntheo mặc định trong Python

16257
15:29:58,271 --> 15:30:01,151
hãy tiếp tục và in\nout một chuỗi f có nội dung

16258
15:30:01,152 --> 15:30:05,982
ngôi nhà hiện tại có số lượng hiện tại.

16259
15:30:05,982 --> 15:30:11,592
Và số lượng sẽ là kết quả của việc lập chỉ mục\n

16260
15:30:13,332 --> 15:30:18,461
Vì vậy hãy chạy chương trình này để tóm tắt\ndữ liệu, Hogwarts.py, 140 người trong số các bạn

16261
15:30:18,461 --> 15:30:22,722
đã trả lời Gryffindor, 54 Hufflepuff,\n

16262
15:30:22,722 --> 15:30:25,092
Và đó chỉ là cách\nmã hiện tại của tôi, và đây là, ồ

16263
15:30:25,091 --> 15:30:28,748
Chúa ơi, dễ hơn nhiều so với C, để\n

16264
15:30:28,749 --> 15:30:32,082
Và một trong những lý do khiến Python trở nên như vậy\n

16265
15:30:32,082 --> 15:30:36,432
tổng quát hơn, đó thực sự là\n

16266
15:30:37,461 --> 15:30:38,891
Và hãy để tôi làm sạch nó một chút.

16267
15:30:38,891 --> 15:30:41,682
Có một chút khó chịu là\nTôi chỉ cần biết và tin tưởng

16268
15:30:41,682 --> 15:30:46,932
tên ngôi nhà nằm trong ngoặc\n

16269
15:30:47,961 --> 15:30:53,051
Có một thứ gọi là\nTrình đọc từ điển trong thư viện CSV

16270
15:30:54,402 --> 15:30:58,991
Viết hoa D, viết hoa R, điều này có nghĩa\n

16271
15:30:58,991 --> 15:31:01,421
bởi vì công việc của một cuốn từ điển\nreader là

16272
15:31:01,421 --> 15:31:05,411
vẫn trả về cho tôi mỗi hàng từ\n

16273
15:31:05,411 --> 15:31:09,081
nhưng nó không chỉ cho tôi một danh sách\n

16274
15:31:10,482 --> 15:31:15,522
Và nó sử dụng, làm chìa khóa trong đó\n

16275
15:31:15,521 --> 15:31:17,981
cho mỗi hàng trong\ntệp, điều này chỉ để nói

16276
15:31:17,982 --> 15:31:20,472
nó làm cho mã của tôi dễ đọc hơn một chút, vì thay vào đó

16277
15:31:20,472 --> 15:31:23,112
về việc thực hiện thủ thuật nhỏ\nnày, khung 1

16278
15:31:23,112 --> 15:31:26,022
Tôi có thể nói trích dẫn "Bracket\nHouse" với chữ H viết hoa

16279
15:31:26,021 --> 15:31:28,881
bởi vì nó được viết hoa\ntrong chính Biểu mẫu Google.

16280
15:31:28,881 --> 15:31:31,319
Vì vậy, mã bây giờ\nchỉ khác một chút

16281
15:31:31,319 --> 15:31:34,362
nhưng nó dẻo dai hơn nhiều, đặc biệt\n

16282
15:31:34,362 --> 15:31:36,912
và tôi đang di chuyển các cột xung quanh\cũng như không làm điều gì tương tự

16283
15:31:36,911 --> 15:31:38,494
nơi các con số có thể bị xáo trộn.

16284
15:31:38,495 --> 15:31:41,781
Bây giờ tôi có thể chạy cái này trên Hogwarts.py\n

16285
15:31:41,781 --> 15:31:46,481
Nhưng bây giờ tôi không phải lo lắng về\n

16286
15:31:46,482 --> 15:31:51,402
Được rồi, có bất kỳ câu hỏi nào về\ncác khả năng đó.

16287
15:31:51,402 --> 15:31:53,921
Và đó là một dạng đoạn giới thiệu\nvề một số thao tác

16288
15:31:56,141 --> 15:32:00,076
Được rồi, một số\nví dụ cuối cùng và sự tinh tế để gây tò mò

16289
15:32:00,076 --> 15:32:01,451
với những gì bạn có thể làm với Python.

16290
15:32:01,451 --> 15:32:05,231
Thực ra tôi định chuyển đổi\n

16291
15:32:05,232 --> 15:32:08,422
để tôi thực sự có thể sử dụng\nâm thanh hiệu quả hơn một chút.

16292
15:32:08,421 --> 15:32:10,451
Vì vậy, đây chỉ là một cửa sổ terminal\n trên Mac OS.

16293
15:32:10,451 --> 15:32:14,471
Trước giờ học tôi đã cài đặt sẵn\n

16294
15:32:14,472 --> 15:32:16,900
nó sẽ không thực sự hiệu quả\nin VS Code trên đám mây

16295
15:32:16,900 --> 15:32:20,057
bởi vì họ yêu cầu âm thanh\n

16296
15:32:20,057 --> 15:32:22,182
Nhưng tôi sẽ tiếp tục\nvà viết một ví dụ ở đây

16297
15:32:22,182 --> 15:32:26,080
liên quan đến việc viết một văn bản dựa trên giọng nói\n

16298
15:32:26,733 --> 15:32:28,691
Và tôi sẽ tiếp tục\nvà nhập một thư viện

16299
15:32:28,692 --> 15:32:32,230
một lần nữa, tôi đã cài đặt sẵn cái đó\nđược gọi là chuyển văn bản thành giọng nói bằng Python

16300
15:32:32,230 --> 15:32:34,781
và tôi sẽ tiếp tục\nand, theo tài liệu của nó

16301
15:32:34,781 --> 15:32:39,400
tạo cho tôi một công cụ phát âm bằng\n

16302
15:32:40,601 --> 15:32:43,451
Sau đó tôi sẽ sử dụng chức năng lưu của\ncông cụ này

16303
15:32:43,451 --> 15:32:45,701
để làm điều gì đó thú vị, chẳng hạn như Hello, world.

16304
15:32:45,701 --> 15:32:49,002
Và sau đó tôi sẽ tiếp tục và\n

16305
15:32:50,377 --> 15:32:52,002
Được rồi, tôi sẽ lưu tập tin này.

16306
15:32:52,002 --> 15:32:53,502
Hiện tại tôi không sử dụng VS Code.

16307
15:32:53,502 --> 15:32:56,591
Tôi đang sử dụng một chương trình phổ biến khác\n

16308
15:32:56,591 --> 15:32:59,351
được gọi là Vim, là một\nchương trình dòng lệnh

16309
15:32:59,351 --> 15:33:01,311
ngay trong cửa sổ đen trắng này.

16310
15:33:01,311 --> 15:33:05,370
Hãy để tôi tiếp tục và chạy\nPython của Speech.py, và--

16311
15:33:07,266 --> 15:33:09,641
DAVID J. Malan: Được rồi, vậy\nit hơi bị vi tính hóa một chút

16312
15:33:09,641 --> 15:33:12,635
nhưng đó là lời nói đã được\tổng hợp từ ví dụ này.

16313
15:33:12,635 --> 15:33:14,802
Hãy thay đổi một chút\nđể thú vị hơn.

16314
15:33:14,802 --> 15:33:16,010
Chúng ta hãy làm một cái gì đó như thế này.

16315
15:33:16,010 --> 15:33:20,472
Hãy hỏi tên người dùng,\n

16316
15:33:20,472 --> 15:33:24,372
Và sau đó, hãy sử dụng F\n nhỏ

16317
15:33:24,372 --> 15:33:26,532
nhưng Xin chào tên của người đó.

16318
15:33:26,531 --> 15:33:30,792
Hãy để tôi lưu tệp của mình, chạy\nPython của Speech.py, Enter.

16319
15:33:33,881 --> 15:33:36,161
DAVID J. Malan: Được rồi,\nvậy chúng ta phát âm tên tôi là được

16320
15:33:36,161 --> 15:33:38,828
có thể gặp khó khăn với những tên\nkhác nhau, tùy thuộc vào ngữ âm.

16321
15:33:38,828 --> 15:33:40,092
Nhưng cái đó có vẻ ổn.

16322
15:33:40,091 --> 15:33:42,371
Hãy làm điều gì đó khác với\nPython, sử dụng cách tương tự

16323
15:33:44,302 --> 15:33:49,062
Hãy để tôi đi vào ví dụ ngày hôm nay.

16324
15:33:49,061 --> 15:33:54,851
Và tôi sẽ đi vào một thư mục\n

16325
15:33:57,311 --> 15:33:59,891
Và trong thư mục này\ntôi đã viết trước

16326
15:33:59,891 --> 15:34:02,400
là một vài tệp,\nDetect.py, Nhận dạng.py

16327
15:34:02,400 --> 15:34:06,851
và hai ảnh đầy đủ,\nOffice.jpeg và Toby.jpeg.

16328
15:34:06,851 --> 15:34:09,320
Ví dụ: nếu bạn đã quen với\nchương trình này

16329
15:34:09,321 --> 15:34:11,331
là bức ảnh của dàn diễn viên từ The Office đây.

16330
15:34:12,821 --> 15:34:15,161
Giả sử tôi muốn làm\nđiều gì đó rất phong cách Facebook

16331
15:34:15,161 --> 15:34:17,381
nơi tôi muốn phân tích\tất cả các khuôn mặt

16332
15:34:17,381 --> 15:34:19,391
hoặc phát hiện tất cả các khuôn mặt trong đó.

16333
15:34:19,391 --> 15:34:21,461
Được rồi, để tôi tiếp tục\nvà cho bạn xem một chương trình

16334
15:34:21,461 --> 15:34:24,400
Tôi đã viết trước,\nthời gian đó không dài lắm.

16335
15:34:24,400 --> 15:34:25,900
Phần lớn trong số đó thực sự là ý kiến.

16336
15:34:25,900 --> 15:34:27,161
Nhưng hãy xem tôi đang làm gì.

16337
15:34:27,161 --> 15:34:30,521
Tôi đang nhập thư viện Gối,\n

16338
15:34:30,521 --> 15:34:34,002
Tôi đang nhập một thư viện tên là face\n

16339
15:34:36,650 --> 15:34:39,480
Theo tài liệu của nó,\nbạn vào thư viện đó

16340
15:34:39,480 --> 15:34:41,281
và bạn gọi một hàm\nđược gọi là tải hình ảnh

16341
15:34:41,281 --> 15:34:43,891
để tải thứ gì đó\nnhư Office.jpeg

16342
15:34:43,891 --> 15:34:46,561
và sau đó bạn có thể sử dụng\ndòng mã như thế này.

16343
15:34:46,561 --> 15:34:50,641
Gọi một hàm có tên là face\nlocations, truyền hình ảnh đầu vào

16344
15:34:50,641 --> 15:34:53,641
và bạn nhận được danh sách\n tất cả các khuôn mặt trong ảnh.

16345
15:34:53,641 --> 15:34:57,271
Và sau đó ở dưới đây, một vòng lặp for,\nlặp đi lặp lại tất cả những điều đó

16346
15:34:58,561 --> 15:35:01,320
Và bên trong vòng lặp này, tôi\nchỉ làm một chút thủ thuật thôi.

16347
15:35:01,321 --> 15:35:06,102
Tôi tìm ra phần trên, bên phải, dưới,\n

16348
15:35:06,101 --> 15:35:08,461
Và sau đó, sử dụng\ndòng mã này ở đây

16349
15:35:08,461 --> 15:35:11,355
Tôi đang sử dụng thư viện hình ảnh đó\nvề cơ bản chỉ để vẽ một cái hộp.

16350
15:35:11,355 --> 15:35:12,480
Và mã có vẻ khó hiểu.

16351
15:35:12,480 --> 15:35:14,671
Thành thật mà nói, tôi sẽ phải tra cứu\nđiều này để viết lại.

16352
15:35:14,671 --> 15:35:17,171
Nhưng theo tài liệu, cái này\nchỉ vẽ một cái hộp nhỏ xinh

16353
15:35:18,131 --> 15:35:24,721
Vậy hãy để tôi tiếp tục và thu nhỏ ở đây,\n

16354
15:35:24,722 --> 15:35:29,912
Được rồi, nó đang phân tích, đang phân tích\n

16355
15:35:30,902 --> 15:35:35,702
Và đây là mọi khuôn mặt mà\ncái gì, 10 dòng mã Python của tôi

16356
15:35:37,932 --> 15:35:40,711
Có lẽ thư viện\nis đang tìm kiếm thứ gì đó

16357
15:35:40,711 --> 15:35:43,622
có thể không có mặt nạ, có\nhai mắt, mũi và miệng

16358
15:35:43,622 --> 15:35:45,942
theo một cách sắp xếp nào đó,\nmột kiểu mẫu nào đó.

16359
15:35:45,942 --> 15:35:48,961
Vì vậy, nó có vẻ khá đáng tin cậy, tại\n

16360
15:35:49,891 --> 15:35:52,182
Điều gì sẽ xảy ra nếu chúng ta muốn tìm kiếm\nmột ai đó cụ thể

16361
15:35:52,182 --> 15:35:53,701
chẳng hạn, một người nào đó\luôn luôn bị bắt nạt.

16362
15:35:53,701 --> 15:35:55,284
Chà, chúng ta có thể làm điều gì đó như thế này.

16363
15:35:55,285 --> 15:35:59,582
Nhận dạng.py, đang lấy hai tệp\n

16364
15:35:59,582 --> 15:36:01,141
của một người nói riêng.

16365
15:36:01,141 --> 15:36:03,421
Và nếu bạn đang cố gắng\ntìm Toby trong đám đông

16366
15:36:03,421 --> 15:36:06,091
ở đây tôi đã giới thiệu chương trình,\nxin lỗi, đây là phiên bản

16367
15:36:06,091 --> 15:36:08,072
vẽ một hộp xung quanh khuôn mặt đã cho.

16368
15:36:08,072 --> 15:36:10,201
Ở đây chúng tôi có Toby được xác định.

16369
15:36:10,741 --> 15:36:14,972
Bởi vì chương trình đó, Nhận dạng.py,\n

16370
15:36:14,972 --> 15:36:19,322
nhưng nói ngắn gọn thì nó cũng\ntải dưới dạng đầu vào Toby.jpeg

16371
15:36:19,322 --> 15:36:21,932
để nhận ra\nkhuôn mặt cụ thể đó.

16372
15:36:21,932 --> 15:36:24,872
Và khuôn mặt cụ thể đó là một\nmột bức ảnh hoàn toàn khác

16373
15:36:24,872 --> 15:36:29,492
nhưng nó trông khá giống với\n

16374
15:36:29,491 --> 15:36:32,341
Hãy cùng làm một trò khác\nhơi nhạy cảm với micrô.

16375
15:36:32,341 --> 15:36:37,171
Để tôi vào trong, tôi nghe nhé\n

16376
15:36:38,131 --> 15:36:40,901
Và hãy chạy Python của Listen0.py.

16377
15:36:40,902 --> 15:36:43,952
Tôi sẽ gõ như David.

16378
15:36:43,951 --> 15:36:47,041
Ồ, xin lỗi, không, tôi sẽ--

16379
15:36:52,567 --> 15:36:53,942
Ồ, không, đó là phiên bản sai.

16380
15:36:53,942 --> 15:36:55,772
[CƯỜI] OK, tôi trông như một thằng ngốc.

16381
15:36:58,832 --> 15:37:02,822
Và nếu tôi nói lời tạm biệt, tôi đang nói\n

16382
15:37:02,822 --> 15:37:05,112
Bây giờ nó đang phát hiện những gì tôi đang nói ở đây.

16383
15:37:05,112 --> 15:37:08,652
Vì vậy phiên bản đầu tiên của chương trình này là\n

16384
15:37:08,652 --> 15:37:12,993
Elif Elif, và nó chỉ hỏi thôi\n

16385
15:37:12,993 --> 15:37:14,951
Và đó là sai lầm của tôi\nvới ví dụ đầu tiên.

16386
15:37:14,951 --> 15:37:17,881
Và sau đó, tôi chỉ đang kiểm tra,\nis Xin chào bằng lời nói của người dùng?

16387
15:37:17,881 --> 15:37:19,339
Theo lời của người dùng thì bạn thế nào?

16388
15:37:19,339 --> 15:37:20,673
Không thấy điều đó, nhưng nó ở đó.

16389
15:37:20,673 --> 15:37:21,991
Lời tạm biệt có phải là lời nói của người dùng không?

16390
15:37:21,991 --> 15:37:25,801
Bây giờ hãy tạo một phiên bản thú vị hơn bằng cách sử dụng\n

16391
15:37:33,241 --> 15:37:40,691
Hãy làm phiên bản 2 của cái này\n

16392
15:37:43,682 --> 15:37:46,232
Được rồi, bây giờ là trí tuệ nhân tạo.

16393
15:37:46,232 --> 15:37:48,332
Bây giờ chúng ta hãy làm điều gì đó\nthú vị hơn một chút.

16394
15:37:48,332 --> 15:37:51,752
Phiên bản thứ ba của chương trình này\n

16395
15:37:53,402 --> 15:37:55,322
Xin chào thế giới, tên tôi là David.

16396
15:37:59,281 --> 15:38:02,521
Được rồi, vậy là lần đó nó chưa phân tích những gì tôi nói

16397
15:38:02,521 --> 15:38:04,451
nhưng nó đã xóa tên tôi khỏi nó.

16398
15:38:04,451 --> 15:38:07,002
Hãy làm hai ví dụ cuối cùng.

16399
15:38:07,002 --> 15:38:09,671
Cái này sẽ tạo ra một mã QR.

16400
15:38:09,671 --> 15:38:11,641
Hãy để tôi tiếp tục và\nviết một chương trình tên là

16401
15:38:11,641 --> 15:38:15,552
QR.py, điều đó rất đơn giản thực hiện việc này.

16402
15:38:15,552 --> 15:38:17,342
Hãy để tôi nhập một thư viện có tên OS.

16403
15:38:17,341 --> 15:38:19,752
Hãy để tôi nhập một thư viện có tên là mã QR.

16404
15:38:19,752 --> 15:38:24,521
Hãy để tôi lấy một hình ảnh\nở đây, đó là QRcode.make.

16405
15:38:24,521 --> 15:38:27,961
Và để tôi cung cấp cho bạn URL của like a\n

16406
15:38:31,561 --> 15:38:36,362
Hãy để tôi gõ cái này\nđể tôi không hiểu sai.

16407
15:38:36,362 --> 15:38:41,822
Được rồi, vậy nếu bây giờ tôi sử dụng URL này ở đây,\ncủa một video trên YouTube,

16408
15:38:41,822 --> 15:38:44,334
chắc chắn tôi không mắc lỗi\nlỗi đánh máy nào, bây giờ tôi sẽ đi

16409
15:38:44,334 --> 15:38:46,292
để tiếp tục thực hiện hai\ndòng mã bằng Python.

16410
15:38:46,292 --> 15:38:49,982
Trước tiên tôi sẽ lưu tệp đó dưới dạng\na tên là QR.png, tệp này

16411
15:38:49,982 --> 15:38:52,012
mã vạch hai chiều, mã QR.

16412
15:38:52,012 --> 15:38:53,762
Và thực sự, tôi sẽ\nsử dụng định dạng này.

16413
15:38:53,762 --> 15:39:00,312
Và tôi sẽ sử dụng OS.system\n

16414
15:39:00,311 --> 15:39:02,612
Và nếu bạn muốn rút\nđiện thoại của mình vào thời điểm này

16415
15:39:02,612 --> 15:39:08,792
bạn có thể xem kết quả mã vạch của tôi,\n

16416
15:39:08,792 --> 15:39:10,307
Hy vọng từ xa sẽ quét được.

16417
15:39:16,671 --> 15:39:18,981
Và tôi nghĩ đó là một câu thích hợp để kết thúc.

16418
15:40:43,362 --> 15:40:45,372
DAVID J. Malan: Đây là CS50.

16419
15:40:45,372 --> 15:40:48,702
Và đây là tuần thứ 7,\ntuần lễ Halloween.

16420
15:40:48,701 --> 15:40:51,851
Thật vậy, xin gửi lời cảm ơn đặc biệt đến\nCS50 của Valerie và mẹ cô ấy

16421
15:40:51,851 --> 15:40:55,932
vì đã tạo ra lễ hội này\n

16422
15:40:55,932 --> 15:40:58,671
Hôm nay, chúng ta sẽ tiếp tục nơi\nchúng ta đã dừng lại lần trước

16423
15:40:58,671 --> 15:41:00,521
nhớ lại, chúng tôi đã giới thiệu Python.

16424
15:41:00,521 --> 15:41:03,581
Và đó là sự chuyển đổi lớn\ncủa chúng tôi từ C, nơi đột nhiên mọi thứ

16425
15:41:03,582 --> 15:41:06,192
bắt đầu trông mới trở lại,\ncó lẽ là về mặt cú pháp.

16426
15:41:06,192 --> 15:41:09,732
Nhưng ngoài ra, có lẽ mọi việc\hy vọng đã bắt đầu trở nên dễ dàng hơn.

16427
15:41:09,732 --> 15:41:13,422
Vâng, như đã nói, vấn đề đã được đặt ra\n

16428
15:41:14,722 --> 15:41:18,432
Nhưng hy vọng bạn đã bắt đầu đánh giá cao\n

16429
15:41:19,631 --> 15:41:22,301
Bạn nhận được nhiều lợi ích hơn\nvới chính ngôn ngữ đó.

16430
15:41:22,302 --> 15:41:24,792
Và điều đó sẽ rất hữu ích trong những tuần tới

16431
15:41:24,792 --> 15:41:29,322
khi chúng tôi chuyển tiếp sang phần giới thiệu\n

16432
15:41:29,322 --> 15:41:31,612
lập trình web\ntuần tới và tuần sau nữa.

16433
15:41:31,612 --> 15:41:34,241
Vì vậy, vào cuối học kỳ và có lẽ\nthậm chí cho dự án cuối cùng của bạn

16434
15:41:34,241 --> 15:41:37,211
bạn thực sự đang xây dựng\nthứ gì đó từ đầu

16435
15:41:37,211 --> 15:41:40,756
bằng cách nào đó bằng cách nào đó sử dụng tất cả các công cụ\nkhác nhau này cùng nhau.

16436
15:41:40,756 --> 15:41:42,881
Vì vậy, trước khi chúng ta làm điều đó\nTuy nhiên, hôm nay chúng ta hãy xem xét

16437
15:41:42,881 --> 15:41:47,951
những gì chúng tôi thực sự không thể làm được\nlàm vào tuần trước, thực ra là

16438
15:41:47,951 --> 15:41:50,831
tự tạo và lưu trữ dữ liệu.

16439
15:41:50,832 --> 15:41:56,052
Trong Python, chúng tôi đã thử nghiệm với\n

16440
15:41:56,052 --> 15:41:59,152
Và bạn đã có thể\nđọc tệp CSV từ đĩa

16441
15:41:59,152 --> 15:42:03,222
có thể nói, tức là từ các tập tin\n

16442
15:42:03,222 --> 15:42:06,796
Nhưng chúng ta chưa nhất thiết phải bắt đầu\n

16443
15:42:06,796 --> 15:42:09,671
Và đó là một hạn chế rất lớn, bởi vì\n

16444
15:42:09,671 --> 15:42:11,629
cho đến nay chúng tôi đã thực hiện\na một vài trường hợp ngoại lệ

16445
15:42:11,629 --> 15:42:14,891
đã tham gia vào việc cung cấp ý kiến của tôi\n

16446
15:42:14,891 --> 15:42:16,849
Nhưng sau đó không có gì xảy ra với nó.

16447
15:42:16,849 --> 15:42:18,641
Nó biến mất ngay khi\nchương trình thoát

16448
15:42:18,641 --> 15:42:20,752
bởi vì nó chỉ được lưu trữ trong bộ nhớ.

16449
15:42:20,752 --> 15:42:24,432
Nhưng hôm nay, chúng ta sẽ bắt đầu tập trung vào tất cả\n

16450
15:42:24,432 --> 15:42:27,442
nghĩa là lưu trữ mọi thứ\nin tập tin và thư mục

16451
15:42:27,442 --> 15:42:30,281
để bạn thực sự có thể\nviết các chương trình ghi nhớ

16452
15:42:30,281 --> 15:42:31,961
lần trước con người đã làm gì.

16453
15:42:31,961 --> 15:42:34,661
Và cuối cùng,\trên thực tế, bạn có thể tạo ứng dụng dành cho thiết bị di động hoặc web

16454
15:42:34,661 --> 15:42:37,391
thực sự bắt đầu phát triển,\ngphát triển và phát triển các tập dữ liệu của họ

16455
15:42:37,391 --> 15:42:40,991
điều có thể xảy ra nếu bạn nhận được nhiều hơn và\n

16456
15:42:40,991 --> 15:42:44,741
Vậy thì, để chơi với khả năng mới này\n

16457
15:42:44,741 --> 15:42:47,559
hãy tiếp tục và\nchỉ thu thập một số dữ liệu.

16458
15:42:47,559 --> 15:42:49,391
Trên thực tế, những người trong số các bạn\nở đây có mặt trực tiếp, nếu bạn

16459
15:42:49,391 --> 15:42:52,302
muốn kéo URL này\không phải điện thoại hoặc máy tính xách tay của bạn

16460
15:42:52,302 --> 15:42:54,402
điều đó sẽ dẫn\nbạn tới Biểu mẫu Google.

16461
15:42:54,402 --> 15:42:59,472
Và Biểu mẫu Google đó sẽ\n

16462
15:43:00,661 --> 15:43:02,411
Và nó sẽ yêu cầu\nbạn phân loại nó

16463
15:43:02,411 --> 15:43:06,611
theo một thể loại, như hài kịch,\n

16464
15:43:07,802 --> 15:43:09,552
Và điều này rất hữu ích,\nvì nếu bạn đã từng

16465
15:43:09,552 --> 15:43:12,862
đã sử dụng Google Biểu mẫu trước đây hoặc\n

16466
15:43:12,862 --> 15:43:15,612
đó là một cơ chế thực sự hữu ích\n

16467
15:43:15,612 --> 15:43:19,342
và cuối cùng là đưa\nit vào dạng bảng tính.

16468
15:43:19,341 --> 15:43:23,502
Đây là ảnh chụp màn hình\ndạng mà các bạn

16469
15:43:23,502 --> 15:43:26,421
trực tiếp tại đây hoặc theo dõi trên\nZoom hiện đang điền.

16470
15:43:26,421 --> 15:43:27,761
Nó chỉ hỏi hai câu hỏi.

16471
15:43:27,762 --> 15:43:29,891
Tiêu đề\nchương trình truyền hình yêu thích của bạn là gì?

16472
15:43:29,891 --> 15:43:34,811
Và một hoặc nhiều thể loại\nmà chương trình truyền hình của bạn thuộc về là gì?

16473
15:43:34,811 --> 15:43:38,201
Và bây giờ tôi sẽ tiếp tục\nxoay sang chế độ xem

16474
15:43:38,201 --> 15:43:41,008
mà tôi có thể xem là\n

16475
15:43:41,008 --> 15:43:42,550
khá đơn giản là một bảng tính Google.

16476
15:43:42,550 --> 15:43:45,050
Google Biểu mẫu có tính năng\nhay ho này nếu bạn chưa từng chú ý đến

16477
15:43:45,050 --> 15:43:47,991
cho phép bạn xuất\ndữ liệu của mình sang Bảng tính Google.

16478
15:43:47,991 --> 15:43:50,472
Và từ đó, chúng ta\ncó thể thực sự lấy được tệp

16479
15:43:50,472 --> 15:43:52,842
và tải nó xuống máy Mac\hiện tại của tôi hoặc PC của riêng bạn

16480
15:43:52,841 --> 15:43:55,661
để chúng ta thực sự có thể chơi đùa\n

16481
15:43:55,661 --> 15:43:57,911
Vì vậy, trên thực tế, hãy để tôi\ntiếp tục và trượt qua

16482
15:43:57,911 --> 15:44:01,881
về điều này, Bảng tính Google trực tiếp.

16483
15:44:01,881 --> 15:44:05,831
Và có lẽ bạn sẽ thấy toàn bộ\n

16484
15:44:06,701 --> 15:44:09,161
Và nếu chúng ta tiếp tục cuộn,\ncuộn và cuộn--

16485
15:44:10,631 --> 15:44:12,771
Thế đấy, đã lên tới 50 rồi.

16486
15:44:12,771 --> 15:44:15,761
Nếu bạn cần lại URL đó\ntại đây, nếu bạn chỉ theo dõi

16487
15:44:15,762 --> 15:44:18,192
bạn có thể truy cập URL này tại đây.

16488
15:44:18,192 --> 15:44:21,102
Và chỉ trong chốc lát,\nchúng ta sẽ có rất nhiều dữ liệu

16489
15:44:21,101 --> 15:44:24,792
mà chúng ta có thể bắt đầu thử nghiệm.

16490
15:44:24,792 --> 15:44:26,412
Tôi sẽ cho bạn một chút thời gian ở đó.

16491
15:44:33,760 --> 15:44:35,302
Hãy để tôi ở đó lâu hơn một chút.

16492
15:44:35,302 --> 15:44:36,760
OK, chúng tôi đã có hơn 100 bài gửi.

16493
15:44:37,732 --> 15:44:40,612
Tốt, bây giờ thậm chí còn nhiều hơn nữa.

16494
15:44:40,612 --> 15:44:42,232
Và chúng ta có thể thấy họ đến trực tiếp.

16495
15:44:42,232 --> 15:44:44,092
Đây, hãy để tôi chuyển\nquay lại bảng tính.

16496
15:44:44,091 --> 15:44:46,431
Danh sách này đang ngày càng tăng lên,\nngày càng tăng lên.

16497
15:44:48,241 --> 15:44:51,831
hãy để tôi cho Carter một chút thời gian để\ngiúp tôi xuất nó theo thời gian thực.

16498
15:44:51,832 --> 15:44:54,982
Carter, hãy thông báo cho tôi\nkhi điều đó hợp lý với tôi

16499
15:44:58,222 --> 15:45:00,482
Được rồi, tôi sẽ bắt đầu\nlàm việc này thật chậm rãi.

16500
15:45:00,482 --> 15:45:03,062
Vì vậy tôi sẽ đi tới Tệp\n

16501
15:45:03,061 --> 15:45:05,451
Tải xuống-- bạn có thể tải xuống toàn bộ\n

16502
15:45:05,451 --> 15:45:07,401
Nhưng đơn giản hơn, và cái\nchúng ta sẽ bắt đầu chơi ở đây

16503
15:45:08,972 --> 15:45:12,351
Vậy các tệp CSV mà chúng tôi đã sử dụng\ntuần trước, tại sao chúng lại hữu ích?

16504
15:45:12,351 --> 15:45:15,531
Bây giờ bạn đã chơi với họ\n

16505
15:45:15,531 --> 15:45:20,601
tiện ích của tệp CSV so với\n là gì

16506
15:45:26,199 --> 15:45:28,072
ĐỐI TƯỢNG: Bởi vì nó chỉ là một tập tin văn bản?

16507
15:45:28,072 --> 15:45:29,947
DAVID J. Malan: Được rồi,\nviệc lưu trữ rất hấp dẫn.

16508
15:45:29,947 --> 15:45:33,052
Một tệp văn bản đơn giản có ASCII hoặc\n

16509
15:45:36,525 --> 15:45:37,860
DAVID J. Malan: Vâng, nói hay lắm.

16510
15:45:37,860 --> 15:45:40,101
Đó chỉ là một văn bản\nđịnh dạng đơn giản nhưng sử dụng các quy ước

16511
15:45:40,101 --> 15:45:43,671
giống như dấu phẩy bạn có thể biểu thị\n

16512
15:45:43,671 --> 15:45:45,771
dấu gạch chéo ngược kết thúc vô hình\na ở cuối dòng của bạn

16513
15:45:45,771 --> 15:45:47,341
bạn có thể tạo ra ý tưởng về các hàng.

16514
15:45:47,341 --> 15:45:49,341
Vì vậy đây là một\ncách rất đơn giản để triển khai những gì

16515
15:45:49,341 --> 15:45:51,951
chúng ta có thể gọi một cơ sở dữ liệu tệp phẳng.

16516
15:45:51,951 --> 15:45:54,201
Đó là một cách lưu trữ\ndữ liệu trong một căn hộ, nghĩa là

16517
15:45:54,201 --> 15:45:57,651
một tập tin rất đơn giản chỉ là\nvăn bản thuần ASCII hoặc Unicode.

16518
15:45:57,652 --> 15:46:00,682
Và hấp dẫn hơn nữa, tôi dám\nnói, đó là với một tệp CSV

16519
15:46:02,203 --> 15:46:04,161
Có thứ gì đó có thể mang theo được trong\nthế giới điện toán

16520
15:46:04,161 --> 15:46:07,251
nếu điều đó có nghĩa là bạn có thể sử dụng nó trên máy Mac\n

16521
15:46:08,091 --> 15:46:10,822
Và tính di động là tốt vì nếu\n

16522
15:46:10,822 --> 15:46:13,101
sẽ có rất nhiều\nngười trong phòng này và trực tuyến

16523
15:46:13,101 --> 15:46:15,531
người không thể tải nó xuống vì\n

16524
15:46:16,281 --> 15:46:21,021
Hoặc nếu họ có máy Mac hoặc nếu đó\n

16525
15:46:21,021 --> 15:46:22,951
người dùng PC có thể không tải được nó xuống.

16526
15:46:22,951 --> 15:46:25,141
Vì vậy, CSV thực sự rất dễ mang theo.

16527
15:46:25,141 --> 15:46:28,281
Vì vậy, tôi sẽ tiếp tục và\ntải xuống, khá đơn giản, CSV

16528
15:46:29,781 --> 15:46:32,301
Việc đó sẽ đưa nó vào\nthư mục Tải xuống của máy Mac của tôi.

16529
15:46:32,302 --> 15:46:36,802
Và hãy để tôi tiếp tục ở đây, và chỉ trong một\n

16530
15:46:36,802 --> 15:46:40,252
Bởi vì nó thực sự tải xuống\nit với một cái tên khá lớn.

16531
15:46:40,252 --> 15:46:43,461
Và hãy cho tôi một chút thời gian ở đây,\nvà bạn sẽ thấy điều đó, thực sự

16532
15:46:43,461 --> 15:46:46,551
trên máy Mac của tôi, tôi có một tệp\ncó tên là favorites.csv.

16533
15:46:46,552 --> 15:46:48,092
Tôi rút ngắn tên thật nhanh.

16534
15:46:48,091 --> 15:46:54,021
Và bây giờ điều tôi sắp làm là đi\n

16535
15:46:54,021 --> 15:46:55,822
Tôi sẽ mở File Explorer của mình.

16536
15:46:55,822 --> 15:46:59,961
Và nếu tôi thu nhỏ cửa sổ của mình ở đây\n

16537
15:46:59,961 --> 15:47:03,322
là bạn có thể chỉ cần kéo và thả một\n

16538
15:47:03,322 --> 15:47:06,002
Và thì đấy, nó sẽ\ntự động tải nó lên cho bạn.

16539
15:47:06,002 --> 15:47:08,601
Vì vậy, hãy để tôi tiếp tục và toàn màn hình\nở đây, đóng Explorer của tôi

16540
15:47:08,601 --> 15:47:10,461
tạm thời đóng cửa sổ Terminal của tôi.

16541
15:47:10,461 --> 15:47:14,061
Và bạn sẽ thấy ở đây một tệp\nCSV, favorites.csv.

16542
15:47:14,061 --> 15:47:16,731
Và hàng đầu tiên, theo\nquy ước, có bất cứ thứ gì

16543
15:47:16,732 --> 15:47:20,062
các cột nằm trong Google\nBảng tính hoặc Office 365

16544
15:47:20,061 --> 15:47:23,961
trong Excel trực tuyến, dấu thời gian,\ndấu phẩy, tiêu đề, dấu phẩy, thể loại.

16545
15:47:23,961 --> 15:47:25,731
Sau đó, chúng ta có dấu thời gian\ncho biết

16546
15:47:25,732 --> 15:47:27,064
khi mọi người bắt đầu gửi.

16547
15:47:27,063 --> 15:47:29,271
Có vẻ như một số người\nrất háo hức nhận được

16548
15:47:30,771 --> 15:47:34,682
Và sau đó, bạn có\ntiêu đề tiếp theo, sau dấu phẩy.

16549
15:47:34,682 --> 15:47:37,491
Nhưng có một sự tò mò sau đó.

16550
15:47:37,491 --> 15:47:40,851
Thỉnh thoảng mình thấy thể loại\nnhư hài, hài, hài

16551
15:47:40,851 --> 15:47:45,211
nhưng đôi khi nó giống như tội ác, dấu phẩy,\n

16552
15:47:45,891 --> 15:47:47,811
Và những điều đó được trích dẫn.

16553
15:47:47,811 --> 15:47:49,521
Tuy nhiên, tôi đã không làm bất kỳ trích dẫn nào.

16554
15:47:49,521 --> 15:47:51,141
Có lẽ bạn đã không gõ bất kỳ dấu ngoặc kép nào.

16555
15:47:51,141 --> 15:47:55,521
Những trích dẫn\nđến từ đâu trong tệp CSV này?

16556
15:47:55,521 --> 15:47:56,991
Tại sao họ ở đó nếu chúng ta suy luận?

16557
15:48:00,682 --> 15:48:03,650
DAVID J. Malan: Vâng, vậy là bạn có một trường hợp khó khăn, nếu bạn muốn.

16558
15:48:03,650 --> 15:48:05,692
Bởi vì nếu bạn đang sử dụng\ndấu phẩy, như bạn đã mô tả

16559
15:48:05,692 --> 15:48:09,622
để tách dữ liệu của bạn thành các cột\nang hiệu quả, vâng

16560
15:48:09,622 --> 15:48:12,352
bạn đã tự đẩy mình vào\na góc nếu dữ liệu thực tế của bạn

16561
15:48:13,919 --> 15:48:16,461
Vậy Google đã làm gì,\nMicrosoft làm gì, Apple làm gì

16562
15:48:16,461 --> 15:48:19,671
là, họ trích dẫn bất kỳ chuỗi\nvăn bản nào mà chính họ

16563
15:48:19,671 --> 15:48:23,902
có dấu phẩy nên đây\nlà dấu phẩy ngữ pháp tiếng Anh

16564
15:48:26,072 --> 15:48:28,741
Vì vậy, đó là một cách để thoát\ndữ liệu của bạn, nếu bạn muốn.

16565
15:48:28,741 --> 15:48:31,411
Và việc thoát chỉ có nghĩa là gọi\nout một biểu tượng theo một cách đặc biệt

16566
15:48:31,411 --> 15:48:33,978
để nó không bị hiểu sai\na là điều gì khác.

16567
15:48:33,978 --> 15:48:35,811
Được rồi, điều này\cuối cùng để nói rằng bây giờ chúng ta

16568
15:48:35,811 --> 15:48:39,322
có tất cả dữ liệu này mà chúng tôi\n

16569
15:48:39,322 --> 15:48:41,182
bắt đầu gọi cơ sở dữ liệu tệp phẳng.

16570
15:48:41,182 --> 15:48:44,572
Vì vậy, giả sử bây giờ tôi muốn\nbắt đầu thao tác với dữ liệu này

16571
15:48:44,572 --> 15:48:47,451
và cuối cùng tôi muốn lưu trữ nó\thực sự ở định dạng CSV này.

16572
15:48:47,451 --> 15:48:49,881
Làm thế nào tôi thực sự có thể\nbắt đầu đọc dữ liệu này

16573
15:48:49,881 --> 15:48:52,292
có thể dọn dẹp nó, có thể\nthực hiện một số phân tích về nó

16574
15:48:52,292 --> 15:48:55,912
và thực sự tìm ra điều gì là quan trọng nhất\n

16575
15:48:55,911 --> 15:48:57,531
ở đây trong vài phút qua?

16576
15:48:57,531 --> 15:48:59,612
Được rồi, hãy để tôi tiếp tục và đóng cái này lại.

16577
15:48:59,612 --> 15:49:04,311
Vậy hãy để tôi tiếp tục và mở cửa,\n

16578
15:49:04,311 --> 15:49:07,311
Và hãy mã hóa một tệp\ncó tên là favorites.py.

16579
15:49:07,311 --> 15:49:11,451
Và hãy tiếp tục và bắt đầu lặp lại\n

16580
15:49:11,451 --> 15:49:13,171
và in ra những gì bên trong nó.

16581
15:49:13,171 --> 15:49:16,671
Vì vậy bạn có thể nhớ lại rằng chúng ta có thể làm\n

16582
15:49:16,671 --> 15:49:20,332
để cung cấp cho tôi một số chức năng đọc CSV\n.

16583
15:49:20,332 --> 15:49:24,952
Sau đó, tôi có thể tiếp tục và làm điều gì đó\n

16584
15:49:24,951 --> 15:49:27,621
mà tôi muốn mở ở chế độ đọc.

16585
15:49:27,622 --> 15:49:29,332
Trích dẫn, bỏ trích dẫn, "r" có nghĩa là đọc nó.

16586
15:49:29,332 --> 15:49:31,942
Và sau đó, tôi có thể nói là\nfile hoặc bất kỳ tên nào khác

16587
15:49:31,942 --> 15:49:35,012
cho một biến để nói rằng\nTôi muốn mở tập tin này

16588
15:49:35,012 --> 15:49:37,822
và về cơ bản là lưu trữ một số loại\n

16589
15:49:38,942 --> 15:49:42,262
Sau đó, tôi có thể tạo cho mình một\nreader và tôi có thể nói csv.reader

16590
15:49:42,262 --> 15:49:43,739
chuyển tập tin đó làm đầu vào.

16591
15:49:43,739 --> 15:49:45,322
Và đây chính là điều kỳ diệu của thư viện đó.

16592
15:49:45,322 --> 15:49:48,531
Nó xử lý quá trình mở\n

16593
15:49:48,531 --> 15:49:51,771
trả lại thứ gì đó mà bạn có thể\n

16594
15:49:51,771 --> 15:49:55,851
Tôi thực sự muốn bỏ qua hàng đầu tiên,\nvà nhớ lại rằng tôi có thể làm điều này.

16595
15:49:55,851 --> 15:49:59,006
Tiếp theo, thưa quý độc giả, đây có phải là mẹo nhỏ\n

16596
15:49:59,006 --> 15:50:00,381
Bởi vì cái đầu tiên là đặc biệt.

16597
15:50:00,381 --> 15:50:02,752
Nó cho biết dấu thời gian, tiêu đề, thể loại.

16598
15:50:02,752 --> 15:50:04,741
Đó không phải là dữ liệu của bạn, đó là của tôi.

16599
15:50:04,741 --> 15:50:07,222
Nhưng điều này có nghĩa là\ntôi đã bỏ qua hàng đầu tiên đó.

16600
15:50:07,222 --> 15:50:10,042
Mọi thứ sau này sẽ trở thành tiêu đề của một chương trình

16601
15:50:10,042 --> 15:50:11,601
mà tất cả các bạn đều thích, vậy hãy để tôi làm điều này.

16602
15:50:11,601 --> 15:50:16,432
Đối với hàng trong trình đọc, hãy\ntiếp tục và in ra tiêu đề

16603
15:50:16,432 --> 15:50:18,201
của chương trình mà mỗi bạn đã nhập vào.

16604
15:50:18,201 --> 15:50:22,341
Làm cách nào để tôi biết được tiêu đề\ncủa chương trình mà mỗi người trong số các bạn đã nhập vào?

16605
15:50:22,341 --> 15:50:24,081
Nó ở đâu đó bên trong hàng.

16606
15:50:26,131 --> 15:50:28,252
Vậy tôi muốn\nnhập gì tiếp theo để có được

16607
15:50:28,252 --> 15:50:34,262
ở tiêu đề\nrow hiện tại giống như kiểm tra nhanh ở đây?

16608
15:50:34,262 --> 15:50:36,692
Tôi muốn gõ gì\nget ở tiêu đề hàng

16609
15:50:36,692 --> 15:50:40,862
một lần nữa, hãy nhớ rằng đó\nlà dấu thời gian, tiêu đề, thể loại?

16610
15:50:42,237 --> 15:50:44,252
DAVID J. Malan: Vậy hàng\nngoặc 1 sẽ cho tôi

16611
15:50:44,252 --> 15:50:47,982
cột thứ hai, chỉ mục 0, nghĩa là\n

16612
15:50:47,982 --> 15:50:49,862
Vậy là chương trình này chưa thú vị lắm

16613
15:50:49,862 --> 15:50:52,711
nhưng đó là một cách nhanh chóng và bẩn thỉu\n

16614
15:50:53,161 --> 15:50:55,328
Hãy để tôi thực hiện\nkiểm tra một chút ở đây

16615
15:50:55,328 --> 15:50:57,721
và xem liệu nó có chứa\ndữ liệu mà tôi nghĩ là có không.

16616
15:50:57,722 --> 15:50:59,832
Hãy để tôi phóng to cửa sổ Terminal của tôi ở đây.

16617
15:50:59,832 --> 15:51:03,152
Hãy để tôi chạy Python của\nfavorites.py, nhấn Enter.

16618
15:51:03,152 --> 15:51:07,862
Và bây giờ bạn sẽ thấy một danh sách thuần\nvăn bản gồm tất cả các chương trình

16619
15:51:09,902 --> 15:51:12,421
Nhưng điều gì đáng chú ý về nó?

16620
15:51:12,421 --> 15:51:15,301
Bỏ những biểu hiện cụ thể sang một bên,\nđánh giá về con người

16621
15:51:15,302 --> 15:51:19,982
Thị hiếu truyền hình, điều thú vị hoặc\nđáng chú ý về dữ liệu

16622
15:51:19,982 --> 15:51:23,432
có thể gây ra một số vấn đề cho chúng tôi\n

16623
15:51:23,432 --> 15:51:25,082
và tìm ra cái gì phổ biến nhất?

16624
15:51:25,082 --> 15:51:27,932
Có bao nhiêu người thích cái này cái kia?

16625
15:51:29,493 --> 15:51:32,800
ĐỐI TƯỢNG: Lỗi người dùng [KHÔNG NGHE ĐƯỢC].

16626
15:51:32,800 --> 15:51:34,842
DAVID J. Malan: Vâng,\ncó thể có lỗi do người dùng

16627
15:51:34,841 --> 15:51:38,141
hoặc chỉ là sự khác biệt về phong cách\n

16628
15:51:42,311 --> 15:51:45,591
Hãy xem liệu tôi có thể thấy\nví dụ trên màn hình ở đây không.

16629
15:51:45,591 --> 15:51:49,681
Vâng, vậy nên bạn bè ở đây là tất cả\n

16630
15:51:50,482 --> 15:51:51,712
Chúng ta có thể giảm thiểu điều đó.

16631
15:51:51,711 --> 15:51:54,822
Nhưng đây chỉ là một ví dụ nhỏ\nvề việc dữ liệu trong thế giới thực

16632
15:51:56,099 --> 15:51:57,641
Và đó có lẽ thậm chí không phải là một lỗi đánh máy.

16633
15:51:57,641 --> 15:52:02,928
Chỉ là ai đó không quan tâm nhiều\n

16634
15:52:02,928 --> 15:52:05,261
Người dùng của bạn sẽ nhập\nnội dung họ sẽ nhập.

16635
15:52:05,262 --> 15:52:08,922
Vì vậy, hãy xem liệu bây giờ chúng ta có thể bắt đầu\nđể lấy dữ liệu cụ thể hơn không

16636
15:52:08,921 --> 15:52:10,841
và thậm chí có thể dọn sạch\nmột số dữ liệu này.

16637
15:52:10,841 --> 15:52:15,911
Hãy để tôi quay lại tập tin của tôi\ncó tên là favorites.py tại đây

16638
15:52:15,911 --> 15:52:19,691
và chúng ta hãy thực sự làm điều gì đó\n

16639
15:52:19,692 --> 15:52:23,412
Thay vì một người đọc, hãy nhớ rằng có\n

16640
15:52:23,411 --> 15:52:25,091
chỉ thân thiện hơn một chút với người dùng.

16641
15:52:25,091 --> 15:52:30,011
Và điều đó có nghĩa là tôi có thể gõ từ điển\n

16642
15:52:30,012 --> 15:52:36,012
Nhưng bây giờ, khi tôi lặp lại điều này\n

16643
15:52:36,012 --> 15:52:39,402
Khi sử dụng DictReader thay vì\nđầu đọc, hãy nhớ lại và điều này

16644
15:52:39,402 --> 15:52:43,031
chỉ là một điểm đặc biệt\ncủa thư viện CSV

16645
15:52:43,031 --> 15:52:47,871
cái này trả về cho tôi, không phải danh sách\nô, mà thay vào đó là cái gì

16646
15:52:47,872 --> 15:52:50,292
cái nào thân thiện với tôi hơn một chút?

16647
15:52:53,802 --> 15:52:56,202
Bây giờ tôi có thể sử dụng dấu ngoặc mở,\ndấu ngoặc kép và tiêu đề.

16648
15:52:56,201 --> 15:52:59,112
Bởi vì thứ đang quay trở lại\nnow là một đối tượng dict, tức là

16649
15:52:59,112 --> 15:53:02,351
một từ điển có khóa và giá trị.

16650
15:53:02,351 --> 15:53:04,402
Các phím trong đó là\ntiêu đề cột.

16651
15:53:04,402 --> 15:53:06,741
Các giá trị trong số đó là\ndữ liệu mà tôi thực sự quan tâm.

16652
15:53:06,741 --> 15:53:09,371
Vì vậy, điều này chỉ tốt hơn một chút\nbởi vì, thứ nhất, nó

16653
15:53:09,372 --> 15:53:12,672
rõ ràng hơn đối với tôi,\n

16654
15:53:13,391 --> 15:53:15,652
Tôi không nhớ tiêu đề\ncột là gì.

16655
15:53:17,232 --> 15:53:18,792
Đó là điều bạn sẽ quên theo thời gian.

16656
15:53:18,792 --> 15:53:21,851
Và xin Chúa cấm ai đó thay đổi\n

16657
15:53:21,851 --> 15:53:24,731
các cột trong Excel hoặc Apple\nNumbers hoặc Bảng tính Google.

16658
15:53:24,732 --> 15:53:27,320
Điều đó sẽ phá vỡ tất cả\nchỉ số số của bạn.

16659
15:53:27,319 --> 15:53:29,112
Và do đó, một từ điển\nreader được cho là chỉ

16660
15:53:29,112 --> 15:53:32,652
thiết kế tốt hơn vì nó\nmạnh mẽ hơn trước những thay đổi

16661
15:53:32,652 --> 15:53:34,302
và những lỗi tiềm ẩn như thế.

16662
15:53:34,302 --> 15:53:37,902
Bây giờ ảnh hưởng của sự thay đổi này không còn\n

16663
15:53:37,902 --> 15:53:42,162
Nếu tôi chạy Python của favorites.py,\n

16664
15:53:42,161 --> 15:53:46,631
Nhưng tôi chưa đưa ra bất kỳ giả định nào\n

16665
15:53:48,762 --> 15:53:51,672
Nào, hãy tiếp tục và bây giờ\nlọc ra một số bản sao.

16666
15:53:51,671 --> 15:53:55,301
Vì có rất nhiều điểm chung\n

16667
15:53:55,302 --> 15:53:58,002
xem liệu chúng tôi có thể lọc ra các bản sao không.

16668
15:53:58,002 --> 15:54:04,241
Nếu tôi đang đọc tệp CSV từ trên xuống dưới,\n

16669
15:54:04,241 --> 15:54:06,991
Tôi muốn triển khai\nlọc các bản sao?

16670
15:54:06,991 --> 15:54:10,241
Nó sẽ không đơn giản như\n

16671
15:54:10,241 --> 15:54:12,641
Tôi sẽ phải xây dựng cái này.

16672
15:54:12,641 --> 15:54:15,972
Nhưng về mặt logic, nếu bạn đang đọc\na tệp từ trên xuống dưới

16673
15:54:15,972 --> 15:54:20,202
bạn có thể làm như thế nào, trong\nPython hoặc bất kỳ ngữ cảnh nào

16674
15:54:20,201 --> 15:54:23,381
loại bỏ các giá trị trùng lặp?

16675
15:54:31,951 --> 15:54:35,072
Tôi có thể sử dụng một danh sách và tôi có thể\nthêm từng tiêu đề vào danh sách

16676
15:54:35,072 --> 15:54:38,411
nhưng trước tiên hãy kiểm tra xem tôi đã đưa\ncái này vào danh sách trước đó chưa.

16677
15:54:38,411 --> 15:54:40,481
Vậy hãy thử một chút\nđiều gì đó tương tự như vậy.

16678
15:54:40,482 --> 15:54:43,682
Hãy để tôi tiếp tục và tạo một biến\n

16679
15:54:43,682 --> 15:54:46,682
Ví dụ: tôi sẽ gọi nó là tiêu đề\khởi tạo một danh sách trống

16680
15:54:46,682 --> 15:54:48,391
dấu ngoặc mở, dấu ngoặc đóng.

16681
15:54:48,391 --> 15:54:53,201
Và sau đó, bên trong vòng lặp của tôi\ntại đây, thay vì in nó ra

16682
15:54:53,201 --> 15:54:54,971
hãy bắt đầu đưa ra quyết định.

16683
15:54:54,972 --> 15:55:04,673
Vì vậy, nếu tiêu đề\ncủa hàng hiện tại nằm trong danh sách tiêu đề

16684
15:55:04,673 --> 15:55:05,881
Tôi không muốn đặt nó ở đó.

16685
15:55:05,881 --> 15:55:08,923
Và thực ra, hãy để tôi đảo ngược logic\n

16686
15:55:08,923 --> 15:55:13,531
Vì vậy, nếu không phải như vậy\ntiêu đề khung hàng nằm trong tiêu đề

16687
15:55:13,531 --> 15:55:21,542
sau đó hãy tiếp tục và làm điều gì đó như\n

16688
15:55:21,542 --> 15:55:24,512
Và nhớ lại rằng chúng ta đã thấy\n.append cách đây khoảng một tuần

16689
15:55:24,512 --> 15:55:27,042
nơi nó chỉ cho phép bạn\nappend vào danh sách hiện tại.

16690
15:55:27,042 --> 15:55:30,152
Và rồi, cuối cùng tôi có thể làm gì\nsau khi tất cả đã xong

16691
15:55:30,152 --> 15:55:31,802
đọc xong toàn bộ tập tin?

16692
15:55:31,802 --> 15:55:35,162
Tại sao tôi không tiếp tục và\nnói, về tiêu đề trong các tiêu đề

16693
15:55:35,161 --> 15:55:38,072
hãy tiếp tục và in\nout tiêu đề hiện tại?

16694
15:55:38,072 --> 15:55:42,042
Vậy là bây giờ còn hai vòng nữa và chúng ta có thể đến\n

16695
15:55:42,042 --> 15:55:44,715
Nhưng hãy để tôi tiếp tục ở đây và\nchạy lại Python của favorites.py.

16696
15:55:44,714 --> 15:55:47,881
Hãy để tôi tăng kích thước Terminal của tôi\n

16697
15:55:53,461 --> 15:55:56,432
Tôi không nghĩ mình đang nhìn thấy\ndbản sao, mặc dù tôi

16698
15:55:56,432 --> 15:55:59,342
tôi đang thấy một số bản sao gần như trùng lặp.

16699
15:55:59,341 --> 15:56:02,101
Ví dụ: lại có Bạn bè.

16700
15:56:02,101 --> 15:56:05,402
Và nếu chúng ta tiếp tục đi,\nđi, đi và đi

16701
15:56:06,601 --> 15:56:12,411
Ồ, thú vị đấy, tò mò quá\n

16702
15:56:12,411 --> 15:56:13,971
và tôi cũng có cái này ở đây.

16703
15:56:13,972 --> 15:56:16,461
Vậy làm thế nào chúng ta có thể làm sạch điều này hơn nữa?

16704
15:56:16,461 --> 15:56:18,735
Tôi thích bản năng của bạn và\n đang tiến một bước gần hơn đến điều đó.

16705
15:56:18,735 --> 15:56:20,902
Chúng ta sẽ phải\nlàm gì để thực sự lọc ra

16706
15:56:24,487 --> 15:56:29,386
ĐỐI TƯỢNG: Bạn có thể đặt\nmọi thứ ở mức thấp [KHÔNG NGHE ĐƯỢC]..

16707
15:56:30,262 --> 15:56:32,012
Những sai lầm thường gặp cần tóm tắt là gì?

16708
15:56:32,012 --> 15:56:34,747
Chúng ta có thể bỏ qua cách viết hoa\n cùng nhau và có thể

16709
15:56:34,747 --> 15:56:37,372
chỉ cần buộc mọi thứ thành chữ thường,\cũng không phải mọi thứ thành chữ hoa.

16710
15:56:37,372 --> 15:56:39,262
Điều đó không quan trọng, nhưng\nhãy nhất quán.

16711
15:56:39,262 --> 15:56:42,137
Và đối với những người trong số các bạn có thể có\n

16712
15:56:42,137 --> 15:56:44,992
phím cách ở đầu\nđầu vào của bạn hoặc thậm chí ở cuối

16713
15:56:46,521 --> 15:56:49,831
Việc loại bỏ khoảng trắng là điều phổ biến\n

16714
15:56:49,832 --> 15:56:53,211
Vì vậy, hãy để tôi quay lại\ncode của mình ở đây và để tôi tiếp tục

16715
15:56:53,211 --> 15:56:55,882
và chỉnh sửa tiêu đề một chút.

16716
15:56:55,881 --> 15:56:58,701
Hãy để tôi nói rằng\ntitle hiện tại bên trong vòng lặp này

16717
15:56:58,701 --> 15:57:01,641
sẽ không chỉ là\ntiêu đề của hàng hiện tại.

16718
15:57:01,641 --> 15:57:05,781
Nhưng hãy để tôi tiếp tục và cởi đồ ra,\n

16719
15:57:06,601 --> 15:57:09,601
Nếu bạn đọc tài liệu về\n

16720
15:57:09,601 --> 15:57:12,572
Nó loại bỏ khoảng trắng ở\ntrái, khoảng trắng ở bên phải.

16721
15:57:12,572 --> 15:57:15,652
Và sau đó, nếu tôi muốn buộc\nmọi thứ có thể viết hoa

16722
15:57:15,652 --> 15:57:18,052
Tôi chỉ có thể viết hoa toàn bộ chuỗi.

16723
15:57:18,052 --> 15:57:21,652
Và hãy nhớ, Python có ích lợi gì\n

16724
15:57:21,652 --> 15:57:24,891
gọi lại với nhau bằng cách\nsử dụng các dấu chấm nhiều lần.

16725
15:57:24,891 --> 15:57:26,841
Và điều đó chỉ cần\nbất cứ điều gì vừa xảy ra

16726
15:57:26,841 --> 15:57:29,661
giống như khoảng trắng đã bị loại bỏ\ntắt, sau đó, nó cũng vậy

16727
15:57:29,661 --> 15:57:31,621
chữ hoa toàn bộ là tốt.

16728
15:57:31,622 --> 15:57:36,322
Vì vậy bây giờ tôi sẽ kiểm tra xem\n

16729
15:57:36,322 --> 15:57:40,101
Và nếu không, tôi sẽ tiếp tục và thêm tiêu đề đó vào

16730
15:57:40,101 --> 15:57:42,542
được chuyển sang định dạng\nkhác này, nếu bạn muốn.

16731
15:57:42,542 --> 15:57:44,692
Vì vậy, tôi đang vứt đi một số thông tin.

16732
15:57:44,692 --> 15:57:49,102
Tôi đang hy sinh tất cả\n sắc thái ngữ pháp và thông tin đầu vào của bạn

16733
15:57:50,362 --> 15:57:52,822
Nhưng ít nhất tôi đang cố gắng\nchuẩn hóa kích thước, nghĩa là

16734
15:57:52,822 --> 15:57:55,292
tiêu chuẩn hóa\ndata thực sự trông như thế nào.

16735
15:57:55,292 --> 15:57:59,152
Vậy hãy để tôi tiếp tục và chạy Python\n

16736
15:57:59,152 --> 15:58:00,754
Ồ, và đây chỉ là lỗi của người dùng.

16737
15:58:00,754 --> 15:58:02,211
Có lẽ bạn chưa từng thấy điều này trước đây.

16738
15:58:02,211 --> 15:58:06,211
Điều này có vẻ giống như\na lỗi của tôi.

16739
15:58:06,211 --> 15:58:08,542
Tôi muốn nói thậm chí không viết hoa.

16740
15:58:09,544 --> 15:58:11,752
Hàm này được gọi là hàm trên,\ngiờ tôi nghĩ đến nó.

16741
15:58:12,171 --> 15:58:14,671
Hãy bắt đầu và tăng lại kích thước\ncủa cửa sổ Terminal.

16742
15:58:16,161 --> 15:58:20,871
Và bây giờ, nó choáng ngợp hơn một chút\n

16743
15:58:22,641 --> 15:58:28,641
Nhưng có thể nói như vậy, tôi không nghĩ mình đang nhìn thấy\nnhiều Người bạn.

16744
15:58:28,641 --> 15:58:31,796
Có một Người bạn\nở đây và thế là xong.

16745
15:58:31,796 --> 15:58:33,171
Tôi đã sao lưu theo lời nhắc của mình rồi.

16746
15:58:33,171 --> 15:58:35,612
Vì vậy, hiện tại có vẻ như chúng tôi đang\nlọc ra các bản sao.

16747
15:58:35,612 --> 15:58:38,923
Bây giờ, trước khi chúng ta đi sâu hơn và\n

16748
15:58:38,923 --> 15:58:40,131
chúng ta có thể làm gì khác?

16749
15:58:40,131 --> 15:58:42,441
Chà, hóa ra\nin Python 2 bạn thường xuyên

16750
15:58:42,442 --> 15:58:44,692
có rất nhiều chức năng\nđược tích hợp trong ngôn ngữ.

16751
15:58:44,692 --> 15:58:47,655
Và tôi đang tự mình thực hiện ý tưởng về một bộ.

16752
15:58:47,654 --> 15:58:49,822
Nếu bạn nghĩ lại\ntoán học, một tập hợp thường là

16753
15:58:49,822 --> 15:58:53,811
thứ gì đó có nhiều giá trị\n

16754
15:58:53,811 --> 15:58:56,631
Hãy nhớ lại rằng Python\nal đã có cái này cho chúng ta.

16755
15:58:56,631 --> 15:58:59,542
Và chúng tôi đã thấy nó rất nhanh\nkhi tôi mở từ điển

16756
15:58:59,542 --> 15:59:01,531
triển khai vài tuần trước.

16757
15:59:01,531 --> 15:59:06,322
Vì vậy, tôi thực sự có thể xác định chức danh của mình\n

16758
15:59:06,322 --> 15:59:11,421
và điều này sẽ chỉ cho phép một cách khiêm tốn\n

16759
15:59:11,421 --> 15:59:14,211
rằng dù sao thì tôi cũng không cần phải bận tâm\nkiểm tra các bản sao.

16760
15:59:14,211 --> 15:59:18,051
Thay vào đó tôi có thể chỉ nói\nđiều gì đó như, title.add

16761
15:59:18,052 --> 15:59:21,149
tiêu đề hiện tại, như thế này.

16762
15:59:21,148 --> 15:59:24,231
Thiết kế tốt hơn một chút nếu bạn biết\n

16763
15:59:24,232 --> 15:59:26,095
nhận được nhiều chức năng hơn từ việc này.

16764
15:59:26,095 --> 15:59:28,012
Được rồi, hãy tiếp tục dọn dẹp\ndữ liệu.

16765
15:59:28,012 --> 15:59:31,492
Hiện chúng tôi đã tiếp tục và khắc phục\nsự cố về phân biệt chữ hoa chữ thường.

16766
15:59:31,491 --> 15:59:34,281
Chúng tôi đã bỏ khoảng trắng trong trường hợp\nai đó đã nhấn phím cách

16767
15:59:35,332 --> 15:59:39,302
Bây giờ chúng ta hãy tiếp tục và sắp xếp những thứ này\n

16768
15:59:39,302 --> 15:59:42,622
Vì vậy, thay vì chỉ in ra\ncác tiêu đề theo cùng thứ tự

16769
15:59:42,622 --> 15:59:47,484
tất cả các bạn đã nhập chúng nhưng đang lọc\n

16770
15:59:47,483 --> 15:59:49,941
và sử dụng một hàm khác trong\nPython mà có thể bạn chưa từng thấy

16771
15:59:49,942 --> 15:59:52,281
nghĩa đen\nđược gọi là đã sắp xếp, và sẽ

16772
15:59:52,281 --> 15:59:57,241
đảm nhiệm quá trình\thực tế sắp xếp tiêu đề cho bạn.

16773
15:59:57,241 --> 15:59:59,781
Hãy để tôi tiếp tục và tăng\nkích thước phông chữ của Terminal của tôi

16774
15:59:59,781 --> 16:00:01,911
chạy Python của favorites.py,\nvà nhấn Enter.

16775
16:00:01,911 --> 16:00:05,751
Và bây giờ bạn thực sự có thể thấy có bao nhiêu trong số\n

16776
16:00:06,561 --> 16:00:08,932
Giờ đây, việc thu hút tâm trí của chúng ta đã dễ dàng hơn một chút\n

16777
16:00:08,932 --> 16:00:11,991
chỉ vì ít nhất\nnó được sắp xếp theo thứ tự bảng chữ cái.

16778
16:00:11,991 --> 16:00:15,561
Nhưng bây giờ bạn thực sự có thể thấy một số\n

16779
16:00:17,192 --> 16:00:21,742
Nhưng một số bạn đã quyết định tạo kiểu\n

16780
16:00:21,741 --> 16:00:24,862
Brooklyn 99 ở đây có nhiều cách khác nhau.

16781
16:00:24,862 --> 16:00:28,042
Và tôi nghĩ nếu tiếp tục chúng ta sẽ thấy\n

16782
16:00:28,042 --> 16:00:31,802
không khắc phục được bằng cách chỉ tập trung vào\nkhoảng trắng và viết hoa.

16783
16:00:31,802 --> 16:00:35,212
Vì vậy, đã ở đây rồi, đây chỉ là\ncái gì, hơn 100, 200 hàng.

16784
16:00:35,211 --> 16:00:38,137
Dữ liệu trong thế giới thực\nbắt đầu trở nên lộn xộn nhanh chóng

16785
16:00:38,137 --> 16:00:40,012
và điều đó có thể không tốt\nkhi chúng ta thực sự

16786
16:00:40,012 --> 16:00:41,992
muốn giữ dữ liệu thực\ntừ người dùng thực.

16787
16:00:41,991 --> 16:00:44,366
Bạn có thể tưởng tượng một\ntrang web thực tế hoặc một ứng dụng di động

16788
16:00:44,366 --> 16:00:47,002
giải quyết vấn đề này trên quy mô lớn.

16789
16:00:47,002 --> 16:00:48,421
Nào, hãy tiếp tục và làm điều này.

16790
16:00:48,421 --> 16:00:51,711
Chúng ta hãy thực sự tìm hiểu\nmức độ phổ biến của các chương trình khác nhau này

16791
16:00:51,711 --> 16:00:57,021
bây giờ đang lặp lại dữ liệu của tôi và\n

16792
16:00:58,341 --> 16:01:03,231
Chúng ta sẽ bỏ qua vấn đề\n

16793
16:01:03,232 --> 16:01:07,732
Xin lỗi, vâng, Avatar,\nnơi có những thứ

16794
16:01:07,732 --> 16:01:12,412
khác biệt ngoài\nkhoảng trắng và cách viết hoa.

16795
16:01:12,411 --> 16:01:14,181
Nhưng bây giờ hãy tiếp tục và\ntheo dõi

16796
16:01:14,182 --> 16:01:17,631
có bao nhiêu người trong số các bạn đã nhập\nmỗi tiêu đề này.

16797
16:01:18,790 --> 16:01:21,082
Tôi vẫn sẽ áp dụng phương pháp lặp đi lặp lại này

16798
16:01:21,082 --> 16:01:23,452
tệp CSV từ trên xuống dưới.

16799
16:01:23,451 --> 16:01:25,701
Cho đến nay, chúng tôi đã sử dụng một vài\ncấu trúc dữ liệu

16800
16:01:25,701 --> 16:01:29,601
một danh sách để theo dõi các tiêu đề,\n

16801
16:01:29,601 --> 16:01:32,691
Nhưng nếu bây giờ tôi muốn giữ\n thêm một chút thông tin thì sao?

16802
16:01:32,692 --> 16:01:38,452
Đối với mỗi tiêu đề, tôi muốn giữ lại\n

16803
16:01:39,472 --> 16:01:43,222
Tôi đang vứt bỏ tổng số\nsố lần tôi xem những chương trình này.

16804
16:01:43,222 --> 16:01:45,862
Làm thế nào tôi có thể bắt đầu giữ điều đó?

16805
16:01:45,862 --> 16:01:47,186
ĐỐI TƯỢNG: Sử dụng từ điển.

16806
16:01:47,186 --> 16:01:49,311
DAVID J. Malan: Chúng ta có thể\nsử dụng từ điển và bằng cách nào?

16807
16:01:51,476 --> 16:01:53,434
DAVID J. Malan: Hoàn hảo,\nbản năng thực sự tốt.

16808
16:01:53,434 --> 16:01:55,191
Sử dụng từ điển\trong chừng mực nó cho phép chúng ta

16809
16:01:55,192 --> 16:01:58,641
lưu trữ khóa và giá trị, nghĩa là\n

16810
16:01:59,192 --> 16:02:01,822
Đây là lý do tại sao cần có thêm từ điển\cũng như bảng băm

16811
16:02:01,822 --> 16:02:04,972
nói chung là một cấu trúc dữ liệu hữu ích,\nthực tế.

16812
16:02:04,972 --> 16:02:08,461
Bởi vì họ chỉ để bạn nhớ\n

16813
16:02:08,461 --> 16:02:11,211
Vì vậy, nếu chìa khóa\nsẽ là tựa đề tôi đã thấy

16814
16:02:11,211 --> 16:02:15,201
các giá trị có thể là số\n

16815
16:02:15,201 --> 16:02:19,649
Và nó giống như thế\n

16816
16:02:19,650 --> 16:02:22,192
Ví dụ: nếu tôi định làm điều này trên một tờ giấy

16817
16:02:22,192 --> 16:02:24,682
Tôi có thể chỉ có hai\ncột ở đây, nơi

16818
16:02:24,682 --> 16:02:29,932
có lẽ đây là tựa đề mà tôi\n

16819
16:02:29,932 --> 16:02:33,592
Trên thực tế, đây là một\ntừ điển trong Python.

16820
16:02:33,591 --> 16:02:36,831
Đó là hai cột, khóa ở\ntrái, giá trị ở bên phải.

16821
16:02:36,832 --> 16:02:38,961
Và điều này, nếu tôi có thể triển khai mã\nin, thực sự sẽ

16822
16:02:38,961 --> 16:02:42,921
cho phép tôi lưu trữ dữ liệu này và\n

16823
16:02:42,921 --> 16:02:44,792
để tìm ra cái nào phổ biến nhất.

16824
16:02:45,722 --> 16:02:49,582
Hãy để tôi tiếp tục và thay đổi tiêu đề của mình\n

16825
16:02:49,582 --> 16:02:54,502
Thay vào đó hãy coi nó là một cuốn từ điển,\n

16826
16:02:54,502 --> 16:02:58,942
hai dấu ngoặc nhọn trống sẽ cho\n

16827
16:03:00,201 --> 16:03:02,781
Tôi nghĩ hầu hết\ncode của tôi có thể giữ nguyên.

16828
16:03:02,781 --> 16:03:06,201
Nhưng ở dưới này, tôi không muốn\nchỉ thêm tiêu đề một cách mù quáng

16829
16:03:07,521 --> 16:03:10,401
Bằng cách nào đó tôi cần phải theo dõi số lượng.

16830
16:03:10,402 --> 16:03:14,031
Và thật không may, nếu tôi\nlàm điều này-- hãy làm tiêu đề

16831
16:03:14,031 --> 16:03:18,921
dấu ngoặc, tiêu đề, cộng bằng 1.

16832
16:03:18,921 --> 16:03:21,472
Đây là nỗ lực hợp lý\nđầu tiên trong việc này.

16833
16:03:22,762 --> 16:03:28,072
Nếu tiêu đề là một từ điển và tôi muốn\n

16834
16:03:28,072 --> 16:03:30,862
cú pháp cho điều đó, như trước đây,\nis tiêu đề, dấu ngoặc và sau đó

16835
16:03:30,862 --> 16:03:34,222
khóa bạn muốn sử dụng để\nchỉ mục vào từ điển.

16836
16:03:34,222 --> 16:03:37,342
Trong trường hợp này nó không phải là một con số,\nit là một từ thực tế, một tiêu đề.

16837
16:03:37,341 --> 16:03:39,561
Và bạn sẽ\ntăng nó lên một

16838
16:03:39,561 --> 16:03:42,351
và rồi cuối cùng tôi sẽ quay lại\nvà kết thúc vòng lặp thứ hai của mình

16839
16:03:42,351 --> 16:03:45,051
và làm mọi việc theo thứ tự.

16840
16:03:45,052 --> 16:03:48,922
Nhưng hiện tại, chúng ta hãy\ntheo dõi tổng số.

16841
16:03:48,921 --> 16:03:51,002
Hãy để tôi tiếp tục và\tăng cửa sổ Terminal của mình.

16842
16:03:51,002 --> 16:03:54,932
Hãy để tôi làm Python của\nfavorites.py và nhấn Enter.

16843
16:03:55,432 --> 16:03:59,482
Tôi đã gặp mẹ của bạn như thế nào đang gây ra cho tôi một lỗi chính.

16844
16:04:04,461 --> 16:04:07,671
Và trên thực tế, chỉ để cung cấp một\nmột chút mẩu tin vụn vặt ở đây

16845
16:04:09,482 --> 16:04:12,262
Hãy để tôi mở lại tệp CSV\n thật nhanh.

16846
16:04:12,262 --> 16:04:15,802
Và ôi, chúng tôi thậm chí còn không vượt qua được\nhàng thứ hai trong tệp

16847
16:04:15,802 --> 16:04:17,552
hoặc chương trình đầu tiên trong tập tin.

16848
16:04:17,552 --> 16:04:20,182
Lưu ý rằng Tôi đã gặp mẹ của bạn như thế nào, có phần viết thường

16849
16:04:20,182 --> 16:04:22,904
là buổi trình diễn đầu tiên trong đó.

16850
16:04:22,904 --> 16:04:24,862
Bản năng của bạn là gì\ntại sao điều này lại xảy ra?

16851
16:04:24,862 --> 16:04:27,092
ĐỐI TƯỢNG: Bạn không có điểm bắt đầu.

16852
16:04:27,091 --> 16:04:29,008
DAVID J. Malan: Tôi không có điểm khởi đầu.

16853
16:04:30,262 --> 16:04:35,182
Tôi đang lập chỉ mục một cách mù quáng vào từ điển\n

16854
16:04:35,182 --> 16:04:37,222
nó chưa tồn tại\trong từ điển.

16855
16:04:37,222 --> 16:04:39,952
Và do đó Python đưa ra\ncái được gọi là lỗi khóa

16856
16:04:39,951 --> 16:04:42,781
vì khóa bạn đang cố\nsử dụng chưa tồn tại.

16857
16:04:42,781 --> 16:04:46,341
Vậy về mặt logic, làm thế nào chúng ta có thể khắc phục điều này?

16858
16:04:47,031 --> 16:04:50,451
Chúng tôi đã giải quyết được một nửa vấn đề,\n

16859
16:04:50,451 --> 16:04:52,191
trường hợp không có gì ở đó.

16860
16:04:52,936 --> 16:04:54,271
ĐỐI TƯỢNG: Tạo một bộ đếm.

16861
16:04:54,271 --> 16:04:54,961
DAVID J. Malan: Tạo ra một--

16862
16:04:55,711 --> 16:04:57,582
DAVID J. Malan: Tự tạo\nbộ đếm.

16863
16:04:57,582 --> 16:04:59,531
Vậy có lẽ tôi có thể làm điều gì đó như thế này.

16864
16:04:59,531 --> 16:05:03,722
Hãy để tôi đóng cửa sổ Terminal\nvà để tôi đặt một câu hỏi trước.

16865
16:05:03,722 --> 16:05:10,322
Nếu tiêu đề hiện tại nằm trong\n

16866
16:05:10,322 --> 16:05:12,781
hóa ra điều đó sẽ cho tôi câu trả lời\nđúng-sai.

16867
16:05:12,781 --> 16:05:17,582
Sau đó, tôi có thể nói một cách an toàn rằng, tiêu đề,\nngoặc, tiêu đề, cộng bằng 1.

16868
16:05:17,582 --> 16:05:22,082
Và hãy nhớ lại, đây chỉ là cách viết tắt\n

16869
16:05:25,510 --> 16:05:28,052
Điều đó cũng tương tự như thế này\nnhưng ngắn gọn hơn một chút

16870
16:05:30,152 --> 16:05:34,832
Ngược lại, nếu về mặt logic thì không phải như vậy\n

16871
16:05:34,832 --> 16:05:38,952
từ điển thì có lẽ tôi muốn\n

16872
16:05:38,951 --> 16:05:40,656
Hãy thoải mái hét lên.

16873
16:05:42,156 --> 16:05:46,661
Tôi chỉ cần đặt một số giá trị vào đó\n

16874
16:05:47,161 --> 16:05:49,711
Bây giờ tôi đã giải quyết xong việc này, hãy để tôi tiếp tục

16875
16:05:49,711 --> 16:05:51,961
và tạm thời hoàn tác việc sắp xếp của tôi.

16876
16:05:51,961 --> 16:05:54,991
Và bây giờ hãy để tôi tiếp tục và làm điều này.

16877
16:05:54,991 --> 16:05:58,801
Tôi có thể, để kiểm tra nhanh, hãy để tôi\ntiếp tục và chỉ chạy mã

16878
16:05:58,802 --> 16:06:00,391
cũng như Python của favorites.py.

16879
16:06:02,372 --> 16:06:05,132
Nó đang in chính xác, không có lỗi\n phím, nhưng nó không được sắp xếp.

16880
16:06:05,131 --> 16:06:06,961
Và tôi không thấy bất kỳ số lượng nào.

16881
16:06:06,961 --> 16:06:09,122
Hãy để tôi cộng nhanh\nsố lượng và có

16882
16:06:09,122 --> 16:06:10,872
một vài cách tôi có thể làm điều này.

16883
16:06:10,872 --> 16:06:18,242
Ví dụ, tôi có thể in ra tiêu đề và\n

16884
16:06:18,241 --> 16:06:22,561
còn chỉ, dấu phẩy,\ntiêu đề, dấu ngoặc, tiêu đề thì sao?

16885
16:06:22,561 --> 16:06:24,362
Vì vậy tôi sẽ in\nhai thứ cùng một lúc

16886
16:06:24,362 --> 16:06:26,942
cả tiêu đề hiện tại\trong từ điển

16887
16:06:26,942 --> 16:06:29,641
và bất kể giá trị của nó\nis bằng cách lập chỉ mục vào nó.

16888
16:06:29,641 --> 16:06:31,481
Hãy để tôi tăng cửa sổ Terminal của mình.

16889
16:06:31,482 --> 16:06:35,762
Hãy để tôi chạy Python của\nfavorites.py, Enter và OK.

16890
16:06:39,421 --> 16:06:42,902
Có vẻ như không ai trong số các bạn nói nhiều về\ncác chương trình truyền hình.

16891
16:06:42,902 --> 16:06:47,031
Lỗi logic ở đây là gì?

16892
16:06:47,031 --> 16:06:50,801
Tôi đã làm gì sai nếu\nxem lại mã của mình ở đây?

16893
16:06:55,832 --> 16:07:00,482
Tóm lại, tôi đã khởi tạo\n

16894
16:07:00,482 --> 16:07:03,842
nhưng lẽ ra tôi nên khởi tạo nó ở\n

16895
16:07:03,841 --> 16:07:05,561
Hoặc tôi nên thay đổi mã của mình một chút.

16896
16:07:05,561 --> 16:07:08,222
Vì vậy, ví dụ, nếu tôi quay lại\nin ở đây, cách khắc phục đơn giản nhất

16897
16:07:08,222 --> 16:07:11,732
có lẽ là khởi tạo thành 1,\n

16898
16:07:11,732 --> 16:07:14,552
rõ ràng đây là lần đầu tiên tôi nhìn thấy\ntiêu đề này.

16899
16:07:14,552 --> 16:07:16,922
Hoặc tôi có thể thay đổi logic của mình một chút.

16900
16:07:16,921 --> 16:07:18,811
Thay vào đó tôi có thể làm điều gì đó như thế này.

16901
16:07:18,811 --> 16:07:24,182
Nếu tiêu đề hiện tại không có trong tiêu đề,\n

16902
16:07:24,182 --> 16:07:28,201
Và sau đó tôi có thể loại bỏ\ncái khác, và bây giờ lập chỉ mục một cách mù quáng

16903
16:07:30,241 --> 16:07:34,441
Bởi vì bây giờ, ở dòng 11, tôi\ncó thể tin tưởng rằng dòng 9 và 10

16904
16:07:34,442 --> 16:07:37,382
đã lo việc khởi tạo\n giúp tôi nếu cần.

16905
16:07:38,911 --> 16:07:42,491
Cái này đẹp hơn một chút, có lẽ\nvì nó ít hơn một dòng.

16906
16:07:42,491 --> 16:07:45,811
Nhưng tôi nghĩ cả hai cách tiếp cận đều\n

16907
16:07:45,811 --> 16:07:47,761
Nhưng điều quan trọng, không có ý định chơi chữ, là chúng tôi

16908
16:07:47,762 --> 16:07:52,442
phải đảm bảo rằng khóa tồn tại\n

16909
16:07:59,741 --> 16:08:03,031
Vì vậy, nếu không thì mọi người sẽ có\n

16910
16:08:03,031 --> 16:08:04,531
có bao nhiêu người nói điều tương tự.

16911
16:08:04,531 --> 16:08:06,578
Bây giờ mã đã như vậy.

16912
16:08:06,578 --> 16:08:08,911
Vì vậy, hãy để tôi tiếp tục và mở\nup lại cửa sổ Terminal của mình.

16913
16:08:08,911 --> 16:08:13,051
Hãy để tôi chạy Python của favorites.py,\n

16914
16:08:13,052 --> 16:08:14,492
Một số chương trình không phổ biến lắm.

16915
16:08:14,491 --> 16:08:16,171
Chỉ có 1 và có thể là 2.

16916
16:08:16,171 --> 16:08:21,911
Nhưng tôi cá là nếu chúng ta sắp xếp những thứ này thì chúng ta\n

16917
16:08:23,232 --> 16:08:29,862
Chà, hóa ra, khi\nlàm việc với một từ điển như thế này--

16918
16:08:29,862 --> 16:08:32,502
hãy tiếp tục và\ntự sắp xếp các tiêu đề.

16919
16:08:32,502 --> 16:08:37,472
Vậy hãy giới thiệu lại hàm sắp xếp\n

16920
16:08:37,472 --> 16:08:40,077
Hãy để tôi tiếp tục và\nchạy Python của favorites.py.

16921
16:08:40,076 --> 16:08:42,451
Giờ đây, việc đó dễ dàng hơn một chút\nđể bạn suy nghĩ về nó

16922
16:08:42,451 --> 16:08:43,909
vì ít nhất nó cũng theo thứ tự bảng chữ cái.

16923
16:08:43,910 --> 16:08:47,942
Nhưng nó không được sắp xếp theo\ngiá trị mà được sắp xếp theo khóa.

16924
16:08:47,942 --> 16:08:51,512
Nhưng chắc chắn rồi, nếu chúng ta cuộn\nxuống, sẽ có thứ gì đó ở dưới đây

16925
16:08:51,512 --> 16:08:54,544
ví dụ như,\nhãy xem, The Office.

16926
16:08:54,544 --> 16:08:56,252
Đó chắc chắn\nsẽ là một ứng cử viên

16927
16:08:56,252 --> 16:08:58,201
cho phổ biến nhất, 15 câu trả lời.

16928
16:08:58,201 --> 16:09:01,201
Nhưng hãy xem điều gì thực sự\nsẽ nổi lên đến đỉnh.

16929
16:09:01,201 --> 16:09:06,211
Thật không may, hàm sắp xếp\n

16930
16:09:09,752 --> 16:09:12,841
Nhưng hóa ra, trong Python,\nnếu bạn đọc tài liệu

16931
16:09:12,841 --> 16:09:14,851
đối với hàm được sắp xếp,\nbạn thực sự có thể

16932
16:09:14,851 --> 16:09:19,921
chuyển vào các đối số khác\ncho nó biết cách sắp xếp mọi thứ.

16933
16:09:19,921 --> 16:09:22,771
Chẳng hạn, nếu tôi muốn\nlàm mọi việc theo thứ tự ngược lại

16934
16:09:22,771 --> 16:09:27,481
Tôi có thể thêm tham số thứ hai vào\n

16935
16:09:28,652 --> 16:09:30,961
Bạn nói theo đúng nghĩa đen,\nđảo ngược bằng đúng, vậy

16936
16:09:30,961 --> 16:09:34,171
rằng vị trí của nó trong\n

16937
16:09:34,171 --> 16:09:37,103
Nếu bây giờ tôi chạy lại cái này sau khi\tăng cửa sổ Terminal của mình

16938
16:09:37,103 --> 16:09:39,061
bây giờ bạn sẽ thấy rằng nó\n theo thứ tự ngược lại.

16939
16:09:39,061 --> 16:09:41,671
Bây giờ hãy phiêu lưu và Anne\nvới chữ E ở cuối

16940
16:09:41,671 --> 16:09:43,752
của đầu ra thay vì trên cùng.

16941
16:09:43,752 --> 16:09:52,186
Làm cách nào tôi có thể yêu cầu nó sắp xếp\ntheo giá trị thay vì theo khóa?

16942
16:09:52,186 --> 16:09:53,561
Nào, hãy tiếp tục và làm điều này.

16943
16:09:53,561 --> 16:09:56,281
Hãy để tôi tiếp tục và định nghĩa một hàm.

16944
16:09:56,281 --> 16:09:58,411
Tôi sẽ gọi nó\nf để giữ mọi thứ đơn giản.

16945
16:09:58,411 --> 16:10:01,531
Và hàm f này sẽ\n lấy tiêu đề làm đầu vào.

16946
16:10:01,531 --> 16:10:06,481
Và với một tiêu đề nhất định, nó sẽ diễn ra\n

16947
16:10:06,482 --> 16:10:09,902
Vì vậy, thực ra, có lẽ một cái tên hay hơn\ncho cái này sẽ có giá trị

16948
16:10:09,902 --> 16:10:12,162
và/hoặc chúng ta cũng có thể nghĩ ra\nđiều gì đó khác.

16949
16:10:12,161 --> 16:10:14,641
Mục đích của hàm get\nvalue phải rõ ràng

16950
16:10:14,641 --> 16:10:19,542
là lấy nó làm tiêu đề đầu vào và\n

16951
16:10:20,802 --> 16:10:23,102
Chà, hóa ra hàm\nsorted trong Python

16952
16:10:23,101 --> 16:10:27,211
theo tài liệu của nó,\ncũng lấy một tham số chính

16953
16:10:27,211 --> 16:10:31,201
nơi bạn có thể chuyển vào, điên\đủ rồi, tên của một hàm

16954
16:10:31,201 --> 16:10:36,991
mà nó sẽ sử dụng để xác định\n

16955
16:10:36,991 --> 16:10:41,891
hoặc theo giá trị, hoặc trong các trường hợp khác,\n

16956
16:10:41,891 --> 16:10:44,731
Vì vậy, có một sự tò mò ở đây\nmặc dù, điều đó rất có chủ ý.

16957
16:10:44,732 --> 16:10:46,892
Key là tên của tham số\n, giống như đảo ngược

16958
16:10:46,891 --> 16:10:48,434
là tên của tham số khác này.

16959
16:10:48,434 --> 16:10:51,451
Tuy nhiên, giá trị của nó\nis không phải là lệnh gọi hàm.

16960
16:10:52,921 --> 16:10:55,862
Lưu ý rằng tôi không làm\nviệc này, không có dấu ngoặc đơn.

16961
16:10:55,862 --> 16:11:00,741
Thay vào đó tôi chuyển vào giá trị nhận,\n

16962
16:11:00,741 --> 16:11:03,241
Và đây là một tính năng của Python\nvà một số ngôn ngữ khác.

16963
16:11:03,241 --> 16:11:06,451
Cũng giống như các biến, trên thực tế bạn có thể truyền toàn bộ hàm

16964
16:11:06,451 --> 16:11:10,901
xung quanh để có thể gọi chúng\n

16965
16:11:10,902 --> 16:11:14,222
Vậy điều này có nghĩa là\n

16966
16:11:14,222 --> 16:11:16,752
họ không biết hôm nay bạn muốn sắp xếp thứ gì.

16967
16:11:16,752 --> 16:11:21,152
Nhưng nếu bạn cung cấp cho họ một chức năng\n

16968
16:11:21,152 --> 16:11:23,342
hàm được sắp xếp của họ\nsẽ sử dụng hàm đó

16969
16:11:23,341 --> 16:11:27,181
để xác định, được thôi, nếu bạn không muốn\n

16970
16:11:28,292 --> 16:11:31,141
Điều này sẽ bảo\nit sắp xếp theo giá trị

16971
16:11:31,141 --> 16:11:34,091
bằng cách trả về giá trị\n cụ thể mà chúng ta quan tâm.

16972
16:11:34,091 --> 16:11:37,921
Vậy hãy để tôi tiếp tục và chạy lại cái này\n

16973
16:11:39,961 --> 16:11:42,451
Bây giờ chúng tôi có một ví dụ\nvề tất cả các tựa sách dành cho bạn

16974
16:11:42,451 --> 16:11:47,521
đã nhập vào, mặc dù buộc phải viết hoa\n

16975
16:11:47,521 --> 16:11:50,074
Và giờ đây, The Office\nan dễ dàng chiếm được cảm tình của Bạn bè

16976
16:11:50,074 --> 16:11:52,741
so với Cộng đồng, so với Game of\nThrones, Breaking Bad, và sau đó

16977
16:11:52,741 --> 16:11:55,081
rất nhiều biến thể sau đó.

16978
16:11:55,082 --> 16:11:57,022
Vì vậy, có rất nhiều bước phải trải qua.

16979
16:11:57,021 --> 16:11:58,896
Việc này cũng không tệ lắm\nbạn đã từng làm điều đó một lần

16980
16:11:58,896 --> 16:12:00,813
và bạn biết những\nchức năng này là gì, và bạn

16981
16:12:00,813 --> 16:12:02,211
biết rằng các tham số này tồn tại.

16982
16:12:03,351 --> 16:12:07,432
Đó là 17 dòng mã\nchỉ để phân tích tệp CSV

16983
16:12:07,432 --> 16:12:10,762
mà tất cả các bạn đã tạo thông qua\ncác lần gửi Biểu mẫu Google đó.

16984
16:12:10,762 --> 16:12:13,702
Nhưng tôi đã mất rất nhiều công sức\n

16985
16:12:13,701 --> 16:12:15,618
Và quả thực, đó sẽ\nlà một trong những mục tiêu

16986
16:12:15,618 --> 16:12:18,261
Suy cho cùng thì hôm nay, làm cách nào\nchúng ta có thể khiến việc này trở nên dễ dàng hơn?

16987
16:12:18,262 --> 16:12:20,137
Học\nnhững điều mới trong Python là một chuyện

16988
16:12:20,137 --> 16:12:22,641
nhưng nếu chúng ta có thể tránh viết\ncode, hoặc nhiều mã này

16989
16:12:22,641 --> 16:12:24,182
đó sẽ là một điều tốt.

16990
16:12:24,182 --> 16:12:26,362
Và một kỹ thuật khác\nchúng tôi có thể giới thiệu ở đây

16991
16:12:26,362 --> 16:12:28,912
điều đó cho phép chúng ta\nviết ít mã hơn một chút

16992
16:12:28,911 --> 16:12:31,072
là, chúng ta thực sự có thể thoát khỏi hàm này.

16993
16:12:31,072 --> 16:12:34,582
Hóa ra, trong Python, nếu bạn\nchỉ cần tạo một hàm

16994
16:12:34,582 --> 16:12:37,281
nhưng nó sẽ được sử dụng và\nsau đó về cơ bản sẽ bị vứt đi

16995
16:12:37,281 --> 16:12:40,131
đó không phải là thứ bạn đang làm\n

16996
16:12:40,131 --> 16:12:42,891
nó không giống như một chức năng thư viện\nmà bạn muốn giữ lại--

16997
16:12:42,891 --> 16:12:45,021
bạn thực sự có thể làm điều này.

16998
16:12:45,021 --> 16:12:48,771
Bạn có thể thay đổi giá trị\ncủa tham số chính này

16999
16:12:48,771 --> 16:12:51,291
được gọi là hàm\nlambda,

17000
16:12:51,292 --> 16:12:54,381
là một cách nói hoa mỹ để nói về một hàm\n

17001
16:12:57,741 --> 16:13:00,871
Chà, thật là ngu ngốc khi\ntôi nghĩ ra cái tên này ở dòng 13.

17002
16:13:00,872 --> 16:13:04,012
Tôi đã sử dụng nó ở dòng 16 và\nsau đó tôi không bao giờ sử dụng nó nữa.

17003
16:13:04,012 --> 16:13:07,862
Nếu chỉ được sử dụng ở một nơi,\n

17004
16:13:07,862 --> 16:13:10,342
Vì vậy, thay vào đó, trong\nPython, hãy nói lambda

17005
16:13:10,341 --> 16:13:13,191
rồi gõ\ntên của tham số

17006
16:13:13,192 --> 16:13:15,472
bạn muốn chức năng ẩn danh này được thực hiện

17007
16:13:15,472 --> 16:13:19,802
sau đó bạn có thể nói, hãy tiếp tục\nvà trả về giá trị này.

17008
16:13:19,802 --> 16:13:22,372
Bây giờ chúng ta hãy chú ý\sự không nhất quán ở đây.

17009
16:13:22,372 --> 16:13:25,192
Khi bạn sử dụng từ khóa lambda\nđặc biệt này có nội dung, xin chào Python

17010
16:13:25,192 --> 16:13:28,192
cho tôi một hàm ẩn danh,\na hàm không có tên

17011
16:13:28,192 --> 16:13:31,952
sau đó nó nói, Python, ẩn danh này\n

17012
16:13:31,951 --> 16:13:34,040
Lưu ý không có dấu ngoặc đơn.

17013
16:13:34,040 --> 16:13:35,841
Và đó là cố ý, nếu gây nhầm lẫn.

17014
16:13:35,841 --> 16:13:38,250
Nó chỉ thắt chặt mọi thứ lại một chút.

17015
16:13:38,250 --> 16:13:42,111
Lưu ý rằng không có từ khóa trả về,\n

17016
16:13:42,112 --> 16:13:44,122
lên một chút, mặc dù không nhất quán.

17017
16:13:44,122 --> 16:13:47,992
Nhưng dòng mã này\nTôi vừa đánh dấu

17018
16:13:47,991 --> 16:13:51,771
thực sự có chức năng\ngiống hệt với cái này.

17019
16:13:51,771 --> 16:13:53,662
Nhưng nó vứt bỏ từ [KHÔNG NGHE ĐƯỢC].

17020
16:13:53,661 --> 16:13:55,191
Nó vứt bỏ từ nhận được giá trị.

17021
16:13:55,192 --> 16:13:58,852
Nó loại bỏ các dấu ngoặc đơn và\n

17022
16:14:00,021 --> 16:14:02,631
Và nó rất phù hợp\ncho một vấn đề như thế này

17023
16:14:02,631 --> 16:14:05,301
nơi tôi chỉ muốn truyền vào\na một hàm nhỏ bé mà

17024
16:14:06,432 --> 16:14:08,182
Nhưng đó không phải là thứ\nTôi sẽ sử dụng lại.

17025
16:14:08,182 --> 16:14:10,442
Nó không cần nhiều\ndòng để chiếm dung lượng.

17026
16:14:10,442 --> 16:14:12,501
Nó chỉ là một lớp lót đẹp, thanh lịch.

17027
16:14:12,500 --> 16:14:14,181
Đó là tất cả những gì hàm lambda làm.

17028
16:14:14,182 --> 16:14:17,251
Nó cho phép bạn tạo một ẩn danh\n

17029
16:14:17,250 --> 16:14:22,551
Và sau đó là hàm bạn truyền vào đó\n

17030
16:14:22,552 --> 16:14:26,152
Quả thực, nếu tôi chạy Python của favorites.py\n

17031
16:14:26,152 --> 16:14:28,141
kết quả là hoàn toàn giống nhau.

17032
16:14:28,141 --> 16:14:31,701
Và chúng ta thấy ở phía dưới đây\ntất cả những kết quả nhỏ đó.

17033
16:14:31,701 --> 16:14:36,151
Vậy thì có câu hỏi nào về\ncú pháp này, về những ý tưởng này không?

17034
16:14:36,152 --> 16:14:39,112
Mục tiêu ở đây là viết\n

17035
16:14:39,112 --> 16:14:44,201
để phân tích hoặc làm sạch dữ liệu như thế này.

17036
16:14:48,614 --> 16:14:51,781
DAVID J. Malan: Bạn có thể sử dụng lambda\n

17037
16:14:51,781 --> 16:14:54,601
Nói chung, nó thực sự có ý nghĩa đối với một\ndòng mã.

17038
16:14:54,601 --> 16:14:56,762
Vì vậy, bạn không sử dụng từ khóa return.

17039
16:14:56,762 --> 16:14:59,222
Bạn chỉ cần nói những gì bạn muốn quay lại.

17040
16:15:03,021 --> 16:15:04,271
DAVID J. Malan: Câu hỏi hay.

17041
16:15:04,271 --> 16:15:06,301
Bạn có thể làm nhiều hơn trong\ndòng đó nếu nó

17042
16:15:06,302 --> 16:15:08,012
phải là một thuật toán phức tạp hơn?

17043
16:15:08,012 --> 16:15:11,162
Có, nhưng cuối cùng bạn\nsẽ trả về giá trị được đề cập.

17044
16:15:11,161 --> 16:15:13,288
Nói tóm lại, nếu nó trở nên phức tạp hơn

17045
16:15:13,288 --> 16:15:15,121
bạn không sử dụng hàm lambda\n trong Python.

17046
16:15:15,122 --> 16:15:17,852
Bạn tiếp tục và thực sự\nchỉ cần xác định tên cho nó

17047
16:15:17,851 --> 16:15:19,574
ngay cả khi đó là một cái tên chỉ có một lần.

17048
16:15:19,574 --> 16:15:21,991
JavaScript, một ngôn ngữ khác\nchúng ta sẽ xem xét sau vài tuần nữa

17049
16:15:21,991 --> 16:15:24,932
Tôi dám nói rằng việc sử dụng các hàm lambda nhiều hơn.

17050
16:15:24,932 --> 16:15:27,372
Và những cái đó thực sự có thể là\nnhiều, nhiều dòng

17051
16:15:27,372 --> 16:15:30,862
nhưng Python không ủng hộ bản năng đó.

17052
16:15:31,362 --> 16:15:33,069
Vì vậy hãy tiếp tục và\nlàm một việc khác.

17053
16:15:33,069 --> 16:15:35,682
Office rõ ràng đã xuất hiện\n\nmã ở đây khá nhiều.

17054
16:15:35,682 --> 16:15:38,101
Hãy tiếp tục và viết một\nchương trình hơi khác một chút

17055
16:15:38,101 --> 16:15:40,741
có lẽ hiện tại chỉ tập trung vào\nVăn phòng

17056
16:15:42,241 --> 16:15:46,591
Vậy hãy để tôi tiếp tục và ném hầu hết\n

17057
16:15:46,591 --> 16:15:48,421
khi tôi ở trong vòng lặp bên trong của mình.

17058
16:15:48,421 --> 16:15:51,391
Và hãy để tôi tiếp tục, còn tôi thì không\n

17059
16:15:51,391 --> 16:15:53,582
Tất cả những gì tôi muốn làm là tập trung vào tiêu đề hiện tại.

17060
16:15:53,582 --> 16:15:56,072
Làm cách nào tôi có thể phát hiện xem\nai đó có thích The Office không?

17061
16:15:56,072 --> 16:15:59,131
À, tôi có thể nói điều gì đó như--

17062
16:16:01,652 --> 16:16:03,692
Chúng ta sẽ chỉ tập trung vào Văn phòng.

17063
16:16:03,692 --> 16:16:09,272
Nếu tiêu đề bằng, bằng The Office,\n

17064
16:16:13,741 --> 16:16:15,199
Hiện tại không có từ điển nào liên quan.

17065
16:16:15,199 --> 16:16:17,221
Nó chỉ là một biến số nguyên đơn giản.

17066
16:16:17,222 --> 16:16:21,092
Và sau đó, ở dưới đây\nTôi sẽ nói điều gì đó như

17067
16:16:21,091 --> 16:16:26,311
số lượng người thích The\nOffice, bất kể giá trị này là bao nhiêu.

17068
16:16:26,311 --> 16:16:29,191
Và tôi sẽ đặt vào\ndấu ngoặc nhọn, rồi tôi sẽ

17069
16:16:29,192 --> 16:16:31,125
biến toàn bộ thứ này thành một chuỗi F.

17070
16:16:31,125 --> 16:16:32,792
Được rồi, để tôi tiếp tục và chạy cái này.

17071
16:16:32,792 --> 16:16:35,442
Python của favorites.py, Enter.

17072
16:16:35,442 --> 16:16:37,952
Số người\nthích The Office là 15.

17073
16:16:39,332 --> 16:16:42,872
Nhưng bây giờ chúng ta hãy tiếp tục và\ncố tình làm xáo trộn dữ liệu một chút.

17074
16:16:42,872 --> 16:16:46,502
Tất cả các bạn đều rất tử tế khi\nđánh máy vào The Office.

17075
16:16:46,502 --> 16:16:48,572
Nhưng bạn có thể tưởng tượng\nai đó vừa gõ Office

17076
16:16:48,572 --> 16:16:51,033
ví dụ, có thể ở đó, có thể ở đó.

17077
16:16:51,033 --> 16:16:53,491
Và nhiều người có thể\nchỉ viết Office, bạn có thể tưởng tượng.

17078
16:16:53,491 --> 16:16:55,741
Đã không xảy ra ở đây, nhưng\giả sử nó đã xảy ra, và có thể

17079
16:16:55,741 --> 16:16:58,631
sẽ có nếu chúng tôi có nhiều\nn bài gửi hơn nữa theo thời gian.

17080
16:16:58,631 --> 16:17:02,341
Bây giờ chúng ta hãy tiếp tục và chạy lại phần này\n

17081
16:17:02,341 --> 16:17:04,471
Giờ chỉ còn 13 người thích The Office.

17082
16:17:05,491 --> 16:17:11,131
Dữ liệu bây giờ là do tôi đã biến đổi nó thành\n

17083
16:17:11,131 --> 16:17:16,391
Làm cách nào tôi có thể thay đổi mã Python của mình thành\n

17084
16:17:16,391 --> 16:17:20,731
Tôi có thể thay đổi điều gì ở đây\nđể cải thiện tình trạng này?

17085
16:17:24,091 --> 16:17:27,641
KHÁN GIẢ: Bạn viết\ntiêu đề [KHÔNG NGHE ĐƯỢC]..

17086
16:17:27,641 --> 16:17:30,391
DAVID J. Malan: Vâng, vậy tôi có thể\n

17087
16:17:30,391 --> 16:17:34,711
Nếu chức danh bằng Văn phòng,\cũng không phải chức danh bằng, chỉ bằng

17088
16:17:35,779 --> 16:17:38,072
Và tôi vẫn không phải\nlo lắng về việc viết hoa.

17089
16:17:38,072 --> 16:17:41,154
Tôi không phải lo lắng về không gian\n

17090
16:17:41,154 --> 16:17:43,542
Bây giờ tôi có thể tiếp tục và chạy lại mã này.

17091
16:17:43,542 --> 16:17:45,332
Hãy để tôi chạy nó lần thứ ba.

17092
16:17:50,552 --> 16:17:54,002
Bạn có thể tưởng tượng điều này\nkhông mở rộng được tốt lắm.

17093
16:17:54,002 --> 16:17:57,105
Avatar có ba thứ khác nhau\n

17094
16:17:57,105 --> 16:17:59,522
nếu chúng ta tìm hiểu sâu hơn thì\ncó thể sẽ có nhiều biến thể hơn.

17095
16:17:59,521 --> 16:18:01,771
Chúng ta có thể làm điều gì đó\ncó mục đích chung hơn một chút không?

17096
16:18:01,771 --> 16:18:03,572
Chà, chúng ta có thể làm điều gì đó như thế này.

17097
16:18:07,224 --> 16:18:09,391
đây là một điều thú vị\nbạn có thể làm với Python.

17098
16:18:09,391 --> 16:18:12,271
Nó rất giống tiếng Anh, chỉ cần đặt\ncâu hỏi, mặc dù ngắn gọn.

17099
16:18:12,271 --> 16:18:16,002
Điều này thật thú vị,\nđã khiến tôi gặp rắc rối.

17100
16:18:16,002 --> 16:18:18,482
Bây giờ, đột nhiên, chúng tôi lên tới 16.

17101
16:18:18,482 --> 16:18:21,594
Có ai biết cái kia là gì không?

17102
16:18:21,593 --> 16:18:23,439
ĐỐI TƯỢNG: Có người đặt V Office.

17103
16:18:23,440 --> 16:18:24,607
DAVID J. Malan: Văn phòng gì?

17104
16:18:24,607 --> 16:18:27,462
ĐỐI TƯỢNG: Ai đó đã vào\na V Office, [KHÔNG NGHE ĐƯỢC]..

17105
16:18:29,858 --> 16:18:31,191
DAVID J. Malan: Ồ, thú vị.

17106
16:18:42,472 --> 16:18:44,811
Được rồi, điều này thực sự khó có thể sửa được.

17107
16:18:44,811 --> 16:18:46,641
Tôi thực sự không thể nghĩ ra một vị tướng--

17108
16:18:46,641 --> 16:18:51,201
chà, đây thực sự là một\nví dụ điển hình về việc dữ liệu trở nên lộn xộn nhanh chóng.

17109
16:18:51,201 --> 16:18:53,421
Và bạn có thể tưởng tượng mình đang làm\nđiều gì đó ở đó, được rồi, chúng tôi

17110
16:18:53,421 --> 16:18:58,261
có thể có khoảng 26 điều kiện nếu ai đó\n

17111
16:18:58,762 --> 16:18:59,992
Bạn có thể tưởng tượng làm điều đó.

17112
16:18:59,991 --> 16:19:02,741
Nhưng sau đó chắc chắn sẽ có\n

17113
16:19:02,741 --> 16:19:04,951
Vì vậy, đó thực sự là một vấn đề khó khắc phục.

17114
16:19:04,951 --> 16:19:10,072
Nhưng hóa ra chúng ta đã gặp may và bây giờ\n

17115
16:19:10,072 --> 16:19:12,002
Nhưng bản thân dữ liệu rất lộn xộn.

17116
16:19:12,002 --> 16:19:15,292
Hãy để tôi chỉ cho bạn một cách khác\n

17117
16:19:15,292 --> 16:19:20,092
Hóa ra là có tính năng này\n

17118
16:19:20,091 --> 16:19:22,381
trong số đó, được gọi là biểu thức chính quy.

17119
16:19:22,381 --> 16:19:24,381
Và đây thực sự là một kỹ thuật\nthực sự mạnh mẽ

17120
16:19:24,381 --> 16:19:26,214
rằng chúng ta sẽ chỉ vạch ra\nbề nổi ở đây.

17121
16:19:26,214 --> 16:19:29,631
Nhưng nó sẽ thực sự hữu ích,\n

17122
16:19:29,631 --> 16:19:34,221
trong lập trình web, bất cứ lúc nào bạn muốn\n

17123
16:19:34,222 --> 16:19:37,252
Và thực ra, để làm rõ\nđiều này, hãy cho tôi một chút

17124
16:19:37,252 --> 16:19:39,502
trước khi tôi chuyển màn hình ở đây.

17125
16:19:39,502 --> 16:19:43,792
Và hãy để tôi mở\nBiểu mẫu Google từ đầu.

17126
16:19:43,792 --> 16:19:47,572
Hãy cho tôi một chút thời gian để\ntạo ra thứ gì đó thật nhanh chóng.

17127
16:19:47,572 --> 16:19:50,601
Nếu bạn chưa từng nhận thấy điều này\ntrước đây khi tạo Biểu mẫu Google

17128
16:19:53,752 --> 16:19:55,701
Và nếu bạn muốn người dùng\n gõ vào một cái gì đó

17129
16:19:55,701 --> 16:19:58,375
rất cụ thể như một câu trả lời\nvăn bản ngắn gọn như thế này

17130
16:19:58,375 --> 16:20:01,042
bạn có thể biết rằng có những nút chuyển đổi\nnhư thế này trong thế giới của Google

17131
16:20:02,271 --> 16:20:04,611
Hoặc bạn có thể thực hiện xác nhận phản hồi.

17132
16:20:04,612 --> 16:20:07,012
Bạn có thể nói, email của bạn là gì?

17133
16:20:07,012 --> 16:20:12,592
Và sau đó bạn có thể nói điều gì đó\nnhư, văn bản là một email.

17134
16:20:12,591 --> 16:20:17,871
Đây là một ví dụ trong Google Biểu mẫu\n

17135
16:20:17,872 --> 16:20:22,492
Nhưng một tính năng có lẽ hầu hết các bạn đều có\n

17136
16:20:22,491 --> 16:20:24,831
cái này có được gọi là\nbiểu thức chính quy không, ở đâu

17137
16:20:24,832 --> 16:20:26,781
bạn thực sự có thể xác định một mẫu.

17138
16:20:26,781 --> 16:20:30,171
Và tôi thực sự có thể thực hiện lại điều đó\n

17139
16:20:30,171 --> 16:20:36,411
Tôi có thể nói, hãy để người dùng nhập bất cứ thứ gì\n

17140
16:20:36,411 --> 16:20:41,941
sau đó là thứ khác, sau đó là\ndấu chấm chẳng hạn

17141
16:20:43,021 --> 16:20:45,291
Vì vậy,\nphải thừa nhận rằng thoạt nhìn thì nó rất khó hiểu.

17142
16:20:45,292 --> 16:20:48,772
Nhưng điều này có nghĩa là bất kỳ\nký tự nào cũng 0 lần nữa.

17143
16:20:48,771 --> 16:20:51,502
Điều này có nghĩa là bất kỳ ký tự nào 0 lần nữa.

17144
16:20:51,502 --> 16:20:54,067
Điều này có nghĩa là một dấu chấm\n theo nghĩa đen, bởi vì rõ ràng

17145
16:20:54,067 --> 16:20:57,502
dấu chấm có nghĩa là bất kỳ ký tự nào trong\nngữ cảnh của các mẫu này.

17146
16:20:57,502 --> 16:21:01,412
Khi đó thứ này có nghĩa là bất kỳ\nký tự nào thêm 0 lần nữa.

17147
16:21:01,411 --> 16:21:04,011
Vì vậy, tôi thực sự nên soi mói hơn một chút.

17148
16:21:04,012 --> 16:21:06,872
Bạn không muốn 0 lần trở lên,\nbạn muốn 1 lần trở lên.

17149
16:21:06,872 --> 16:21:10,682
Vì vậy, điều này có dấu cộng nghĩa là\nbất kỳ ký tự nào 1 lần trở lên.

17150
16:21:10,682 --> 16:21:12,362
Vì vậy, phải có một cái gì đó ở đó.

17151
16:21:12,362 --> 16:21:16,972
Và tôi nghĩ tôi cũng muốn điều tương tự\n

17152
16:21:16,972 --> 16:21:21,502
Hoặc chết tiệt, nếu tôi muốn hạn chế điều này\n

17153
16:21:21,502 --> 16:21:24,862
Tôi có thể thay đổi điều cuối cùng\n đó thành .edu theo đúng nghĩa đen.

17154
16:21:24,862 --> 16:21:26,912
Và câu chuyện quá dài,\mặc dù điều này có vẻ

17155
16:21:26,911 --> 16:21:31,761
Tôi chắc chắn, khá khó hiểu, có\n

17156
16:21:31,762 --> 16:21:35,242
và JavaScript, Java và các thứ khác\n

17157
16:21:35,241 --> 16:21:37,771
các mẫu một cách chuẩn hóa.

17158
16:21:37,771 --> 16:21:41,271
Và mẫu này thực sự là một cái gì đó\n

17159
16:21:41,271 --> 16:21:43,491
Và hãy để tôi chuyển về\nPython trong giây lát

17160
16:21:43,491 --> 16:21:45,261
để thực hiện cùng một loại ý tưởng.

17161
16:21:45,262 --> 16:21:48,292
Hãy để tôi chuyển trở lại mã của tôi ở đây.

17162
16:21:48,292 --> 16:21:52,072
Ví dụ, hãy để tôi đưa ra một\nbản tóm tắt những gì bạn có thể làm.

17163
16:21:52,072 --> 16:21:58,372
Và đây chỉ là bản tóm tắt nhanh\n

17164
16:21:58,372 --> 16:22:04,672
Dấu chấm có thể đại diện cho bất kỳ ký tự nào.\n

17165
16:22:05,311 --> 16:22:08,362
Vì vậy, dấu chấm có nghĩa là bất kỳ thứ gì,\nvì vậy nó có thể là A hoặc không có gì.

17166
16:22:09,502 --> 16:22:14,872
Nó có thể là A, B, A, B, C. Nó có thể là bất kỳ\n

17167
16:22:14,872 --> 16:22:18,202
Thay đổi điều đó thành một điểm cộng và bạn bây giờ\n

17168
16:22:18,201 --> 16:22:21,201
Dấu chấm hỏi nghĩa là\ncó gì đó là tùy chọn.

17169
16:22:21,201 --> 16:22:24,711
Biểu tượng dấu mũ có nghĩa là bắt đầu khớp tại\n

17170
16:22:24,711 --> 16:22:30,442
Ký hiệu đô la có nghĩa là dừng khớp\na ở cuối thông tin nhập của người dùng.

17171
16:22:30,442 --> 16:22:32,552
Vì vậy, chúng ta sẽ không chơi với\ntất cả những thứ này ngay bây giờ.

17172
16:22:32,552 --> 16:22:36,812
Nhưng hãy để tôi qua đây và\thực sự giải quyết vấn đề Office này.

17173
16:22:36,811 --> 16:22:40,792
Hãy để tôi tiếp tục và nhập một thư viện mới\n

17174
16:22:42,622 --> 16:22:45,902
Và sau đó, ở dưới đây, hãy để tôi nói điều này.

17175
16:22:50,421 --> 16:22:55,551
Hãy cùng tìm kiếm Office, trích dẫn,\n

17176
16:22:55,552 --> 16:22:58,072
Sau đó chúng ta sẽ tiếp tục\nvà tăng bộ đếm.

17177
16:22:58,072 --> 16:23:00,381
Vì vậy hóa ra thư viện\nbiểu thức chính quy

17178
16:23:00,381 --> 16:23:04,432
có một chức năng gọi là tìm kiếm\n

17179
16:23:04,432 --> 16:23:07,311
và sau đó, ở phần thứ hai\nargument của chuỗi bạn

17180
16:23:07,311 --> 16:23:09,502
muốn phân tích cho mô hình đó.

17181
16:23:09,502 --> 16:23:13,222
Vì vậy, nó giống như đang tìm kiếm một cái kim\n

17182
16:23:13,222 --> 16:23:17,421
Bây giờ hãy để tôi tiếp tục và chạy\nphiên bản chương trình này, Enter.

17183
16:23:17,421 --> 16:23:21,591
Và bây giờ tôi đã làm hỏng việc vì tôi đã quên\n

17184
16:23:24,491 --> 16:23:27,141
Số người\nthích The Office hiện là 0.

17185
16:23:28,311 --> 16:23:30,981
cảm ơn bạn-- bước thụt lùi lớn.

17186
16:23:36,951 --> 16:23:39,936
Tôi đã buộc tất cả dữ liệu đầu vào của mình phải viết hoa,\n

17187
16:23:39,936 --> 16:23:41,811
Vì vậy, chúng ta sẽ quay lại với\ncác cách tiếp cận khác ở đó.

17188
16:23:42,771 --> 16:23:45,141
Được rồi, bây giờ chúng ta quay lại con số 16.

17189
16:23:45,141 --> 16:23:47,542
Nhưng tôi thậm chí có thể, giả sử--

17190
16:23:47,542 --> 16:23:50,452
Tôi chỉ có thể chịu đựng được The Office.

17191
16:23:50,451 --> 16:23:55,461
Thế còn cái này thì sao, hoặc\nthứ gì đó như Văn phòng thì sao?

17192
16:23:57,714 --> 16:23:59,631
Và hãy để tôi sử dụng những ký tự đặc biệt khác này.

17193
16:23:59,631 --> 16:24:02,721
Dấu mũ này có nghĩa là\nsự bắt đầu của chuỗi.

17194
16:24:02,722 --> 16:24:06,082
Ký hiệu đô la này\nbiểu thị sự kết thúc của chuỗi một cách kỳ lạ.

17195
16:24:06,082 --> 16:24:09,832
Tôi chỉ thêm vào một số dấu ngoặc đơn\n

17196
16:24:11,811 --> 16:24:15,921
Và đây là thông báo bắt đầu khớp\n

17197
16:24:15,921 --> 16:24:20,002
Kiểm tra xem đầu chuỗi có phải là\n không

17198
16:24:21,262 --> 16:24:23,882
Và sau đó, tốt nhất bạn nên ở cuối chuỗi.

17199
16:24:23,881 --> 16:24:26,991
Vì vậy, họ không thể tiếp tục nhập các từ\ntrước hoặc sau lần nhập đó.

17200
16:24:26,991 --> 16:24:29,031
Hãy để tôi tiếp tục và chạy lại chương trình.

17201
16:24:29,031 --> 16:24:32,841
Và bây giờ chúng tôi giảm xuống còn 15,\ntrước đây là câu trả lời đúng của chúng tôi

17202
16:24:32,841 --> 16:24:36,111
nhưng sau đó chúng tôi chú ý đến The V Office.

17203
16:24:38,021 --> 16:24:41,541
Sẽ rắc rối hơn\nđể giải quyết vấn đề đó.

17204
16:24:41,542 --> 16:24:46,897
Sẽ thế nào nếu tôi chấp nhận bất kỳ\nký tự nào được biểu thị bằng dấu chấm

17205
16:24:48,982 --> 16:24:53,452
Bây giờ nếu tôi chạy lại nó thì tôi thực sự có khả năng biểu đạt này.

17206
16:24:53,451 --> 16:24:57,682
Vì vậy, điều này chỉ để nói rằng, có rất nhiều\n

17207
16:24:58,732 --> 16:25:01,292
Và một số công cụ này\nphức tạp hơn những công cụ khác.

17208
16:25:01,292 --> 16:25:04,298
Đây là cái mà bạn thực sự đã\n

17209
16:25:04,298 --> 16:25:06,381
trong bối cảnh của Google\nForms trong nhiều năm nếu bạn

17210
16:25:06,381 --> 16:25:09,112
theo thói quen tạo những thứ này cho\n

17211
16:25:09,112 --> 16:25:11,182
Nhưng bây giờ nó là thứ\nbạn có thể bắt đầu tận dụng.

17212
16:25:11,182 --> 16:25:14,781
Và chúng ta chỉ mới bắt đầu thôi\n

17213
16:25:14,781 --> 16:25:18,981
Nhưng bây giờ chúng ta hãy làm một ví dụ cuối cùng\n

17214
16:25:18,982 --> 16:25:20,872
Và thực ra chúng ta hãy\nviết một chương trình

17215
16:25:20,872 --> 16:25:25,382
mục đích chung hơn một chút\n

17216
16:25:25,381 --> 16:25:27,112
và tìm ra mức độ phổ biến của nó.

17217
16:25:27,112 --> 16:25:29,752
Vì vậy, hãy để tôi tiếp tục và đơn giản hóa điều này.

17218
16:25:29,752 --> 16:25:31,972
Hãy loại bỏ các biểu thức\nthông thường của chúng ta.

17219
16:25:31,972 --> 16:25:35,281
Hãy tiếp tục và tiếp tục\nviết hoa tiêu đề.

17220
16:25:36,921 --> 16:25:41,362
ở phần đầu của chương trình này,\n

17221
16:25:42,722 --> 16:25:45,662
Vì vậy, tiêu đề bằng nhau, hãy\yêu cầu người dùng nhập dữ liệu

17222
16:25:45,661 --> 16:25:48,831
về cơ bản là giống nhau\n

17223
16:25:50,302 --> 16:25:53,512
Và sau đó bất cứ điều gì họ nhập vào,\n

17224
16:25:53,512 --> 16:25:56,242
và viết hoa lại.

17225
16:25:56,241 --> 16:26:01,161
Và bây giờ, bên trong vòng lặp của mình, tôi\ncó thể nói điều gì đó như thế này.

17226
16:26:01,161 --> 16:26:08,001
Nếu tiêu đề của hàng hiện tại sau\n

17227
16:26:08,002 --> 16:26:12,262
nó cũng viết hoa, bằng\ntiêu đề của người dùng, sau đó, hãy tiếp tục

17228
16:26:12,262 --> 16:26:14,781
và có thể tăng một bộ đếm.

17229
16:26:14,781 --> 16:26:16,502
Vì vậy tôi vẫn cần bộ đếm đó trở lại.

17230
16:26:16,502 --> 16:26:21,951
Vậy hãy để tôi tiếp tục và định nghĩa điều này\n

17231
16:26:21,951 --> 16:26:24,061
Và sau đó, vào lúc\ncuối chương trình này

17232
16:26:24,061 --> 16:26:26,391
để tôi tiếp tục và in\không chỉ mức độ phổ biến

17233
16:26:26,391 --> 16:26:28,381
của bất cứ điều gì con người gõ vào.

17234
16:26:28,381 --> 16:26:31,371
Một lần nữa, điểm khác biệt duy nhất là\n

17235
16:26:32,061 --> 16:26:34,491
Tôi đang khởi tạo\nbộ đếm của mình về 0, sau đó tôi

17236
16:26:34,491 --> 16:26:38,002
đang tìm kiếm\ntiêu đề của họ trong tệp CSV

17237
16:26:38,002 --> 16:26:41,152
bằng cách thực hiện thao tác xoa bóp tương tự\n

17238
16:26:41,152 --> 16:26:43,912
và loại bỏ khoảng trắng.

17239
16:26:43,911 --> 16:26:47,121
Vì vậy bây giờ, khi tôi chạy Python\nof favorites.py, hãy nhấn Enter

17240
16:26:47,122 --> 16:26:55,372
Tôi có thể gõ văn phòng toàn chữ thường\n

17241
16:27:02,042 --> 16:27:05,982
Bởi vì tôi là người đã bước vào và\n

17242
16:27:05,982 --> 16:27:08,372
Nếu chúng tôi sửa những lỗi đó, chúng tôi\nsẽ quay lại con số 15.

17243
16:27:08,372 --> 16:27:12,992
Nếu chúng tôi thêm hỗ trợ cho The V\n

17244
16:27:12,991 --> 16:27:15,691
Được rồi, bạn có câu hỏi gì về những thao tác khác nhau này không?

17245
16:27:15,692 --> 16:27:17,525
Và nếu bạn cảm thấy\nnhư, ôi chúa ơi, cái này

17246
16:27:17,525 --> 16:27:20,442
có quá nhiều mã Python để làm\n

17247
16:27:20,442 --> 16:27:22,502
Và thực sự, mặc dù\nit là một ngôn ngữ mạnh mẽ

17248
16:27:22,502 --> 16:27:26,012
và có thể giải quyết những loại vấn đề này,\n

17249
16:27:26,012 --> 16:27:28,812
chỉ để hỏi một câu hỏi như thế này.

17250
16:27:28,811 --> 16:27:32,461
Nhưng có bất kỳ câu hỏi nào về cách chúng tôi đã làm\n

17251
16:27:38,641 --> 16:27:40,141
Chúng ta hãy nghỉ giải lao năm phút ở đây.

17252
16:27:40,141 --> 16:27:42,572
Khi chúng tôi trở lại, chúng tôi sẽ làm tốt hơn.

17253
16:27:43,822 --> 16:27:45,951
Và phần còn lại của ngày hôm nay\ncuối cùng là về việc làm thế nào

17254
16:27:45,951 --> 16:27:50,182
chúng ta có thể lưu trữ, thao tác,\nthay đổi và truy xuất dữ liệu không

17255
16:27:50,182 --> 16:27:53,432
hiệu quả hơn chúng ta có thể\nbằng cách chỉ viết mã thô?

17256
16:27:53,432 --> 16:27:56,781
Điều này không có nghĩa là bạn không nên\n

17257
16:27:57,622 --> 16:28:02,362
Và trên thực tế, nó có thể cực kỳ phổ biến\n

17258
16:28:02,362 --> 16:28:04,415
từ người dùng mà bạn có thể\nmuốn dọn dẹp nó.

17259
16:28:04,415 --> 16:28:07,582
Và có lẽ cách tốt nhất để làm điều đó là\n

17260
16:28:07,582 --> 16:28:09,711
bạn có thể thực hiện tất cả\nnhững thay đổi và sửa lỗi cần thiết

17261
16:28:09,711 --> 16:28:12,864
giống như chúng tôi đã làm với The Office,\nchẳng hạn, hết lần này đến lần khác

17262
16:28:12,864 --> 16:28:15,531
và sử dụng lại mã đó, đặc biệt\nnếu ngày càng có nhiều lượt gửi

17263
16:28:16,491 --> 16:28:18,891
Nhưng cuối cùng, một chủ đề khác của\nhôm nay là

17264
16:28:18,891 --> 16:28:22,980
đôi khi có sự khác biệt,\n

17265
16:28:22,980 --> 16:28:24,772
Và trên thực tế, bây giờ\ntại thời điểm này trong nhiệm kỳ

17266
16:28:24,771 --> 16:28:27,651
khi chúng tôi bắt đầu giới thiệu không chỉ Python mà còn sau đây

17267
16:28:27,652 --> 16:28:31,461
một ngôn ngữ có tên là SQL và tiếp theo\n

17268
16:28:31,461 --> 16:28:34,491
và tuần sau đó, tổng hợp\n

17269
16:28:34,491 --> 16:28:37,761
cùng nhau chỉ là để vẽ ra một bức tranh về cách

17270
16:28:37,762 --> 16:28:41,242
bạn có thể quyết định sự đánh đổi là gì\n

17271
16:28:42,171 --> 16:28:45,112
Bởi vì chắc chắn bạn có thể\ngiải quyết các vấn đề trong tương lai

17272
16:28:45,112 --> 16:28:48,002
theo nhiều cách khác nhau\nvới nhiều công cụ khác nhau.

17273
16:28:48,002 --> 16:28:50,362
Vì vậy, hãy cung cấp cho bạn một\ncông cụ khác, một công cụ có

17274
16:28:50,362 --> 16:28:53,512
bạn có thể triển khai một cơ sở dữ liệu quan hệ\nthích hợp.

17275
16:28:53,512 --> 16:28:56,391
Những gì chúng ta vừa thấy ở\nở dạng tệp CSV

17276
16:28:56,391 --> 16:28:59,152
là những gì chúng ta có thể gọi là cơ sở dữ liệu\ntệp phẳng.

17277
16:28:59,152 --> 16:29:02,842
Một lần nữa, chỉ là một tệp rất đơn giản, phẳng\n

17278
16:29:04,612 --> 16:29:09,622
Và đó cuối cùng là\nviệc lưu trữ văn bản ASCII hoặc Unicode.

17279
16:29:09,622 --> 16:29:12,742
Tuy nhiên, một cơ sở dữ liệu quan hệ\là thứ gì đó thực sự

17280
16:29:12,741 --> 16:29:16,191
gần hơn với một chương trình bảng tính thích hợp.

17281
16:29:16,192 --> 16:29:18,781
CSV là một trang\n riêng lẻ, nếu bạn muốn

17282
16:29:18,781 --> 16:29:20,601
từ một bảng tính khi bạn xuất nó.

17283
16:29:20,601 --> 16:29:22,801
Nếu bạn có nhiều\ntrang tính trong một bảng tính

17284
16:29:22,802 --> 16:29:24,937
bạn sẽ phải xuất nhiều CSV.

17285
16:29:24,936 --> 16:29:26,811
Và điều đó sẽ gây khó chịu\nnhanh chóng trong mã nếu bạn

17286
16:29:26,811 --> 16:29:29,331
phải mở CSV này,\nCSV này, tất cả đều

17287
16:29:29,332 --> 16:29:32,421
thể hiện các trang tính hoặc\ntab khác nhau trong một bảng tính thích hợp.

17288
16:29:32,421 --> 16:29:36,862
Cơ sở dữ liệu quan hệ\ngiống một chương trình bảng tính hơn

17289
16:29:36,862 --> 16:29:39,982
mà bạn, một lập trình viên,\nhiện có thể tương tác.

17290
16:29:41,482 --> 16:29:45,022
Bạn có thể đọc dữ liệu từ nó và bạn\n

17291
16:29:45,021 --> 16:29:47,491
bảng lưu trữ tất cả dữ liệu của bạn.

17292
16:29:47,491 --> 16:29:49,581
Vì vậy, trong khi Excel và các con số\nin bảng tính Google

17293
16:29:49,582 --> 16:29:52,432
thực sự được con người tái sử dụng\n

17294
16:29:52,432 --> 16:29:55,192
nhấp chuột, trỏ và\nthao tác mọi thứ bằng đồ họa

17295
16:29:55,192 --> 16:29:57,502
một cơ sở dữ liệu quan hệ\nsử dụng một ngôn ngữ có tên là

17296
16:29:57,502 --> 16:30:02,662
SQL là một trong đó người lập trình có khả năng tương tự

17297
16:30:04,341 --> 16:30:08,061
Cụ thể là sử dụng một ngôn ngữ\nđược gọi là SQL và ở quy mô

17298
16:30:08,061 --> 16:30:11,011
điều đó lớn hơn nhiều\nso với chỉ bảng tính.

17299
16:30:11,012 --> 16:30:13,762
Thực tế, nếu bạn thử trên máy Mac\n

17300
16:30:13,762 --> 16:30:16,432
có hàng chục nghìn\nhàng, có thể nó sẽ

17301
16:30:16,432 --> 16:30:20,122
hoạt động tốt, hàng trăm nghìn\n

17302
16:30:20,122 --> 16:30:22,342
Tại một thời điểm nào đó, máy Mac hoặc\nPC của bạn sẽ gặp khó khăn

17303
16:30:22,341 --> 16:30:24,471
để mở các tập dữ liệu đặc biệt lớn.

17304
16:30:24,472 --> 16:30:26,961
Và đó cũng là nơi\ncơ sở dữ liệu thích hợp xuất hiện

17305
16:30:26,961 --> 16:30:29,481
được áp dụng và\nngôn ngữ thích hợp cho cơ sở dữ liệu đã xuất hiện

17306
16:30:29,482 --> 16:30:31,462
vào cuộc khi tất cả là về quy mô.

17307
16:30:31,461 --> 16:30:34,731
Và thực sự, hầu hết mọi ứng dụng dành cho thiết bị di động hoặc\n

17308
16:30:34,732 --> 16:30:38,762
có thể viết có lẽ nên lập kế hoạch\n

17309
16:30:38,762 --> 16:30:41,072
Vì vậy, chúng ta cần những công cụ\nphù hợp cho vấn đề đó.

17310
16:30:41,072 --> 16:30:44,451
Thật may mắn thay, mặc dù chúng ta\n

17311
16:30:44,451 --> 16:30:49,701
về cơ bản nó chỉ làm bốn việc,\n

17312
16:30:49,701 --> 16:30:53,211
SQL, ngôn ngữ này dành cho\ncơ sở dữ liệu, hỗ trợ khả năng

17313
16:30:53,211 --> 16:30:57,741
để tạo dữ liệu, đọc dữ liệu,\ncập nhật dữ liệu và xóa dữ liệu.

17314
16:30:58,762 --> 16:31:02,031
Còn một vài từ khóa nữa\n

17315
16:31:03,091 --> 16:31:04,799
Nhưng vào cuối\nngày, ngay cả khi bạn

17316
16:31:04,800 --> 16:31:07,522
bắt đầu cảm thấy như thế này\nis rất nhanh

17317
16:31:07,521 --> 16:31:10,281
tất cả đều tập trung vào\nbốn thao tác cơ bản này.

17318
16:31:10,281 --> 16:31:12,981
Và bốn lệnh\nin SQL, nếu bạn muốn

17319
16:31:12,982 --> 16:31:17,122
hoạt động theo nghĩa thực hiện\n

17320
16:31:17,122 --> 16:31:19,612
Chúng gần như giống nhau nhưng\ncó một chút khác biệt.

17321
16:31:19,612 --> 16:31:24,622
Khả năng tạo hoặc chèn dữ liệu\n

17322
16:31:27,472 --> 16:31:30,389
Xóa cũng vậy, nhưng drop\nis cũng là một từ khóa.

17323
16:31:30,389 --> 16:31:32,182
Vì vậy, chúng ta sẽ thấy những từ khóa này và\na một vài từ khóa khác

17324
16:31:32,182 --> 16:31:35,752
trong SQL, vào cuối ngày, chỉ\n

17325
16:31:35,752 --> 16:31:39,652
dữ liệu bằng cách sử dụng động từ, nếu\nbạn muốn, như thế này.

17326
16:31:39,652 --> 16:31:43,372
Vậy để làm được điều đó,\ncú pháp sẽ như thế nào?

17327
16:31:43,372 --> 16:31:45,632
Chà, chúng ta sẽ không đi sâu vào\nđi quá nhanh về vấn đề này.

17328
16:31:45,631 --> 16:31:47,991
Nhưng đây là\ncú pháp điển hình về cách

17329
16:31:47,991 --> 16:31:51,051
bạn có thể tạo bằng cách sử dụng\nngôn ngữ này có tên là SQL, theo cách riêng của bạn

17330
16:31:51,052 --> 16:31:53,362
cơ sở dữ liệu riêng, một bảng hoàn toàn mới.

17331
16:31:53,362 --> 16:31:56,252
Việc này thật dễ dàng trong Excel và Google\n

17332
16:31:56,252 --> 16:31:58,252
Bạn muốn một trang tính mới, bạn\nnhấp vào nút dấu cộng.

17333
16:31:59,031 --> 16:32:00,832
Bạn đặt tên cho nó,\nvà bùm, bạn đã hoàn tất.

17334
16:32:00,832 --> 16:32:05,391
Tuy nhiên, trong thế giới lập trình, nếu\n

17335
16:32:05,391 --> 16:32:08,781
bảng tính trong bộ nhớ của máy tính,\n

17336
16:32:08,781 --> 16:32:13,762
giống như một tờ giấy, có tên và sau đó\n

17337
16:32:13,762 --> 16:32:17,332
Nhưng không giống như Bảng tính Google,\nand Apple Numbers và Excel

17338
16:32:17,332 --> 16:32:20,415
với tư cách là người lập trình, bạn phải quyết định loại dữ liệu nào

17339
16:32:20,415 --> 16:32:22,582
bạn sẽ lưu trữ\nin từng cột này.

17340
16:32:22,582 --> 16:32:24,772
Bây giờ, mặc dù Excel,\nvà Bảng tính Google

17341
16:32:24,771 --> 16:32:28,651
và Numbers cho phép bạn định dạng\n

17342
16:32:28,652 --> 16:32:33,022
đó không phải là dữ liệu được gõ mạnh như nó\n

17343
16:32:33,021 --> 16:32:35,541
Và chết tiệt, ngay cả trong Python\ncũng có các kiểu dữ liệu cơ bản.

17344
16:32:35,542 --> 16:32:37,500
Ngay cả khi bạn không cần\ngõ chúng một cách rõ ràng

17345
16:32:37,500 --> 16:32:40,241
cơ sở dữ liệu sẽ muốn\nbiết, bạn có đang lưu trữ số nguyên không?

17346
16:32:40,241 --> 16:32:41,981
Bạn đang lưu trữ số thực hay số float?

17347
16:32:43,482 --> 16:32:46,302
Bởi vì đặc biệt khi\ndữ liệu của bạn mở rộng, càng có nhiều gợi ý

17348
16:32:46,302 --> 16:32:49,752
bạn cung cấp cơ sở dữ liệu về\n của bạn

17349
16:32:49,752 --> 16:32:52,841
nó càng giúp bạn truy cập và lưu trữ dữ liệu đó nhanh hơn.

17350
16:32:52,841 --> 16:32:54,644
Vì vậy, các loại sắp trở lại\nquan trọng

17351
16:32:54,644 --> 16:32:57,101
nhưng may mắn thay, sẽ không có nhiều người như vậy.

17352
16:32:57,101 --> 16:32:59,981
Bây giờ làm cách nào tôi có thể chuyển đổi,\nví dụ, một số dữ liệu thực

17353
16:32:59,982 --> 16:33:02,832
bạn thích điều đó,\ntập tin favorites.csv của tôi

17354
16:33:02,832 --> 16:33:04,781
vào một cơ sở dữ liệu quan hệ thích hợp?

17355
16:33:04,781 --> 16:33:07,991
Chà, hóa ra\nsử dụng SQL tôi có thể làm được điều này

17356
16:33:07,991 --> 16:33:10,601
trong Mã VS trên máy Mac,\cũng như PC của tôi hoặc trên đám mây

17357
16:33:10,601 --> 16:33:13,796
ở đây chỉ bằng cách nhập\nCSV vào cơ sở dữ liệu.

17358
16:33:13,796 --> 16:33:15,671
Cuối cùng chúng ta sẽ thấy\ncách thực hiện việc này một cách thủ công.

17359
16:33:15,671 --> 16:33:17,963
Hiện tại, tôi sẽ sử dụng\nnhiều quy trình tự động hơn.

17360
16:33:17,963 --> 16:33:20,021
Vì vậy, hãy để tôi chuyển sang Mã VS ở đây.

17361
16:33:20,021 --> 16:33:22,511
Hãy để tôi gõ ls để xem\nnơi chúng ta đã dừng lại trước đó.

17362
16:33:22,512 --> 16:33:26,347
Tôi có hai tệp favorites.csv,\n

17363
16:33:26,347 --> 16:33:27,972
Hãy nhớ lại rằng tôi đã thực hiện một vài thay đổi.

17364
16:33:27,972 --> 16:33:31,391
Chúng tôi đã xóa một vài Luận văn\nkhỏi tệp dành cho Văn phòng.

17365
16:33:31,391 --> 16:33:33,942
Nhưng đây chính là tập tin\nas trước đó, và sau đó chúng tôi

17366
16:33:33,942 --> 16:33:36,552
có favorites.py,\nchúng tôi sẽ tạm gác nó sang một bên.

17367
16:33:36,552 --> 16:33:40,212
Bây giờ tôi sẽ tiếp tục\nvà chạy lệnh SQLite3.

17368
16:33:40,211 --> 16:33:43,362
Vì vậy, trong thế giới\ncơ sở dữ liệu quan hệ, có

17369
16:33:43,362 --> 16:33:48,372
có nhiều sản phẩm khác nhau,\nnhiều phần mềm khác nhau

17370
16:33:48,372 --> 16:33:50,711
thực hiện ngôn ngữ SQL.

17371
16:33:51,942 --> 16:33:55,422
Có một thứ gọi là MySQL\n

17372
16:33:55,421 --> 16:33:57,461
Ví dụ: Facebook\nđã sử dụng nó từ rất sớm.

17373
16:33:57,461 --> 16:34:00,372
PostgreSQL, Microsoft\nAccess Server, Oracle

17374
16:34:00,372 --> 16:34:02,300
và có thể cả đống\ntên sản phẩm khác

17375
16:34:02,300 --> 16:34:04,092
bạn có thể đã từng gặp phải\n lần nữa, điều này

17376
16:34:04,091 --> 16:34:08,322
nghĩa là có nhiều\nloại công cụ và máy chủ khác nhau

17377
16:34:08,322 --> 16:34:10,332
và phần mềm mà bạn có thể sử dụng SQL.

17378
16:34:10,332 --> 16:34:13,122
Chúng ta sẽ sử dụng một thứ rất nhẹ\n

17379
16:34:14,711 --> 16:34:17,021
Đây thường là phiên bản của\nSQL

17380
16:34:17,021 --> 16:34:19,361
được sử dụng trên iPhone và\nthiết bị Android ngày nay.

17381
16:34:19,362 --> 16:34:22,272
Nếu bạn tải xuống một ứng dụng lưu trữ\ndữ liệu như danh bạ của chính bạn

17382
16:34:22,271 --> 16:34:24,341
thường được lưu trữ bằng SQLite.

17383
16:34:24,341 --> 16:34:28,051
Vì nó khá nhẹ nên\n

17384
16:34:28,052 --> 16:34:31,152
hàng nghìn, thậm chí hàng chục\nng nghìn mẩu dữ liệu

17385
16:34:31,152 --> 16:34:33,312
thậm chí sử dụng\nphiên bản nhẹ này của nó.

17386
16:34:33,311 --> 16:34:36,131
SQLite3 giống như phiên bản 3 của công cụ này.

17387
16:34:36,131 --> 16:34:41,682
Chúng ta sẽ tiếp tục và chạy SQLite3\n

17388
16:34:41,682 --> 16:34:45,461
Đó là điều bình thường trong thế giới\n

17389
16:34:45,461 --> 16:34:47,832
Tôi sẽ tạo một\ncơ sở dữ liệu tên là favorites.db.

17390
16:34:47,832 --> 16:34:52,351
Khi tôi đã tham gia chương trình, bây giờ tôi\n

17391
16:34:52,351 --> 16:34:54,101
Một lần nữa, không phải thứ gì\nbạn phải ghi nhớ

17392
16:34:54,101 --> 16:34:55,809
chỉ là thứ bạn\ncó thể tra cứu khi cần.

17393
16:34:55,809 --> 16:34:59,441
Sau đó, tôi sẽ truy cập\nimport favorites.csv

17394
16:34:59,442 --> 16:35:05,602
vào một bảng, tức là một trang tính, nếu\n

17395
16:35:05,601 --> 16:35:09,371
Bây giờ tôi sẽ nhấn Enter và tôi\n

17396
16:35:10,991 --> 16:35:13,511
Bây giờ tôi có ba tập tin\trong thư mục hiện tại của mình--

17397
16:35:13,512 --> 16:35:17,472
tệp CSV, tệp Python\ntừ trước và bây giờ là favorites.db.

17398
16:35:17,472 --> 16:35:21,522
Nhưng nếu tôi làm đúng, tất cả\n

17399
16:35:21,521 --> 16:35:25,182
hiện đã được tải vào một\ncơ sở dữ liệu thích hợp nơi tôi có thể sử dụng

17400
16:35:25,182 --> 16:35:28,521
ngôn ngữ SQL này để truy cập vào nó.

17401
16:35:28,521 --> 16:35:33,072
Vì vậy, hãy tiếp tục và chạy SQLite3\n

17402
16:35:33,072 --> 16:35:35,982
Và bây giờ, tại dấu nhắc SQLite\ntôi có thể bắt đầu

17403
16:35:35,982 --> 16:35:38,502
để xem thử và\nxem dữ liệu này là gì.

17404
16:35:38,502 --> 16:35:41,951
Ví dụ: tôi có thể\nxem bằng cách gõ .schema

17405
16:35:41,951 --> 16:35:44,703
lược đồ\ndữ liệu của tôi là gì, thiết kế là gì.

17406
16:35:44,703 --> 16:35:47,411
Bây giờ không còn suy nghĩ nào được đưa vào\n

17407
16:35:47,411 --> 16:35:49,241
bởi vì tôi đã tự động hóa toàn bộ quá trình.

17408
16:35:49,241 --> 16:35:52,091
Khi chúng tôi bắt đầu tạo cơ sở dữ liệu của riêng mình, chúng tôi sẽ

17409
16:35:52,091 --> 16:35:55,091
suy nghĩ nhiều hơn về dữ liệu\n

17410
16:35:55,091 --> 16:35:59,561
Nhưng chúng ta có thể thấy SQLite\nđược cho là tôi muốn

17411
16:35:59,561 --> 16:36:01,871
bằng cách nhập dữ liệu theo mặc định.

17412
16:36:01,872 --> 16:36:06,461
Lệnh nhập đã làm gì cho tôi\n

17413
16:36:06,461 --> 16:36:09,851
Nó tự động hóa quá trình tạo\n

17414
16:36:11,112 --> 16:36:14,322
Và sau đó để ý, trong ngoặc đơn\nit cho tôi ba cột--

17415
16:36:14,322 --> 16:36:18,701
dấu thời gian, tiêu đề và thể loại\n

17416
16:36:18,701 --> 16:36:21,341
Cả ba đều đã được quy định là văn bản.

17417
16:36:21,341 --> 16:36:24,521
Xin nhắc lại, khi cảm thấy thoải mái hơn\nchúng ta sẽ tạo bảng của riêng mình

17418
16:36:24,521 --> 16:36:26,351
chọn loại và tên cột của riêng chúng tôi.

17419
16:36:26,351 --> 16:36:28,691
Nhưng hiện tại, tôi chỉ tự động hóa\ntoàn bộ quá trình

17420
16:36:28,692 --> 16:36:33,461
để giúp chúng ta bắt đầu bằng cách sử dụng lệnh nhập\ncó sẵn này.

17421
16:36:34,152 --> 16:36:36,972
Vậy bây giờ tôi có thể bắt đầu làm gì?

17422
16:36:36,972 --> 16:36:42,252
Chà, ví dụ như nếu tôi muốn,\n

17423
16:36:42,252 --> 16:36:44,936
Tôi có thể thực thi một vài lệnh khác nhau.

17424
16:36:48,341 --> 16:36:53,762
Hãy để tôi tìm cái phù hợp ở đây--\không cái nào trong số đó sẽ được chọn.

17425
16:36:53,762 --> 16:36:56,951
Hãy chọn trở thành một trong những\ncông cụ linh hoạt nhất của chúng tôi

17426
16:36:56,951 --> 16:36:58,521
để chọn dữ liệu từ cơ sở dữ liệu này.

17427
16:36:58,521 --> 16:37:01,061
Vì vậy, nếu tôi có ba\ncột này ở đây-- dấu thời gian

17428
16:37:01,061 --> 16:37:04,362
tiêu đề và thể loại, giả sử tôi muốn chọn tất cả các tiêu đề.

17429
16:37:04,362 --> 16:37:09,131
Làm điều đó sớm hơn trong Python\nbắt buộc phải nhập thư viện CSV

17430
16:37:09,131 --> 16:37:14,081
mở tệp, tạo trình đọc hoặc\n

17431
16:37:14,082 --> 16:37:16,842
thêm mọi tiêu đề vào từ điển\cũng như không chỉ in nó ra

17432
16:37:17,652 --> 16:37:20,512
Có khoảng hơn chục dòng mã khi chúng tôi mới bắt đầu.

17433
16:37:22,182 --> 16:37:26,561
Chọn tiêu đề từ\nyêu thích, dấu chấm phẩy, xong.

17434
16:37:26,561 --> 16:37:30,911
Vì vậy bây giờ, với điều cụ thể này\n

17435
16:37:30,911 --> 16:37:34,271
và nó đang mô phỏng hình dáng của nó\n

17436
16:37:36,211 --> 16:37:39,421
Chọn tiêu đề từ\nyêu thích là sự chắt lọc

17437
16:37:39,421 --> 16:37:42,871
bằng một ngôn ngữ khác có tên\nSQL của tất cả các dòng mã

17438
16:37:42,872 --> 16:37:46,082
Tôi đã viết từ rất sớm khi chúng ta lần đầu tiên\n

17439
16:37:46,082 --> 16:37:50,882
Do đó SQL được tối ưu hóa cho\n

17440
16:37:50,881 --> 16:37:52,841
và cuối cùng là xóa dữ liệu.

17441
16:37:52,841 --> 16:37:56,041
Vậy có lẽ đây là công cụ tốt hơn\n

17442
16:37:56,042 --> 16:37:59,372
Chuyển nó sang một định dạng\nmạnh mẽ hơn, linh hoạt hơn

17443
16:37:59,372 --> 16:38:02,569
có thể cho phép bạn hoàn thành\nnhiều công việc nhanh chóng hơn

17444
16:38:02,569 --> 16:38:04,112
mà không cần phải phát minh lại bánh xe.

17445
16:38:04,112 --> 16:38:06,851
Ai đó đã tìm ra\ncách chọn dữ liệu như thế này.

17446
16:38:09,101 --> 16:38:12,391
Thôi để tôi kéo tiếp\n

17447
16:38:14,732 --> 16:38:19,182
Hãy cho tôi một giây để tìm thấy điều này.

17448
16:38:19,182 --> 16:38:23,432
Vì vậy, giả sử bây giờ tôi muốn chọn\ndata mạnh hơn một chút.

17449
16:38:23,432 --> 16:38:25,561
Vì vậy, đây là những gì tôi vừa\nthực hiện theo cách chuẩn mực.

17450
16:38:25,561 --> 16:38:27,061
Vì vậy, chọn thường hoạt động như thế này.

17451
16:38:27,061 --> 16:38:31,201
Bạn chọn các cột từ một\nbảng cụ thể, dấu chấm phẩy.

17452
16:38:31,201 --> 16:38:33,601
Thật không may,\ndấu chấm phẩy ngu ngốc đã quay trở lại.

17453
16:38:33,601 --> 16:38:38,051
Chọn các cột từ bảng rồi, là\n

17454
16:38:38,052 --> 16:38:42,463
Cụ thể hơn, tôi đã chọn một\n

17455
16:38:42,463 --> 16:38:43,921
Favorites là tên của bảng.

17456
16:38:45,031 --> 16:38:48,781
Giả sử tôi muốn có được hai thứ, như\n

17457
16:38:48,781 --> 16:38:53,762
Thay vào đó tôi có thể chọn tiêu đề,\ndấu phẩy, thể loại từ mục yêu thích

17458
16:38:53,762 --> 16:38:55,562
rồi dấu chấm phẩy và nhấn Enter.

17459
16:38:55,561 --> 16:38:57,451
Nó sẽ trông hơi xấu trên màn hình của tôi

17460
16:38:57,451 --> 16:38:59,011
bởi vì một số tựa game này và--

17461
16:38:59,012 --> 16:39:02,641
Được rồi, một trong số các bạn thực sự rất tâm đắc với Cộng đồng.

17462
16:39:02,641 --> 16:39:06,002
Bạn có thể thấy rằng nó\nđược gói một cách xấu xí

17463
16:39:06,002 --> 16:39:08,641
nhưng nó vừa mới\nhiển thị cho tôi hai cột.

17464
16:39:08,641 --> 16:39:12,182
Nếu chúng ta cuộn lên trên cùng\nmột lần nữa, phần lớn bên trái của một

17465
16:39:12,182 --> 16:39:13,622
Black Mirror cũng đã nỗ lực hết mình.

17466
16:39:14,491 --> 16:39:17,341
Và bây giờ, được rồi, chúng ta sẽ\nphải dọn dẹp một số thứ này.

17467
16:39:17,341 --> 16:39:19,456
Game of Thrones, một bộ phim hài hay, vâng.

17468
16:39:22,891 --> 16:39:24,822
Tiếp tục đi, tiếp tục đi, tiếp tục đi.

17469
16:39:24,822 --> 16:39:28,211
Vì vậy, bây giờ chúng tôi đã chọn được hai trong số\ncột mà chúng tôi quan tâm.

17470
16:39:28,711 --> 16:39:31,722
Được rồi, nó rất rộng vì\ntất cả các thể loại đó.

17471
16:39:31,722 --> 16:39:34,476
Nhưng nó cho phép tôi chọn\chính xác dữ liệu tôi muốn.

17472
16:39:34,476 --> 16:39:37,351
Tuy nhiên, chúng ta hãy quay lại tiêu đề,\n

17473
16:39:39,091 --> 16:39:43,651
Chẳng hạn, hóa ra là sử dụng\n

17474
16:39:45,241 --> 16:39:48,184
Bạn có rất nhiều chức năng, tương tự\n

17475
16:39:48,184 --> 16:39:49,351
nơi bạn có thể có công thức.

17476
16:39:49,351 --> 16:39:51,661
SQL cung cấp cho bạn một số\ncác phương pháp chẩn đoán tương tự

17477
16:39:51,661 --> 16:39:55,691
cho phép bạn áp dụng các thao tác\nnhư thế này trên toàn bộ các cột.

17478
16:39:55,692 --> 16:39:58,262
Ví dụ: bạn có thể lấy\ntrung bình, đếm tổng số

17479
16:39:58,262 --> 16:40:01,351
lấy các giá trị riêng biệt, bắt buộc\n

17480
16:40:02,561 --> 16:40:04,951
Vì vậy, hãy thử phân biệt chẳng hạn.

17481
16:40:04,951 --> 16:40:08,791
Hãy để tôi quay lại Terminal của mình\nvà giả sử, hãy chọn

17482
16:40:08,792 --> 16:40:14,101
còn các tiêu đề riêng biệt\ntừ bảng yêu thích thì sao?

17483
16:40:14,855 --> 16:40:16,772
Tôi không buồn chọn\nthể loại vì tôi

17484
16:40:16,771 --> 16:40:18,104
muốn nó đẹp hơn một chút.

17485
16:40:18,105 --> 16:40:23,432
Và bạn có thể thấy ở đây chúng tôi chỉ có những chức danh riêng biệt

17486
16:40:23,432 --> 16:40:25,889
ngoại trừ các vấn đề về định dạng.

17487
16:40:25,889 --> 16:40:27,722
Vì vậy, khoảng trắng\nsẽ lại là một vấn đề.

17488
16:40:27,722 --> 16:40:29,555
Viết hoa\nsẽ lại trở thành vấn đề.

17489
16:40:30,572 --> 16:40:34,622
Một trong những điều tôi đang làm trong Python\n

17490
16:40:34,622 --> 16:40:36,272
và sau đó loại bỏ khoảng trắng.

17491
16:40:36,271 --> 16:40:37,741
Nhưng chúng ta có thể kết hợp một số trong số này.

17492
16:40:37,741 --> 16:40:40,682
Tôi có thể làm điều gì đó như\nép mọi tiêu đề thành chữ hoa

17493
16:40:40,682 --> 16:40:41,849
sau đó nhận được giá trị khác biệt.

17494
16:40:41,849 --> 16:40:44,724
Và điều đó thực sự sẽ xảy ra\n

17495
16:40:44,724 --> 16:40:47,202
Và một lần nữa, tôi đã làm tất cả chỉ bằng\nmột dòng đơn giản và nhanh chóng.

17496
16:40:47,201 --> 16:40:49,368
Vì vậy, hãy để tôi kéo lên ở\ncuối màn hình một lần nữa.

17497
16:40:49,368 --> 16:40:53,432
Tôi đã chọn các tựa đề\ntrên khác biệt từ các mục yêu thích

17498
16:40:53,432 --> 16:40:56,412
và điều đó đã giúp\ntôi mọi thứ cùng một lúc chỉ trong một hơi thở.

17499
16:40:56,411 --> 16:40:58,981
Giả sử tôi muốn lấy tổng\nsố lượng đầu sách.

17500
16:40:58,982 --> 16:41:05,492
Còn về việc chọn số lượng\ncác tựa sách đó từ mục yêu thích thì sao?

17501
16:41:05,491 --> 16:41:09,331
Dấu chấm phẩy, Enter và bây giờ\nbạn sẽ lấy lại một bảng nhỏ

17502
16:41:09,332 --> 16:41:13,302
chỉ chứa câu trả lời\ncủa bạn, 158 trong trường hợp này.

17503
16:41:13,302 --> 16:41:15,902
Vậy đó là tổng\nsố, không khác biệt

17504
16:41:15,902 --> 16:41:18,031
nhưng tổng số tiêu đề\nchúng tôi có trong tệp.

17505
16:41:18,031 --> 16:41:21,902
Và chúng ta có thể tiếp tục thao túng\n

17506
16:41:23,792 --> 16:41:26,891
Nhưng chúng tôi cũng có thể thực hiện những\nlọc bổ sung.

17507
16:41:26,891 --> 16:41:32,351
Chúng tôi cũng có thể xác định lựa chọn của mình bằng cách\n

17508
16:41:32,351 --> 16:41:35,972
Vì vậy, giống như trong Scratch, C và\n

17509
16:41:35,972 --> 16:41:41,612
bạn cũng có thể có điều tương tự trong SQL,\n

17510
16:41:44,732 --> 16:41:46,682
Giống như cho phép tôi làm gần đúng.

17511
16:41:46,682 --> 16:41:48,842
Nếu tôi muốn nhận thứ gì đó\nchẳng hạn như The Office

17512
16:41:48,841 --> 16:41:51,661
nhưng không nhất thiết\nT-H-E, không gian, Office

17513
16:41:51,661 --> 16:41:54,781
Tôi có thể thực hiện khớp mẫu\n bằng cách sử dụng như ở đây.

17514
16:41:54,781 --> 16:41:58,512
Sắp xếp theo, giới hạn và nhóm theo\n

17515
16:41:58,512 --> 16:42:01,322
Vì vậy, hãy để tôi quay lại và thực hiện một vài điều ở đây.

17516
16:42:01,322 --> 16:42:07,951
Thế thì sao, để tôi lấy, ồ, tôi không\n

17517
16:42:07,951 --> 16:42:10,189
nhưng giới hạn ở 10 kết quả.

17518
16:42:10,190 --> 16:42:13,232
Đó có thể là một điều hữu ích\n

17519
16:42:13,232 --> 16:42:15,452
thay vào đó là dữ liệu ở trên cùng.

17520
16:42:15,451 --> 16:42:21,871
Thế còn, hãy chọn tất cả các tiêu đề\n

17521
16:42:21,872 --> 16:42:25,052
giống như, trích dẫn, bỏ trích dẫn, "Văn phòng?

17522
16:42:25,052 --> 16:42:28,082
Và điều này sẽ chỉ cho tôi hai câu trả lời.

17523
16:42:28,082 --> 16:42:32,522
Nhớ lại đó là hai hàng mà tôi\n

17524
16:42:32,521 --> 16:42:37,221
Lưu ý rằng like cũng cho phép tôi\không chấp nhận chữ hoa và chữ thường.

17525
16:42:37,222 --> 16:42:40,222
Bởi vì nếu thay vào đó\ntôi chỉ sử dụng dấu bằng

17526
16:42:40,222 --> 16:42:46,402
và trong SQL, một dấu bằng\ntrên thực tế có nghĩa là bằng nhau.

17527
16:42:46,402 --> 16:42:48,711
Để so sánh,\nit không làm bài tập.

17528
16:42:48,711 --> 16:42:51,411
Đây không phải là cách bạn gán dữ liệu trong SQL.

17529
16:42:51,411 --> 16:42:53,281
Tôi đã trở lại không có câu trả lời ở đó.

17530
16:42:53,281 --> 16:42:56,961
Vì vậy, thực sự, dấu bằng\nis cho tôi câu trả lời theo nghĩa đen

17531
16:42:56,961 --> 16:42:59,332
nó chỉ tìm kiếm những gì tôi đã gõ vào.

17532
16:42:59,332 --> 16:43:00,711
Làm thế nào tôi có thể có được tất cả những thứ này?

17533
16:43:00,711 --> 16:43:04,432
Chà, tinh thần tương tự như thường lệ\n

17534
16:43:04,432 --> 16:43:06,961
trong SQL, tôi có thể làm điều gì đó như thế này.

17535
16:43:06,961 --> 16:43:10,671
Tôi có thể chọn tiêu đề từ mục yêu thích\n

17536
16:43:12,052 --> 16:43:17,792
Nhưng tôi có thể thêm vào, hơi kỳ lạ một chút, phần trăm\n

17537
16:43:17,792 --> 16:43:23,272
Vì vậy, ngôn ngữ SQL hỗ trợ khái niệm\ntương tự về khớp mẫu

17538
16:43:23,271 --> 16:43:24,888
nhưng hạn chế hơn nhiều.

17539
16:43:24,889 --> 16:43:26,722
Nếu chúng ta muốn các biểu thức chính quy\nmạnh mẽ hơn

17540
16:43:26,722 --> 16:43:28,762
có lẽ chúng tôi muốn\nsử dụng Python để thay thế.

17541
16:43:28,762 --> 16:43:32,062
Nhưng dấu phần trăm ở đây\ncó nghĩa là 0 ký tự trở lên

17542
16:43:32,061 --> 16:43:34,682
ở bên trái, 0\nký tự trở lên ở bên phải.

17543
16:43:34,682 --> 16:43:39,802
Vì vậy, điều này sẽ chỉ lấy bất kỳ tiêu đề nào\n

17544
16:43:40,442 --> 16:43:44,632
Và bây giờ, có vẻ như tôi lại nhận được tất cả 16 kết quả đó.

17545
16:43:45,832 --> 16:43:48,502
Chà, tôi có thể đếm\nsố lượng những tựa game đó

17546
16:43:48,502 --> 16:43:51,482
và thay vào đó hãy nhận lại câu trả lời đó\n.

17547
16:43:51,482 --> 16:43:54,982
Một lần nữa, cần phải làm quen với từ vựng

17548
16:43:54,982 --> 16:43:56,315
và cú pháp mà bạn có thể sử dụng.

17549
16:43:56,315 --> 16:43:58,024
Có những khối nhà\nnày và những khối khác.

17550
16:43:58,023 --> 16:44:00,841
Nhưng một lần nữa, SQL thực sự được thiết kế,\n

17551
16:44:01,822 --> 16:44:06,421
Ví dụ, tôi chưa bao giờ thực sự\n

17552
16:44:06,421 --> 16:44:12,201
Vì vậy, ngay bây giờ nếu tôi chọn,\nthì tiêu đề từ mục yêu thích sẽ như thế nào

17553
16:44:12,201 --> 16:44:18,682
nơi tiêu đề thích, trích dẫn, bỏ trích dẫn,\n

17554
16:44:18,682 --> 16:44:20,671
Chúng ta có thể thấy rằng có cả đống chúng.

17555
16:44:21,862 --> 16:44:23,302
Chúng ta hãy đếm nhanh nhé.

17556
16:44:25,232 --> 16:44:28,642
Vâng, xóa khỏi mục yêu thích.

17557
16:44:28,641 --> 16:44:35,841
Được rồi, bạn và tôi, xóa khỏi mục yêu thích,\n

17558
16:44:35,841 --> 16:44:39,621
Dường như không có gì xảy ra,\nnhưng tạm biệt các Bạn.

17559
16:44:44,451 --> 16:44:46,731
Vì vậy, bây giờ chúng tôi thực sự đã thay đổi dữ liệu.

17560
16:44:46,732 --> 16:44:50,452
Và đây chính là điều hấp dẫn\nvề một cơ sở dữ liệu phù hợp.

17561
16:44:50,451 --> 16:44:54,661
Có, về mặt kỹ thuật bạn có thể viết Python\n

17562
16:44:55,881 --> 16:44:58,161
Bạn có thể thay đổi bằng cách sử dụng trích dẫn,\nunquote, "A" để nối thêm

17563
16:44:58,161 --> 16:45:01,251
hoặc trích dẫn, bỏ trích dẫn, "W" để\nviết, thay vì trích dẫn, bỏ trích dẫn

17564
16:45:02,605 --> 16:45:05,272
Nhưng chắc chắn sẽ cần nhiều\nliên quan hơn một chút để làm điều đó trong Python.

17565
16:45:05,271 --> 16:45:07,591
Nhưng với SQL, bạn có thể cập nhật\ndữ liệu theo thời gian thực.

17566
16:45:07,591 --> 16:45:11,091
Và nếu tôi thực sự đang chạy một\n

17567
16:45:11,091 --> 16:45:13,221
đối với ứng dụng dành cho thiết bị di động, điều đó\nthay đổi, về mặt lý thuyết

17568
16:45:13,222 --> 16:45:15,502
sẽ được phản ánh ở mọi nơi\không phải thiết bị của bạn

17569
16:45:15,502 --> 16:45:17,552
nếu bằng cách nào đó bạn đang nói\nvới ứng dụng này.

17570
16:45:17,552 --> 16:45:19,337
Vì vậy, đó là hướng chúng tôi đang hướng tới.

17571
16:45:19,336 --> 16:45:20,961
Điều khác này đã làm phiền tôi.

17572
16:45:20,961 --> 16:45:27,981
Vì vậy, hãy chọn tiêu đề từ\nfavorites, trong đó tiêu đề bằng

17573
16:45:33,021 --> 16:45:37,491
Hay chúng ta cập nhật\ncác mục ưa thích bằng cách đặt tiêu đề

17574
16:45:37,491 --> 16:45:44,421
bằng với The Office, trong đó tiêu đề\n

17575
16:45:45,811 --> 16:45:47,991
Và bây giờ, nếu tôi chọn\nđiều tương tự một lần nữa

17576
16:45:47,991 --> 16:45:50,152
Tôi có thể lên xuống nhanh chóng bằng\ncác phím mũi tên của mình.

17577
16:45:50,152 --> 16:45:52,432
Bây giờ không có Văn phòng V.

17578
16:45:52,432 --> 16:45:54,542
Chúng tôi thực sự đã thay đổi giá trị đó.

17579
16:45:55,641 --> 16:46:01,222
Chọn thể loại từ mục yêu thích,\ntrong đó tiêu đề là tiêu đề

17580
16:46:01,222 --> 16:46:04,792
bằng Game of Thrones, dấu chấm phẩy.

17581
16:46:04,792 --> 16:46:08,342
Những điều này khá dài và tôi\n

17582
16:46:08,341 --> 16:46:14,901
Vậy thì sao chúng ta không cập nhật các mục yêu thích,\nđặt thể loại bằng, chắc chắn rồi

17583
16:46:14,902 --> 16:46:17,991
hành động, phiêu lưu, chắc chắn rồi, kịch tính?

17584
16:46:19,732 --> 16:46:22,042
Giả tưởng, chắc chắn rồi, ly kỳ, chiến tranh.

17585
16:46:22,042 --> 16:46:26,391
Được rồi, tôi sẽ nói là bất cứ thứ gì ngoại trừ\nphim hài.

17586
16:46:26,391 --> 16:46:28,502
Hãy tiếp tục và nhấn Enter ngay bây giờ.

17587
16:46:28,502 --> 16:46:33,141
Và bây giờ, nếu tôi chọn lại thể loại, cũng vậy\n

17588
16:46:34,502 --> 16:46:36,591
Vì vậy, điều đó có lẽ đúng hay không

17589
16:46:36,591 --> 16:46:38,361
hơi chủ quan và hay tranh luận.

17590
16:46:38,362 --> 16:46:42,262
Nhưng ít nhất tôi đã dọn dẹp\n

17591
16:46:42,262 --> 16:46:46,012
Tạo, đọc, cập nhật, xóa\nbạn có thể thực hiện điều đó một cách dễ dàng.

17592
16:46:47,631 --> 16:46:51,771
Hãy cẩn thận hơn khi sử dụng tính năng thả, theo đó\nbạn có thể xóa toàn bộ bảng.

17593
16:46:51,771 --> 16:46:54,651
Nhưng thông qua những loại\nlệnh này, liệu bây giờ chúng ta thực sự có thể

17594
16:46:54,652 --> 16:46:58,732
thao tác dữ liệu của chúng tôi nhiều hơn\nhanh chóng và chỉ với những suy nghĩ đơn lẻ.

17595
16:46:58,732 --> 16:47:01,732
Và trên thực tế, nếu bạn là người có tham vọng\n

17596
16:47:01,732 --> 16:47:05,662
hoặc nhà phân tích trong thế giới thực, SQL\n

17597
16:47:05,661 --> 16:47:08,914
bởi vì nó cho phép bạn thực sự\nđi sâu vào dữ liệu một cách nhanh chóng và hỏi

17598
16:47:08,915 --> 16:47:11,332
các câu hỏi về dữ liệu và nhận được\ncâu trả lời khá nhanh chóng.

17599
16:47:11,332 --> 16:47:12,872
Và đây là một tập dữ liệu đơn giản.

17600
16:47:12,872 --> 16:47:17,182
Bạn cũng có thể thực hiện việc này với các tập dữ liệu\n lớn hơn nhiều mà chúng tôi sẽ sớm thực hiện.

17601
16:47:17,182 --> 16:47:20,391
Hoặc có bất kỳ câu hỏi nào về những gì\nchúng ta đã thấy về SQL cho đến nay không?

17602
16:47:20,391 --> 16:47:22,512
Chỉ trầy xước\nbề mặt, nhưng một lần nữa, nó

17603
16:47:22,512 --> 16:47:28,442
tập trung vào việc tạo, đọc,\ncập nhật và xóa dữ liệu.

17604
16:47:30,752 --> 16:47:33,162
Nào, hãy xem xét\nthiết kế của dữ liệu này.

17605
16:47:33,161 --> 16:47:37,241
Hãy nhớ lại rằng nếu tôi thực hiện .schema, thì\n

17606
16:47:37,241 --> 16:47:39,331
cái gọi là lược đồ dữ liệu của tôi.

17607
16:47:40,351 --> 16:47:42,991
Nó hoàn thành công việc và thành thật mà nói,\nmọi thứ người dùng đã nhập vào

17608
16:47:42,991 --> 16:47:46,951
được cho là văn bản, bao gồm cả\n

17609
16:47:46,951 --> 16:47:49,381
Nhưng do đó, tập dữ liệu\nitself có phần đơn giản.

17610
16:47:49,381 --> 16:47:54,911
Nhưng nếu chúng ta nhìn vào chính tập dữ liệu,\n

17611
16:47:54,911 --> 16:47:57,302
Chọn thể loại từ mục yêu thích.

17612
16:47:57,302 --> 16:47:59,882
Và hãy để tôi chỉ ra một\nđiều khác về mặt phong cách.

17613
16:47:59,881 --> 16:48:04,391
Tôi đang cố tình viết hoa\n

17614
16:48:04,391 --> 16:48:08,042
và tôi đang viết thường tất cả tên cột và tên bảng.

17615
16:48:08,042 --> 16:48:11,101
Đây là một quy ước, và\thành thật mà nói, nó chỉ giúp bạn đọc

17616
16:48:11,101 --> 16:48:14,551
Tôi nghĩ, đoạn mã khi bạn\nkết hợp tên của bạn cho các cột

17617
16:48:14,552 --> 16:48:17,942
và các bảng có từ khóa SQL thích hợp.

17618
16:48:17,942 --> 16:48:23,370
Nhưng tôi có thể dễ dàng\nchọn thể loại từ mục yêu thích

17619
16:48:23,370 --> 16:48:26,491
nhưng một lần nữa, các từ khóa cụ thể của SQL\n

17620
16:48:26,491 --> 16:48:29,582
Vì vậy, về mặt phong cách, chúng tôi\nđề xuất điều này bằng cách chọn thể loại

17621
16:48:38,192 --> 16:48:40,562
Tôi vô tình thực hiện\nmọi chương trình, kể cả

17622
16:48:40,561 --> 16:48:45,752
Văn phòng về hành động, phiêu lưu,\n

17623
16:48:45,752 --> 16:48:49,802
Làm thế nào tôi lại làm điều đó một cách vô tình?

17624
16:48:57,802 --> 16:48:59,701
Tôi nghĩ tôi đã nói\nhãy cẩn thận vào khoảng thời gian này.

17625
16:48:59,701 --> 16:49:03,152
Vì vậy, cơ sở dữ liệu SQL đã đưa tôi--\ntheo nghĩa đen, tôi đã cập nhật các mục yêu thích

17626
16:49:03,152 --> 16:49:06,351
thiết lập các thể loại bằng với điều đó,\ndấu chấm phẩy, kết thúc suy nghĩ.

17627
16:49:06,351 --> 16:49:08,841
Tôi thực sự muốn nói\nnơi tiêu đề ngang bằng

17628
16:49:08,841 --> 16:49:11,361
trích dẫn, bỏ trích dẫn, "Trò chơi vương quyền.

17629
16:49:11,362 --> 16:49:14,421
Thật không may, không có lệnh\nundo hoặc cỗ máy thời gian

17630
16:49:14,421 --> 16:49:17,271
với cơ sở dữ liệu SQL, vì vậy\nđiều tốt nhất chúng ta có thể làm ở đây

17631
16:49:17,271 --> 16:49:21,591
là, chúng ta hãy thực sự loại bỏ\n favorites.db.

17632
16:49:21,591 --> 16:49:27,681
Hãy chạy SQLite của favorites.db\n

17633
16:49:27,682 --> 16:49:29,781
Hãy để tôi tự thay đổi sang chế độ CSV.

17634
16:49:29,781 --> 16:49:35,271
Hãy để tôi nhập tệp CSV vào bảng\nfavorites của tôi.

17635
16:49:35,271 --> 16:49:39,591
Và bây giờ, Bạn bè đã quay trở lại,\ndù tốt hay xấu

17636
16:49:39,591 --> 16:49:40,851
nhưng tất cả các thể loại của chúng tôi cũng vậy.

17637
16:49:43,432 --> 16:49:46,671
Nếu bây giờ tôi tải lại tập tin\nvà chọn, gắn dấu sao, từ--

17638
16:49:47,182 --> 16:49:51,180
Chọn thể loại từ mục yêu thích,\nđó là kết quả mà tôi nhận được.

17639
16:49:51,180 --> 16:49:53,972
Nó lộn xộn hơn nhiều, nhưng đó\n

17640
16:49:53,972 --> 16:49:55,639
Nhưng bây giờ chúng ta quay lại dữ liệu ban đầu.

17641
16:49:55,639 --> 16:49:58,042
Bài học ở đây, hãy nhớ sao lưu công việc của bạn.

17642
16:49:58,582 --> 16:50:02,192
Vậy chúng ta\ncó thể làm gì hơn nữa với dữ liệu này?

17643
16:50:02,192 --> 16:50:05,822
Chà, tôi không thích thiết kế của\n

17644
16:50:05,822 --> 16:50:08,542
Thứ nhất, chúng tôi không có\nbất kỳ hình thức xác thực nào

17645
16:50:08,542 --> 16:50:10,552
nhưng đầu vào của người dùng sẽ lộn xộn.

17646
16:50:10,552 --> 16:50:13,132
Có rất nhiều\nsự dư thừa ở đây.

17647
16:50:15,061 --> 16:50:17,101
Hãy để tôi chọn tất cả\nphim hài mà bạn đã nhập.

17648
16:50:17,101 --> 16:50:23,301
Vì vậy hãy chọn tiêu đề từ\nyêu thích, trong đó thể loại bằng

17649
16:50:25,461 --> 16:50:31,072
Được rồi, vậy là có tất cả các chương trình\nrõ ràng là phim hài.

17650
16:50:31,072 --> 16:50:34,281
Nhưng tôi nghĩ thực sự có thể có những người khác.

17651
16:50:37,521 --> 16:50:39,381
Một bộ phim hài và một bộ phim truyền hình là gì?

17652
16:50:39,381 --> 16:50:44,481
Hãy tìm kiếm-- ôi,\n

17653
16:50:44,482 --> 16:50:49,042
Được rồi, vậy là The Office, trong trường hợp này, là\n

17654
16:50:49,042 --> 16:50:52,351
Ở Philadelphia trời luôn nắng\nand Gilmore Girls cũng vậy.

17655
16:50:52,351 --> 16:50:56,792
Nhưng hãy lưu ý rằng tôi nhận được nhiều hơn thế\nkhi tôi chỉ tìm kiếm phim hài.

17656
16:50:56,792 --> 16:51:01,792
Vậy điều đáng chú ý ở đây là vì tôi\n

17657
16:51:01,792 --> 16:51:04,372
theo cách Google đã làm,\na danh sách được phân tách bằng dấu phẩy

17658
16:51:04,372 --> 16:51:08,932
nó thực sự rất khó khăn và lộn xộn\n

17659
16:51:08,932 --> 16:51:12,171
ở đâu đó được mô tả là hài kịch.

17660
16:51:12,171 --> 16:51:15,021
Bởi vì nếu tôi tìm kiếm trích dẫn,\n

17661
16:51:15,021 --> 16:51:18,951
Tôi sẽ mua cái này, sao cũng được\n

17662
16:51:20,582 --> 16:51:22,012
Nhưng tôi sẽ không lấy cái này.

17663
16:51:22,012 --> 16:51:23,512
Tôi sẽ không lấy cái này.

17664
16:51:24,411 --> 16:51:28,131
Nếu tôi đang tìm kiếm, thể loại ở đâu\n

17665
16:51:28,131 --> 16:51:29,691
tại sao tôi lại bỏ lỡ những chương trình khác?

17666
16:51:37,362 --> 16:51:39,732
Nó không chỉ là một bộ phim hài,\nit là một bộ phim hài và một bộ phim truyền hình

17667
16:51:39,732 --> 16:51:42,022
và một vở hài kịch hoặc một chương trình tin tức\n, v.v.

17668
16:51:42,021 --> 16:51:45,851
Vì vậy tôi phải tìm kiếm những dấu phẩy này,\n

17669
16:51:45,851 --> 16:51:47,902
Hãy để tôi sao chép nó để tôi có thể làm điều này.

17670
16:51:47,902 --> 16:51:51,491
Hãy để tôi tìm xem\ngthể loại nào có hài kịch.

17671
16:51:51,491 --> 16:51:58,572
Thế còn, hoặc thể loại tương đương với\nhài kịch, kịch hoặc thể loại

17672
16:51:58,572 --> 16:52:01,991
bằng toàn bộ chuyện này,\nphim hài, tin tức, chương trình trò chuyện?

17673
16:52:01,991 --> 16:52:03,711
Tôi sẽ ngày càng nhận được nhiều kết quả hơn.

17674
16:52:03,711 --> 16:52:05,241
Nhưng điều đó sẽ không mở rộng quy mô tốt.

17675
16:52:05,241 --> 16:52:08,152
Thay vào đó tôi có thể làm gì\n việc liệt kê bằng ors

17676
16:52:08,152 --> 16:52:11,141
bạn có nghĩ rằng tất cả các hoán vị khác nhau của thể loại không?

17677
16:52:15,872 --> 16:52:19,772
Vì vậy tôi có thể sử dụng từ khóa is,\nsimilar trong Python với từ in.

17678
16:52:19,771 --> 16:52:22,322
Tôi có thể sử dụng từ khóa like\nđể lâu như vậy

17679
16:52:22,322 --> 16:52:27,421
vì thể loại này giống như\nphim hài ở đâu đó trong đó

17680
16:52:27,421 --> 16:52:31,241
điều đó sẽ mang lại cho tôi tất cả chúng,\n

17681
16:52:31,241 --> 16:52:34,606
Nhưng hãy để tôi tiếp tục và\nmở biểu mẫu từ trước đó.

17682
16:52:37,591 --> 16:52:40,414
Hãy để tôi xem liệu tôi có thể mở cái này\nthực sự nhanh chóng hay không trước khi chuyển qua.

17683
16:52:40,415 --> 16:52:42,332
Nếu chúng ta nhìn lại\nbiểu mẫu, hãy nhớ rằng có

17684
16:52:42,332 --> 16:52:47,972
tất cả các nút radio\n chỉ ra các thể loại cụ thể

17685
16:52:49,872 --> 16:52:55,052
Và nếu tôi mở cái này, hãy để tôi xem toàn màn hình\n

17686
16:52:55,052 --> 16:52:58,262
Bạn sẽ thấy tất cả\ngthể loại ở đây, không có thể loại nào trong số đó

17687
16:52:58,262 --> 16:53:04,022
điều đó có đáng lo ngại không ngoại trừ một\n

17688
16:53:04,021 --> 16:53:08,671
Từ khóa like\nalone có thể khiến tôi gặp rắc rối ở đâu?

17689
16:53:13,021 --> 16:53:16,531
DAVID J. Malan: Vâng, âm nhạc và âm nhạc\n

17690
16:53:16,531 --> 16:53:19,002
Bởi vì, thứ nhất, chúng là những thể loại riêng biệt.

17691
16:53:19,002 --> 16:53:21,652
Nhưng nếu tôi chỉ tìm kiếm\nthứ gì đó giống như âm nhạc

17692
16:53:21,652 --> 16:53:24,152
Tôi sẽ vô tình hút\ntất cả các vở nhạc kịch, mà

17693
16:53:25,292 --> 16:53:28,652
Nếu âm nhạc là một video ca nhạc hay\nbất cứ thứ gì, và âm nhạc thực sự là

17694
16:53:28,652 --> 16:53:31,961
một loại chương trình khác, tôi không muốn chỉ làm điều đó.

17695
16:53:31,961 --> 16:53:33,451
Vì vậy, nó có vẻ rất lộn xộn.

17696
16:53:33,451 --> 16:53:37,023
Tôi có thể cùng nhau hack thứ gì đó\n

17697
16:53:37,982 --> 16:53:40,862
Nhưng đây không phải là một\nthiết kế tốt cho dữ liệu.

17698
16:53:40,862 --> 16:53:43,232
Google đã làm điều đó\ntheo cách này bởi vì nó chỉ

17699
16:53:43,232 --> 16:53:47,342
thực sự đơn giản để giữ tất cả\ndữ liệu của người dùng trong một cột duy nhất

17700
16:53:47,341 --> 16:53:49,861
và giống như họ đã làm,\nphân tách nó bằng dấu phẩy.

17701
16:53:49,862 --> 16:53:54,061
Nhưng đây thực sự là một cách\nlộn xộn để sử dụng CSV

17702
16:53:54,061 --> 16:53:58,171
bằng cách đặt các giá trị được phân tách bằng dấu phẩy\n

17703
16:53:58,171 --> 16:54:00,691
Có thể cho rằng, những người ở\nGoogle có lẽ đã làm điều này

17704
16:54:01,862 --> 16:54:03,987
Và họ không muốn đưa cho mọi người nhiều tờ giấy

17705
16:54:03,987 --> 16:54:07,561
hoặc làm phức tạp mọi việc bằng cách sử dụng một số thứ khác\n

17706
16:54:07,561 --> 16:54:09,792
Nhưng tôi cá là có\ncách tốt hơn để chúng ta thực hiện việc này.

17707
16:54:09,792 --> 16:54:11,202
Và hãy để tôi tiếp tục và làm điều này.

17708
16:54:11,201 --> 16:54:13,319
Hãy để tôi quay lại mã của tôi ở đây.

17709
16:54:13,319 --> 16:54:15,362
Và chỉ trong giây lát nữa thôi, tôi\nsẽ lấy một chương trình

17710
16:54:15,362 --> 16:54:19,592
mà tôi đã viết trước, điều đó sẽ diễn ra\n

17711
16:54:19,591 --> 16:54:24,451
lặp qua tất cả các hàng và tải\n

17712
16:54:24,451 --> 16:54:27,971
hai bảng, một bảng gọi là\nhiển thị và một bảng gọi là thể loại

17713
16:54:27,972 --> 16:54:30,482
để thực sự tách biệt\nhai thứ này ra.

17714
16:54:30,482 --> 16:54:33,072
Hãy cho tôi một chút thời gian để lấy mã.

17715
16:54:33,072 --> 16:54:36,061
Và khi tôi chạy cái này, tôi sẽ\không phải chạy nó một lần.

17716
16:54:36,061 --> 16:54:38,432
Hãy để tôi tiếp tục và\nchạy Python sau

17717
16:54:38,432 --> 16:54:41,281
và tôi sẽ tiết lộ kết quả sau một giây.

17718
16:54:41,281 --> 16:54:44,131
Đây sẽ là phiên bản\n8 của mã trực tuyến.

17719
16:54:44,131 --> 16:54:47,822
Khi tôi thực hiện việc này, hãy để tôi\ntiếp tục và mở tệp này.

17720
16:54:47,822 --> 16:54:51,601
Đợi tôi một giây để chuyển\nit vào thư mục này.

17721
16:54:53,911 --> 16:54:56,856
Vì vậy, ở đây chúng tôi có phiên bản 8\nnày có sẵn trực tuyến

17722
16:54:56,857 --> 16:54:58,232
điều đó sẽ làm như sau

17723
16:54:58,232 --> 16:55:00,190
Và tôi sẽ lướt qua một số\nchi tiết như vậy

17724
16:55:00,190 --> 16:55:04,082
rằng chúng ta không bị mắc kẹt trong\ncỏ dại của một số mã này.

17725
16:55:04,082 --> 16:55:06,722
Tôi sẽ sử dụng\nở đầu chương trình này

17726
16:55:06,722 --> 16:55:11,162
như chúng ta sẽ sớm thấy, thư viện CS50,\n

17727
16:55:11,161 --> 16:55:14,072
hoặc get_int, hoặc get_float, nhưng\nvì có một số SQL dựng sẵn

17728
16:55:14,072 --> 16:55:17,222
chức năng mà chúng ta chưa thảo luận\n

17729
16:55:18,091 --> 16:55:22,021
Nhưng bên trong thư viện CS50 chúng ta sẽ\n

17730
16:55:22,021 --> 16:55:26,671
SQL cung cấp cho bạn khả năng sử dụng\n

17731
16:55:26,671 --> 16:55:31,381
về mặt kỹ thuật được gọi là URI, cho phép\n

17732
16:55:31,381 --> 16:55:33,721
Và tóm lại, tất cả\nđoạn mã tiếp theo

17733
16:55:33,722 --> 16:55:37,921
sẽ lặp lại điều này\n

17734
16:55:37,921 --> 16:55:41,582
Và nó sẽ nhập nó\nvào cơ sở dữ liệu SQLite

17735
16:55:41,582 --> 16:55:44,772
nhưng nó sẽ sử dụng hai\nbảng thay vì chỉ một.

17736
16:55:44,771 --> 16:55:46,981
Vì vậy, hãy cho tôi một chút\nđể chạy cái này và sau đó tôi sẽ

17737
16:55:48,942 --> 16:55:51,612
Điều này sẽ được\nchạy trên favorites.csv.

17738
16:55:56,851 --> 16:56:00,826
Và hãy nhìn vào đây,\cho tôi một chút.

17739
16:56:11,421 --> 16:56:14,362
Chương trình này sẽ không kéo dài\n lâu như vậy.

17740
16:56:24,841 --> 16:56:27,691
Hãy để tôi đọc lướt đoạn mã này thật\n

17741
16:56:30,182 --> 16:56:35,732
Người đọc, tiêu đề, ID chương trình\trong hai chương trình nhất định.

17742
16:56:35,732 --> 16:56:40,712
[KHÔNG NGHE ĐƯỢC] tách thể loại, thực thi DB.

17743
16:56:41,222 --> 16:56:42,752
Đây là tôi đang gỡ lỗi trong thời gian thực.

17744
16:56:42,752 --> 16:56:48,184
Tất cả những lúc chúng tôi khuyến khích bạn sử dụng\n

17745
16:56:48,184 --> 16:56:50,101
Chúng ta sẽ xem tôi\ncó thể phục hồi sau chuyện này nhanh đến mức nào.

17746
16:56:50,101 --> 16:56:51,902
Python của phiên bản yêu thích 8.

17747
16:56:54,442 --> 16:56:57,412
Được rồi, đây là lúc tôi gỡ lỗi theo thời gian thực.

17748
16:56:58,224 --> 16:56:59,932
Ồ, có lẽ tôi\nđợi chưa đủ lâu.

17749
16:57:01,281 --> 16:57:05,241
Điều tôi đang làm là in ra\ntừ điển đại diện cho

17750
16:57:05,241 --> 16:57:06,883
mỗi hàng mà tất cả các bạn đã gõ vào.

17751
16:57:06,883 --> 16:57:08,341
Và chúng tôi thực sự đang đạt được tiến bộ.

17752
16:57:09,561 --> 16:57:11,851
Tôi đã quá thiếu kiên nhẫn và không đợi đủ lâu.

17753
16:57:13,311 --> 16:57:15,711
Được rồi, tất cả những gì chúng ta phải làm đôi khi là chờ đợi.

17754
16:57:15,711 --> 16:57:19,762
Hãy để tôi tiếp tục và mở\ntệp này bằng SQLite3.

17755
16:57:19,762 --> 16:57:23,422
Vì vậy, trong SQLite3 bây giờ tôi có một\nphiên bản khác của favorites.db.

17756
16:57:23,421 --> 16:57:25,311
Tôi đặt tên nó là số 8 để đảm bảo tính nhất quán.

17757
16:57:25,311 --> 16:57:28,621
Sau khi chạy xong chương trình, tôi có thể\nlàm .schema để xem bên trong chương trình.

17758
16:57:28,622 --> 16:57:32,542
Và đây là nội dung của hai bảng trong\n

17759
16:57:32,542 --> 16:57:36,262
Tôi đã tạo một bảng tên là shows, cái này\n

17760
16:57:36,262 --> 16:57:39,752
đó là mục yêu thích,\ncó hai cột.

17761
16:57:39,752 --> 16:57:42,154
Một cái gọi là ID, một cái gọi là Tiêu đề.

17762
16:57:42,154 --> 16:57:44,362
Nhưng bây giờ tôi sẽ bắt đầu\nđi chơi một chút

17763
16:57:44,362 --> 16:57:45,982
các tính năng khác của SQL.

17764
16:57:45,982 --> 16:57:50,242
Và ngoài việc có văn bản, nó còn chuyển sang\n

17765
16:57:50,241 --> 16:57:52,252
Ngoài ra còn có một\nloại dữ liệu được gọi là văn bản

17766
16:57:52,252 --> 16:57:55,491
cũng có một cụm từ khóa\nđặc biệt mà bạn có thể chỉ định

17767
16:57:55,491 --> 16:57:57,171
rằng tiêu đề không bao giờ có thể rỗng.

17768
16:57:57,171 --> 16:58:00,502
Hãy nghĩ lại việc chúng ta sử dụng\nof null trong C. Hãy nghĩ lại

17769
16:58:00,502 --> 16:58:02,601
vào từ khóa none trong Python.

17770
16:58:02,601 --> 16:58:06,171
Đây là một hạn chế về cơ sở dữ liệu\n

17771
16:58:06,171 --> 16:58:07,972
không thể có chương trình truyền hình yêu thích.

17772
16:58:07,972 --> 16:58:11,662
Nếu bạn gửi biểu mẫu, bạn phải\nnhập tiêu đề cho nó

17773
16:58:11,661 --> 16:58:13,591
để kết thúc trong cơ sở dữ liệu của chúng tôi ở đây.

17774
16:58:13,591 --> 16:58:16,281
Và bạn sẽ nhận thấy một tính năng mới khác.

17775
16:58:16,281 --> 16:58:18,801
Hóa ra, trên\nbàn này tôi đang xác định những gì

17776
16:58:18,802 --> 16:58:22,312
được gọi là khóa chính,\ncụ thể là cột ID.

17777
16:58:22,311 --> 16:58:23,941
Thêm về điều đó chỉ trong giây lát.

17778
16:58:23,942 --> 16:58:28,042
Trong khi đó, bảng thứ hai mã của tôi\n

17779
16:58:28,042 --> 16:58:33,561
cung cấp cho tôi một cột có tên\nhiển thị ID và sau đó, thể loại

17780
16:58:33,561 --> 16:58:36,481
giá trị của nó là văn bản\ncũng không được rỗng.

17781
16:58:36,482 --> 16:58:38,102
Và sau đó nhiều hơn về điều này trong giây lát.

17782
16:58:38,101 --> 16:58:41,182
Bảng này có cái mà chúng ta\nsẽ gọi là khóa ngoại

17783
16:58:41,182 --> 16:58:45,891
cụ thể là cột hiển thị ID\ntham chiếu đó hiển thị ID.

17784
16:58:45,891 --> 16:58:48,591
Vì vậy, trước khi chúng ta đi sâu vào\nviệc này, điều này

17785
16:58:48,591 --> 16:58:52,461
bây giờ là một cách tạo mối quan hệ\ntrong cơ sở dữ liệu quan hệ.

17786
16:58:52,461 --> 16:58:56,481
Nếu bây giờ tôi có hai bảng, không\nchỉ một, chúng có thể bằng cách nào đó

17787
16:58:56,482 --> 16:59:00,062
được liên kết với nhau bằng một cột chung.

17788
16:59:00,061 --> 16:59:03,201
Nói cách khác, cột hiển thị--

17789
16:59:03,201 --> 16:59:06,682
shows table sẽ cung cấp cho\ntôi một bảng có hai cột--

17790
16:59:08,421 --> 16:59:12,141
Mỗi chức danh bạn trao cho tôi, tôi\nsẽ gán một giá trị duy nhất.

17791
16:59:12,141 --> 16:59:16,942
Trong khi đó, bảng thể loại là\n

17792
16:59:16,942 --> 16:59:19,822
duy nhất có cùng ý tưởng đó.

17793
16:59:19,822 --> 16:59:26,491
Và kết quả của việc này là quay trở lại\n

17794
16:59:26,491 --> 16:59:30,801
Chọn sao từ chương trình\ncủa cơ sở dữ liệu mới này

17795
16:59:30,802 --> 16:59:34,372
và bạn sẽ thấy rằng tôi đã đưa ra,\n

17796
16:59:36,004 --> 16:59:39,171
Tôi đã không lọc ra các bản trùng lặp hoặc làm\n

17797
16:59:39,771 --> 16:59:42,271
Vì vậy sẽ có một số\ndtrùng lặp ở đây bởi vì tôi đã không

17798
16:59:42,271 --> 16:59:44,182
muốn loại bỏ dữ liệu của bất kỳ ai.

17799
16:59:44,182 --> 16:59:47,302
Nhưng bạn sẽ thấy điều đó\thực sự, tôi đã cho mọi người

17800
16:59:47,302 --> 16:59:49,762
một mã định danh duy nhất, từ\nngười đầu tiên

17801
16:59:49,762 --> 16:59:53,992
đã gõ Làm thế nào tôi gặp mẹ của bạn, tất cả\n

17802
16:59:53,991 --> 17:00:01,101
Trong khi đó, nếu tôi chọn ngôi sao từ\n

17803
17:00:01,101 --> 17:00:03,621
một cột trong\ndữ liệu ban đầu, bây giờ bạn sẽ

17804
17:00:03,622 --> 17:00:08,537
hãy xem một thiết kế tốt hơn nhiều cho dữ liệu này.

17805
17:00:08,536 --> 17:00:09,661
Hãy chú ý những gì tôi đã làm ở đây.

17806
17:00:09,661 --> 17:00:12,711
Hãy để tôi đi đến tận cùng và\n

17807
17:00:12,711 --> 17:00:16,849
được gọi là ID chương trình,\ncủa chương trình còn lại được gọi là thể loại.

17808
17:00:16,849 --> 17:00:18,891
Và một lần nữa, tôi đã viết một số\ncode để làm điều này bởi vì tôi

17809
17:00:18,891 --> 17:00:22,016
đã phải lấy kết quả lộn xộn của Google\n

17810
17:00:22,016 --> 17:00:25,671
Tôi đã phải xé bỏ dấu phẩy và\n

17811
17:00:27,112 --> 17:00:29,542
Mặc dù chúng tôi chưa giới thiệu cú pháp mà qua đó

17812
17:00:29,542 --> 17:00:32,572
chúng ta có thể khôi phục\ndữ liệu và liên kết lại

17813
17:00:32,572 --> 17:00:35,872
thể loại của bạn cùng với\ntiêu đề của bạn, tại sao, sơ qua

17814
17:00:35,872 --> 17:00:38,482
đây có thể là một thiết kế tốt hơn bây giờ?

17815
17:00:38,482 --> 17:00:42,082
Mặc dù tôi đã tăng gấp đôi\nsố bàn từ một lên hai

17816
17:00:42,082 --> 17:00:46,882
tại sao điều này có lẽ đang theo hướng\nhướng tới một thiết kế tốt hơn?

17817
17:00:46,881 --> 17:00:48,471
Bản năng của bạn có thể là gì?

17818
17:00:53,061 --> 17:00:56,572
Một lần nữa, lần đầu tiên với SQL,\ntại sao nó lại tốt hơn, có lẽ

17819
17:00:56,572 --> 17:00:59,122
rằng chúng ta đã làm điều này\nvới bảng thể loại của mình?

17820
17:01:02,542 --> 17:01:06,702
Ồ, chỉ vì chúng tôi có\n

17821
17:01:09,190 --> 17:01:14,472
Chúng tôi đã làm sạch dữ liệu bằng cách cung cấp\n

17822
17:01:14,472 --> 17:01:16,601
trong bảng tính\nGoogle ban đầu

17823
17:01:16,601 --> 17:01:19,371
ô riêng của nó trong bảng này, nếu bạn muốn.

17824
17:01:19,372 --> 17:01:22,272
Và bây giờ thông báo hiển thị ID\ncó thể xuất hiện nhiều lần.

17825
17:01:22,271 --> 17:01:26,871
Bất cứ ai đã gõ vào Làm thế nào tôi gặp mẹ của bạn,\n

17826
17:01:26,872 --> 17:01:29,802
Và vì vậy chúng ta thấy\nchương trình ID 1 là một bộ phim hài.

17827
17:01:30,987 --> 17:01:32,862
Tôi quên tên của\nchương trình thứ hai.

17828
17:01:32,862 --> 17:01:37,302
Nhưng người được phân công đó,\nđã kiểm tra ID 2

17829
17:01:37,302 --> 17:01:39,192
cả đống hộp của thể loại này.

17830
17:01:39,192 --> 17:01:42,882
Điều đó lại xảy ra với show ID 3, 4.

17831
17:01:42,881 --> 17:01:46,281
Người 5, 6, 7 chỉ đánh dấu vào một ô.

17832
17:01:46,281 --> 17:01:50,381
Và bây giờ bạn có thể thấy rằng chúng tôi đã\n

17833
17:01:50,381 --> 17:01:53,031
có thể gọi là mối quan hệ một-nhiều.

17834
17:01:53,031 --> 17:01:58,391
Mối quan hệ một-nhiều, theo đó\n

17835
17:01:58,391 --> 17:02:02,141
bây giờ nó có thể có nhiều thể loại\nđược liên kết với nó, mỗi thể loại

17836
17:02:02,141 --> 17:02:06,591
được thể hiện bằng một hàng riêng ở đây.

17837
17:02:06,591 --> 17:02:10,301
Vì vậy, một lần nữa, nếu tôi tiếp tục và\nchọn ngôi sao từ các chương trình--

17838
17:02:10,302 --> 17:02:14,082
hãy giới hạn ở 10 cái đầu tiên\n

17839
17:02:14,082 --> 17:02:17,112
Tôi đã gặp mẹ của bạn như thế nào, The Sopranos\nlà đầu vào thứ hai ở đó.

17840
17:02:17,112 --> 17:02:20,442
Có vẻ như bây giờ tôi\nđã tạo dữ liệu theo cách này

17841
17:02:20,442 --> 17:02:25,266
Lý tưởng nhất là tôi có thể tìm kiếm\n bằng cách nào đó

17842
17:02:25,266 --> 17:02:26,891
Tôi không phải lo lắng về dấu phẩy.

17843
17:02:26,891 --> 17:02:29,266
Tôi không phải lo lắng về\ncách tiếp cận âm nhạc mang tính hackish

17844
17:02:29,266 --> 17:02:30,972
là một chuỗi con của âm nhạc.

17845
17:02:30,972 --> 17:02:33,652
Nhưng thực sự làm cách nào tôi có thể lấy lại được dữ liệu này?

17846
17:02:33,652 --> 17:02:35,092
Nào, hãy tiếp tục và làm điều này.

17847
17:02:35,091 --> 17:02:39,041
Giả sử tôi muốn lấy lại\ncó lẽ là tất cả các bộ phim hài.

17848
17:02:39,042 --> 17:02:42,461
Tất cả các bộ phim hài, bất kể\n

17849
17:02:42,461 --> 17:02:44,891
hộp hoặc nhiều hộp thay thế.

17850
17:02:44,891 --> 17:02:48,671
Làm thế nào bây giờ, vì tôi có hai bảng, tôi có thể

17851
17:02:48,671 --> 17:02:53,082
chỉ chọn\ntiêu đề của phim hài thôi à?

17852
17:02:53,082 --> 17:02:55,122
Thực ra tôi đã làm cho\nvấn đề trở nên khó khăn hơn một chút

17853
17:02:55,122 --> 17:02:58,062
nhưng một lần nữa, SQL sẽ cung cấp cho tôi giải pháp cho vấn đề này.

17854
17:02:58,061 --> 17:03:00,371
Vấn đề là nếu tôi\nmuốn tìm kiếm những bộ phim hài

17855
17:03:00,372 --> 17:03:03,162
Tôi phải kiểm tra bảng thể loại trước.

17856
17:03:03,161 --> 17:03:04,991
Và rồi điều đó sẽ mang lại cho tôi điều gì?

17857
17:03:04,991 --> 17:03:08,921
Nếu tôi tìm kiếm các thể loại\ncó thể tìm thấy phim hài

17858
17:03:08,921 --> 17:03:11,951
điều gì có thể giúp tôi quay trở lại?

17859
17:03:13,451 --> 17:03:14,451
DAVID J. Malan: Có thể hiển thị ID.

17860
17:03:15,243 --> 17:03:21,161
Hãy để tôi chọn ID hiển thị từ các thể loại,\n

17861
17:03:21,161 --> 17:03:22,661
bằng trích dẫn, bỏ trích dẫn, "hài kịch.

17862
17:03:22,661 --> 17:03:25,811
Không có dấu phẩy, không thích, không có dấu phần trăm.

17863
17:03:25,811 --> 17:03:30,281
Bởi vì theo nghĩa đen, cột đó bây giờ là\n

17864
17:03:31,061 --> 17:03:33,011
Hãy để tôi tiếp tục và nhấn Enter ở đây.

17865
17:03:33,012 --> 17:03:36,042
Được rồi, tôi đã lấy lại được cả\nsố ID.

17866
17:03:36,042 --> 17:03:38,442
Hiện tại, điều này có thể nhanh chóng gây khó chịu.

17867
17:03:38,442 --> 17:03:43,272
Có vẻ như ID chương trình 1, 2, 4, 5, 6,\n

17868
17:03:43,271 --> 17:03:49,031
Để tôi thực sự có thể làm điều gì đó\n

17869
17:03:49,031 --> 17:03:54,731
trong đó ID bằng 1 hoặc ID bằng 2.

17870
17:03:54,732 --> 17:03:57,702
Điều này sẽ không mở rộng quy mô tốt lắm, nhưng điều này

17871
17:03:57,701 --> 17:03:59,951
đó là lý do tại sao SQL đặc biệt mạnh mẽ.

17872
17:03:59,951 --> 17:04:04,761
Bạn thực sự có thể soạn một câu hỏi\nSQL từ nhiều câu hỏi khác.

17873
17:04:05,781 --> 17:04:09,822
Tại sao tôi không chọn tiêu đề\nnơi ID của chương trình

17874
17:04:09,822 --> 17:04:13,391
có trong danh sách ID sau đây không?

17875
17:04:13,391 --> 17:04:20,052
Chọn ID chương trình từ các thể loại, trong đó\n

17876
17:04:20,982 --> 17:04:23,892
Vì vậy, tôi có hai truy vấn SQL.

17877
17:04:23,891 --> 17:04:27,192
Một cái được cố tình lồng\bên trong dấu ngoặc đơn.

17878
17:04:27,192 --> 17:04:30,102
Điều đó sẽ trả lại cho tôi\ntoàn bộ danh sách ID chương trình.

17879
17:04:30,101 --> 17:04:32,411
Nhưng đó chính xác là điều\nTôi muốn rồi tra cứu

17880
17:04:32,411 --> 17:04:36,341
tiêu đề bằng cách chọn tiêu đề\n

17881
17:04:38,722 --> 17:04:44,052
Và bây giờ nếu tôi nhấn Enter,\ntôi chỉ quay lại những chương trình đó

17882
17:04:44,052 --> 17:04:47,862
bằng cách nào đó đã bị gắn cờ là\nphim hài, cho dù bạn là khán giả

17883
17:04:47,862 --> 17:04:51,912
đã chọn một hộp cho hài kịch,\nhai hộp hoặc tất cả các hộp.

17884
17:04:51,911 --> 17:04:54,269
Bằng cách nào đó, chúng tôi lại giới thiệu\nbộ phim hài, chỉ

17885
17:04:54,269 --> 17:04:56,561
bằng cách sử dụng tập lệnh Python\nđã tải dữ liệu này không

17886
17:04:56,561 --> 17:04:59,141
vào một cái bàn lớn mà thay vào đó là hai cái.

17887
17:04:59,141 --> 17:05:01,762
Và nếu chúng ta muốn dọn dẹp\nup này, hãy thực hiện một số việc.

17888
17:05:01,762 --> 17:05:05,922
Hãy, bên ngoài\ndấu ngoặc đơn, hãy sắp xếp theo tiêu đề.

17889
17:05:05,921 --> 17:05:08,891
Đây là cách sắp xếp\ndữ liệu trong SQL rất dễ dàng.

17890
17:05:08,891 --> 17:05:13,481
Bây giờ chúng ta có toàn bộ danh sách\ncác tựa sách giống nhau hiện đã được sắp xếp.

17891
17:05:13,482 --> 17:05:17,982
Và từ khóa đó là gì\n

17892
17:05:19,601 --> 17:05:24,941
Cùng một truy vấn, nhưng hãy chỉ chọn\n

17893
17:05:24,942 --> 17:05:27,112
Và hãy chú ý, tôi đã cố tình làm theo cách này.

17894
17:05:27,112 --> 17:05:28,862
Và cho đến ngày nay, bất cứ\nlần nào tôi sử dụng SQL, tôi

17895
17:05:28,862 --> 17:05:31,529
đừng chỉ bắt đầu từ đầu\nvà viết ra toàn bộ suy nghĩ của tôi

17896
17:05:31,529 --> 17:05:33,281
và chỉ cần làm đúng ngay lần thử đầu tiên.

17897
17:05:33,281 --> 17:05:35,951
Tôi thường bắt đầu\nvới truy vấn phụ, nếu bạn

17898
17:05:35,951 --> 17:05:38,141
sẽ, điều trong\nngoặc, chỉ để có được chính mình

17899
17:05:38,141 --> 17:05:39,942
một bước tới điều tôi quan tâm.

17900
17:05:41,381 --> 17:05:43,932
Sau đó tôi thêm vào, giống như\nchúng tôi đã khuyến khích trong Python và C

17901
17:05:43,932 --> 17:05:47,711
thực hiện từng bước nhỏ để đạt được\n

17902
17:05:48,822 --> 17:05:51,402
Và ngoài\nsai lầm này, điều mà chúng tôi đã không làm

17903
17:05:51,402 --> 17:05:55,692
sửa lỗi vì tôi đã nhập lại dữ liệu sau\n

17904
17:05:55,692 --> 17:06:00,531
bây giờ chúng ta có một danh sách\nđược sắp xếp theo thứ tự abc của tất cả các dữ liệu giống nhau.

17905
17:06:00,531 --> 17:06:06,012
Nhưng bây giờ nó được thiết kế tốt hơn, bởi vì chúng ta\n

17906
17:06:10,061 --> 17:06:14,292
Chúng tôi có câu hỏi gì, nếu có ở đây?

17907
17:06:25,622 --> 17:06:27,622
DAVID J. Malan: Ồ, bây giờ\nchúng ta đã có một cơ sở dữ liệu

17908
17:06:27,622 --> 17:06:29,982
làm cách nào để chuyển nó sang CSV?

17909
17:06:31,402 --> 17:06:33,912
Và trên thực tế, có một\nlệnh trong SQLite

17910
17:06:33,911 --> 17:06:36,931
cho phép bạn xuất\ndữ liệu của bạn trở lại tệp CSV.

17911
17:06:36,932 --> 17:06:38,682
Nếu bạn muốn gửi email\nit cho ai đó và bạn

17912
17:06:38,682 --> 17:06:41,771
muốn họ có thể mở nó trong\n

17913
17:06:41,771 --> 17:06:44,351
Những con số hoặc những thứ tương tự, bạn có thể\nđi theo hướng khác.

17914
17:06:44,351 --> 17:06:47,231
Tuy nhiên, nói chung, khi\nbạn bước vào thế giới của SQL

17915
17:06:47,232 --> 17:06:49,962
có thể bạn đang lưu trữ\ndữ liệu của mình ở đó lâu dài.

17916
17:06:49,961 --> 17:06:52,932
Và có thể bạn đang cập nhật nó,\n

17917
17:06:53,614 --> 17:06:55,781
Ví dụ: một lệnh\ntôi đã không hiển thị trước đó

17918
17:06:55,781 --> 17:06:58,661
là, giả sử ai đó quên một buổi biểu diễn.

17919
17:06:58,661 --> 17:07:00,981
Hãy xem, tôi có thấy điều này ở đầu ra không?

17920
17:07:00,982 --> 17:07:02,922
Được rồi, hãy kiềm chế sự nhiệt tình của bạn.

17921
17:07:04,872 --> 17:07:06,502
Tối qua có ai nhìn thấy không?

17922
17:07:07,002 --> 17:07:10,084
Được rồi, chỉ một người thôi\n

17923
17:07:10,084 --> 17:07:12,082
Còn chương trình nào\không có trong danh sách?

17924
17:07:13,559 --> 17:07:14,891
Rõ ràng là bây giờ nó đã có trên Netflix.

17925
17:07:21,732 --> 17:07:25,252
Vâng, chúng tôi muốn chèn\ncó thể là ID và tiêu đề.

17926
17:07:25,252 --> 17:07:27,491
Nhưng tôi thực sự không quan tâm ID là gì

17927
17:07:27,491 --> 17:07:28,991
vì vậy tôi sẽ chỉ chèn một tiêu đề.

17928
17:07:28,991 --> 17:07:31,121
Và giá trị mà tôi\nsẽ trao cho danh hiệu đó

17929
17:07:31,122 --> 17:07:34,242
sẽ là, trích dẫn,\nunquote, "Seinfeld.

17930
17:07:34,241 --> 17:07:37,152
Và sau đó, hãy để tôi tiếp tục và nhấn dấu chấm phẩy.

17931
17:07:37,152 --> 17:07:39,702
Dường như không có gì xảy ra, nhưng\nhãy để tôi chạy lại truy vấn lớn

17932
17:07:39,701 --> 17:07:41,591
từ trước khi tìm kiếm phim hài.

17933
17:07:41,591 --> 17:07:45,191
Và thật không may, Seinfeld đã\n

17934
17:07:45,192 --> 17:07:47,052
vậy hãy cùng giải quyết vấn đề này nhé.

17935
17:07:47,052 --> 17:07:50,712
Theo trực giác, bây giờ tôi\nphải làm gì để liên kết

17936
17:07:53,322 --> 17:07:55,482
Tôi vừa chèn vào bảng hiển thị.

17937
17:07:55,482 --> 17:07:59,232
Còn điều gì cần xảy ra trước đó\n

17938
17:08:03,851 --> 17:08:08,292
Vì vậy bây giờ tôi cần chèn vào bảng\ngenres hai thứ

17939
17:08:08,292 --> 17:08:13,522
ID chương trình, như thế này, và\nsau đó, tên của thể loại

17940
17:08:14,682 --> 17:08:16,152
Tôi muốn chèn những giá trị nào?

17941
17:08:16,152 --> 17:08:18,137
À, ID chương trình, tốt hơn là tôi nên lấy nó.

17942
17:08:18,137 --> 17:08:19,512
Ồ, tôi thậm chí còn không biết nó là gì.

17943
17:08:19,512 --> 17:08:21,112
Tôi sẽ phải\ntìm hiểu xem đó là gì.

17944
17:08:21,112 --> 17:08:23,002
Vì vậy, tôi có thể làm điều này theo một số cách.

17945
17:08:24,491 --> 17:08:28,265
Chọn ngôi sao từ các chương trình,\ntrong đó tiêu đề bằng

17946
17:08:28,266 --> 17:08:32,112
trích dẫn, bỏ trích dẫn,\ndấu chấm phẩy "Seinfeld" 159.

17947
17:08:32,112 --> 17:08:37,122
Vì vậy, bây giờ tôi có thể làm, chèn\nvào thể loại một ID chương trình

17948
17:08:37,122 --> 17:08:45,852
và tên thể loại, các giá trị 159, và\n

17949
17:08:46,601 --> 17:08:50,051
Và bây giờ, nếu tôi cuộn lại lịch sử của mình\n

17950
17:08:50,052 --> 17:08:52,032
một lần nữa, đang tìm\ntất cả những bộ phim hài khác biệt

17951
17:08:52,031 --> 17:08:54,442
bây giờ Seinfeld đã lọt vào danh sách.

17952
17:08:54,442 --> 17:08:57,978
Nhưng tôi đã làm điều này một cách thủ công nên tôi không thực sự viết hoa nó.

17953
17:09:03,042 --> 17:09:08,781
Đặt tiêu đề bằng dấu chấm phẩy Seinfeld.

17954
17:09:09,281 --> 17:09:13,121
Được rồi, cảm ơn bạn, trong đó tiêu đề bằng,\nquote, unquote, "Seinfeld.

17955
17:09:13,122 --> 17:09:14,862
Chúng ta đừng phạm sai lầm đó nữa.

17956
17:09:15,671 --> 17:09:18,612
Và bây giờ, nếu tôi thực hiện truy vấn thực sự\nlớn đó, thì bây giờ Seinfeld là

17957
17:09:18,612 --> 17:09:21,822
thực sự, được coi là một bộ phim hài.

17958
17:09:21,822 --> 17:09:23,302
Vậy chúng ta sẽ đi đâu với điều này?

17959
17:09:23,302 --> 17:09:25,582
Chà, cho đến nay chúng ta đã thực hiện\ntất cả việc này một cách thủ công.

17960
17:09:25,582 --> 17:09:28,122
Và đây hoàn toàn là điều\n

17961
17:09:28,122 --> 17:09:30,539
có thể làm được nếu chỉ thao tác\na một tập dữ liệu khá lớn

17962
17:09:30,538 --> 17:09:33,351
để có được những câu trả lời thú vị\ncó thể có ở một

17963
17:09:33,351 --> 17:09:34,781
hai hoặc thậm chí nhiều bảng hơn.

17964
17:09:34,781 --> 17:09:37,781
Cuối cùng, trong vài tuần nữa, chúng tôi\n

17965
17:09:37,781 --> 17:09:41,951
bằng cách viết mã bằng Python\nđể tạo SQL để thực hiện việc này.

17966
17:09:41,951 --> 17:09:44,621
Nếu hôm nay bạn truy cập hầu hết mọi trang web\không phải Internet

17967
17:09:44,622 --> 17:09:48,762
và ví dụ như bạn đăng nhập, tỷ lệ cược là\n

17968
17:09:50,771 --> 17:09:53,351
Chà, trang web có thể không được triển khai bằng Python

17969
17:09:53,351 --> 17:09:56,951
nhưng nó có thể được triển khai ở một số nơi\n

17970
17:09:58,451 --> 17:10:03,671
Và ngôn ngữ đó có thể đang được sử dụng\n

17971
17:10:03,671 --> 17:10:07,271
để sử dụng SQL để lấy\ntên người dùng của bạn, hãy lấy mật khẩu của bạn

17972
17:10:07,271 --> 17:10:09,338
và so sánh cả hai với\nnhững gì bạn đã nhập.

17973
17:10:09,338 --> 17:10:11,921
Và trên thực tế, hy vọng là bạn không nhận được mật khẩu thực sự của mình

17974
17:10:11,921 --> 17:10:13,504
nhưng có thứ gọi là hàm băm của nó.

17975
17:10:13,504 --> 17:10:15,701
Nhưng có thể có\ncơ sở dữ liệu liên quan đến việc đó.

17976
17:10:15,701 --> 17:10:18,941
Khi bạn mua thứ gì đó trên\nAmazon.com và nhấp vào Thanh toán

17977
17:10:18,942 --> 17:10:22,062
rất có thể là có một số\ncode trên máy chủ của Amazon

17978
17:10:22,061 --> 17:10:25,211
đang xem nó là gì\nbạn đã thêm vào giỏ hàng của mình

17979
17:10:25,211 --> 17:10:29,031
và sau đó có thể sử dụng vòng lặp for của một số\n

17980
17:10:29,031 --> 17:10:33,521
Nó đang thực hiện rất nhiều câu lệnh SQL\n

17981
17:10:34,631 --> 17:10:37,601
Ngoài ra còn có các loại cơ sở dữ liệu khác\nnhưng cơ sở dữ liệu SQL

17982
17:10:37,601 --> 17:10:39,989
hoặc cơ sở dữ liệu quan hệ\na khá phổ biến.

17983
17:10:39,989 --> 17:10:42,072
Vậy hãy tiếp tục và viết\không có chương trình nào khác ở đây

17984
17:10:42,072 --> 17:10:46,661
trong Python hiện hợp nhất\nhai ngôn ngữ này lại với nhau, nhờ đó

17985
17:10:46,661 --> 17:10:50,081
Tôi sẽ sử dụng SQL\ninside của chương trình Python

17986
17:10:50,082 --> 17:10:53,772
để tôi có thể triển khai logic\ncủa chương trình của mình bằng Python

17987
17:10:55,391 --> 17:10:59,601
Nhưng khi tôi muốn lấy một số dữ liệu tôi\n

17988
17:10:59,601 --> 17:11:02,531
Vậy hãy để tôi tiếp tục\nvà mở favorites.py.

17989
17:11:05,082 --> 17:11:10,542
Và hãy để tôi tiếp tục và vứt đi\n

17990
17:11:10,542 --> 17:11:13,031
vừa mới thêm SQL vào hỗn hợp.

17991
17:11:13,031 --> 17:11:16,781
Từ thư viện CS50, hãy\nimport hàm SQL.

17992
17:11:16,781 --> 17:11:19,601
Điều này sẽ hữu ích khi sử dụng\nvì hầu hết các thư viện của bên thứ ba

17993
17:11:19,601 --> 17:11:22,731
liên quan đến SQL và Python là\n

17994
17:11:22,732 --> 17:11:25,732
Vì vậy tôi nghĩ bạn sẽ thấy\nthư viện này dễ sử dụng hơn.

17995
17:11:25,732 --> 17:11:27,122
Sau đó chúng ta hãy làm như sau.

17996
17:11:27,122 --> 17:11:29,242
Tạo một biến\ngọi là db cho cơ sở dữ liệu.

17997
17:11:29,241 --> 17:11:30,741
Nhưng tôi có thể gọi nó là bất cứ điều gì tôi muốn.

17998
17:11:30,741 --> 17:11:34,432
Hãy sử dụng URI đó, đó là\na cách thú vị để nói điều gì đó

17999
17:11:34,432 --> 17:11:43,131
trông giống như một URL, nhưng thực ra đó\n

18000
17:11:44,451 --> 17:11:47,961
Bây giờ hãy yêu cầu người dùng đặt tiêu đề bằng\n

18001
17:11:49,161 --> 17:11:53,301
Và hãy loại bỏ mọi khoảng trắng\n

18002
17:11:53,302 --> 17:11:56,072
Và sau đó, chúng ta hãy tiếp tục và làm điều này.

18003
17:11:57,561 --> 17:12:01,911
Bây giờ tôi sẽ tiếp tục và viết\n

18004
17:12:01,911 --> 17:12:05,181
để nói chuyện với favorites.db ban đầu.

18005
17:12:05,182 --> 17:12:09,322
Một lần nữa, tôi không sử dụng hai bảng\n

18006
17:12:09,322 --> 17:12:12,661
Tôi đang sử dụng bản gốc mà chúng tôi\ninhập từ dữ liệu của chính bạn

18007
17:12:12,661 --> 17:12:14,431
và tôi sẽ làm như sau.

18008
17:12:14,432 --> 17:12:19,491
Tôi sẽ sử dụng db.execute để thực thi\n

18009
17:12:19,491 --> 17:12:28,042
Tôi sẽ chọn số\nchương trình từ mục yêu thích

18010
17:12:28,042 --> 17:12:35,302
bảng, trong đó tiêu đề của người dùng\n

18011
17:12:35,302 --> 17:12:37,252
Và lý do tại sao tôi làm điều đó như sau.

18012
17:12:37,252 --> 17:12:40,942
Giống như trong C, khi chúng ta có\npercent S, trong SQL bây giờ

18013
17:12:40,942 --> 17:12:42,832
từ tương tự sẽ\nlà một dấu chấm hỏi.

18014
17:12:42,832 --> 17:12:44,332
Vì vậy, cùng một ý tưởng, cú pháp khác nhau.

18015
17:12:44,332 --> 17:12:46,522
Thay vì phần trăm S,\nit chỉ là một dấu chấm hỏi.

18016
17:12:46,521 --> 17:12:51,621
Và sử dụng dấu phẩy bên ngoài điều này\n

18017
17:12:51,622 --> 17:12:54,682
tôi có thể truyền vào\na chuỗi SQL, một lệnh

18018
17:12:54,682 --> 17:12:59,177
sau đó bất kỳ đối số nào tôi muốn đưa vào\n

18019
17:12:59,177 --> 17:13:01,552
Vì vậy, mục tiêu trước mắt là\thực tế là viết một chương trình

18020
17:13:01,552 --> 17:13:07,762
sẽ tìm kiếm favorites.csv, a.k.a.,\n

18021
17:13:07,762 --> 17:13:10,641
của những người thích một chương trình cụ thể.

18022
17:13:10,641 --> 17:13:14,391
Vì vậy, điều này sẽ chọn số lượng\n

18023
17:13:14,391 --> 17:13:18,741
tiêu đề họ gõ vào giống như thế nào\n

18024
17:13:19,311 --> 17:13:22,072
Hàm thực thi db này trả về một danh sách.

18025
17:13:23,154 --> 17:13:25,529
Và bạn sẽ chỉ biết được điều đó\nkhi tôi kể cho bạn nghe hoặc đọc

18026
17:13:26,631 --> 17:13:29,481
Và do đó, nếu tôi muốn\ngquay lại tổng số

18027
17:13:29,482 --> 17:13:34,282
Tôi sẽ tiếp tục và lấy\nhàng đầu tiên trong số những hàng đó.

18028
17:13:34,281 --> 17:13:36,561
Bởi vì nó sẽ\ntrả lại số đếm cho tôi.

18029
17:13:36,561 --> 17:13:41,781
Và sau đó tôi sẽ tiếp tục và\n

18030
17:13:41,781 --> 17:13:43,281
Nhưng nó sẽ có một chút kỳ lạ.

18031
17:13:43,281 --> 17:13:46,762
Về mặt kỹ thuật, cột sẽ là\n

18032
17:13:47,762 --> 17:13:49,522
Hãy để tôi thêm một tính năng nữa vào hỗn hợp.

18033
17:13:49,521 --> 17:13:51,621
Bạn thực sự có thể đặt\nbiệt hiệu cho các cột

18034
17:13:51,622 --> 17:13:55,432
đang quay trở lại, đặc biệt nếu họ\n

18035
17:13:55,432 --> 17:13:59,512
Tôi chỉ có thể gọi cột\nbộ đếm đó bằng chữ thường.

18036
17:13:59,512 --> 17:14:06,961
Điều đó có nghĩa là bây giờ tôi có thể nói lấy lại\n

18037
17:14:06,961 --> 17:14:08,701
Vì vậy, chỉ để tóm tắt lại, chúng ta đã làm gì?

18038
17:14:08,701 --> 17:14:11,351
Chúng tôi đã nhập hàm SQL thư viện CS50\n.

18039
17:14:11,351 --> 17:14:14,421
Với dòng\ncode này, chúng tôi đã mở favorites.db

18040
17:14:14,421 --> 17:14:20,152
tập tin mà bạn và tôi đã tạo trước đó\n

18041
17:14:20,152 --> 17:14:23,482
Bây giờ tôi chỉ yêu cầu người dùng\n

18042
17:14:23,482 --> 17:14:27,412
Tôi hiện đang thực thi truy vấn SQL\n này trên cơ sở dữ liệu đó

18043
17:14:27,411 --> 17:14:30,591
cắm bất cứ thứ gì\nhuman gõ vào làm tiêu đề của họ

18044
17:14:30,591 --> 17:14:32,511
để lấy lại tổng số.

18045
17:14:32,512 --> 17:14:36,292
Và tôi đang đặt cho số đếm một\nbiệt danh, bí danh của bộ đếm

18046
17:14:36,292 --> 17:14:39,202
chỉ để nó tự giải thích hơn.

18047
17:14:39,201 --> 17:14:43,671
Hàm này, db sẽ thực thi, bất kể\n

18048
17:14:43,671 --> 17:14:45,811
ngay cả khi chỉ có\không có hàng nào bên trong nó.

18049
17:14:45,811 --> 17:14:48,651
Vì vậy, dòng mã này chỉ cung cấp cho tôi hàng đầu tiên và duy nhất.

18050
17:14:48,652 --> 17:14:53,302
Và sau đó, cái này sẽ vào bên trong hàng đó,\n

18051
17:14:53,302 --> 17:14:59,072
và đưa cho tôi bộ đếm khóa\nvà giá trị mà nó tương ứng.

18052
17:14:59,072 --> 17:15:00,682
Vì vậy, để rõ ràng, điều này đang làm gì?

18053
17:15:00,682 --> 17:15:03,561
Hãy tiếp tục và chạy thủ công\n

18054
17:15:03,561 --> 17:15:07,311
Hãy để tôi chạy SQLite3 trên mục yêu thích--

18055
17:15:08,722 --> 17:15:12,752
Trên favorites.db, hãy để tôi\ninhập lại dữ liệu.

18056
17:15:12,752 --> 17:15:20,252
Vì vậy, chế độ csv.import từ\nfavorites.csv vào bảng yêu thích.

18057
17:15:20,252 --> 17:15:22,671
Vì vậy, tôi vừa tạo lại\nbộ dữ liệu giống như vậy mà tất cả các bạn

18058
17:15:22,671 --> 17:15:25,123
đã cho tôi trước đó trong favorites.db.

18059
17:15:25,124 --> 17:15:27,832
Nếu tôi thực hiện việc này một cách thủ công,\n

18060
17:15:27,832 --> 17:15:34,552
Hãy chọn, đếm số sao từ các mục yêu thích,\nnơi thích tiêu đề và hãy cùng

18061
17:15:34,552 --> 17:15:37,612
bây giờ chỉ cần nhập thủ công\nin, The Office.

18062
17:15:37,612 --> 17:15:40,671
Chúng ta sẽ tìm kiếm\ncó từ The, dấu chấm phẩy.

18063
17:15:41,902 --> 17:15:44,122
Nhưng về mặt kỹ thuật, hãy chú ý những gì tôi nhận được.

18064
17:15:44,122 --> 17:15:50,422
Về mặt kỹ thuật thì tôi sẽ lấy lại một bức thu nhỏ\n

18065
17:15:50,421 --> 17:15:52,432
Nếu tôi muốn đổi tên cột đó thì sao?

18066
17:15:52,432 --> 17:15:54,182
Đó là nơi từ khóa as xuất hiện.

18067
17:15:54,182 --> 17:15:56,421
Vì vậy hãy chọn số sao làm bộ đếm.

18068
17:15:58,252 --> 17:16:01,224
Tôi vừa quay lại-- cùng\nmột bảng đơn giản, nhưng tôi đã

18069
17:16:01,224 --> 17:16:03,891
đã đổi tên cột thành counter\nchỉ vì nó nhiều hơn một chút

18070
17:16:03,891 --> 17:16:05,752
tự giải thích nó là gì.

18071
17:16:05,752 --> 17:16:08,542
Vậy tôi đang làm gì\nvới dòng mã này?

18072
17:16:08,542 --> 17:16:12,772
Dòng mã này đang quay trở lại\n

18073
17:16:12,771 --> 17:16:16,161
dưới dạng một danh sách các từ điển.

18074
17:16:16,161 --> 17:16:20,961
Danh sách chứa một\nhàng, như chúng ta sẽ thấy, và nó

18075
17:16:20,961 --> 17:16:26,141
chứa một cột, như chúng ta\nsẽ thấy, khóa của cột đó là bộ đếm.

18076
17:16:26,141 --> 17:16:27,881
Vì vậy, bây giờ chúng ta hãy chạy mã.

18077
17:16:27,881 --> 17:16:32,621
Tôi sắp thoát khỏi SQLite3 và tôi\n

18078
17:16:33,461 --> 17:16:34,881
Tôi đang được nhắc về một chức danh.

18079
17:16:34,881 --> 17:16:39,131
Tôi sẽ gõ vào The Office và\n

18080
17:16:40,152 --> 17:16:42,792
Ồ, lại có lỗi đánh máy\nvì tôi đã nhập lại CSV.

18081
17:16:42,792 --> 17:16:46,612
Tôi đã xóa hai luận văn nên\n

18082
17:16:46,612 --> 17:16:51,101
Vậy có tổng cộng 12 cái có,\nquote, unquote, "The Office

18083
17:16:54,201 --> 17:16:57,161
Chúng tôi đã kết hợp một số\nPython với một số SQL

18084
17:16:57,161 --> 17:17:00,131
nhưng chúng tôi đã loại bỏ tất cả\n

18085
17:17:00,131 --> 17:17:02,141
việc lựa chọn một cái gì đó,\không loại bỏ tất cả

18086
17:17:02,141 --> 17:17:04,902
của từ khóa with, từ khóa\nopen, vòng lặp for

18087
17:17:04,902 --> 17:17:06,942
người đọc DictReader,\nvà tất cả những thứ đó.

18088
17:17:06,942 --> 17:17:11,802
Và bây giờ nó chỉ là một dòng SQL,\n

18089
17:17:11,802 --> 17:17:17,062
Được rồi, mọi thắc mắc về những gì chúng tôi đã làm\n

18090
17:17:26,411 --> 17:17:29,754
DAVID J. Malan: Khi nào việc này xảy ra\n

18091
17:17:31,372 --> 17:17:33,582
Vì vậy, hãy làm điều đó bằng cách thay đổi\nvấn đề hiện tại.

18092
17:17:33,582 --> 17:17:36,312
Chương trình này được thiết kế chỉ\nđể chọn tổng số.

18093
17:17:36,311 --> 17:17:41,411
Hãy tiếp tục và\nchọn, ví dụ: tất cả

18094
17:17:41,411 --> 17:17:46,046
về những cách tất cả các bạn đã nhập vào Văn phòng\n

18095
17:17:49,451 --> 17:17:53,811
Nếu tôi làm điều này trong SQLite3, hãy\ntôi tiếp tục và làm lại điều này

18096
17:17:53,811 --> 17:17:55,311
sau khi tăng cửa sổ Terminal của tôi.

18097
17:17:56,262 --> 17:18:00,912
Chọn tiêu đề từ mục yêu thích,\nnơi tiêu đề giống như vậy

18098
17:18:00,911 --> 17:18:04,176
trích dẫn, bỏ trích dẫn, "Văn phòng," dấu chấm phẩy.

18099
17:18:04,177 --> 17:18:07,302
Tôi lấy lại tất cả các hàng khác nhau này,\n

18100
17:18:07,302 --> 17:18:09,252
Thực sự có một\nlỗi đánh máy nhỏ khác ở đó

18101
17:18:09,252 --> 17:18:12,972
với một số chữ viết hoa của\nE, chữ C và chữ E. Đó

18102
17:18:12,972 --> 17:18:16,182
do đó sẽ là một ví dụ về truy vấn\nđiều đó mang lại cho tôi

18103
17:18:17,421 --> 17:18:19,332
Vì vậy, bây giờ hãy thay đổi chương trình Python của tôi.

18104
17:18:19,332 --> 17:18:24,882
Nếu bây giờ, trong chương trình Python của tôi, hãy làm\n

18105
17:18:24,881 --> 17:18:26,451
chứa tất cả các danh hiệu đó.

18106
17:18:26,451 --> 17:18:31,691
Bây giờ tôi có thể làm được, đối với hàng trong hàng, tôi có thể\n

18107
17:18:31,692 --> 17:18:34,732
và bây giờ thao tác tất cả những thứ đó lại với nhau.

18108
17:18:34,732 --> 17:18:36,102
Hãy để tôi giữ cả hai trên màn hình.

18109
17:18:36,101 --> 17:18:37,661
Hãy để tôi chạy Python của favorites.py.

18110
17:18:37,661 --> 17:18:41,661
Và vòng lặp for đó bây giờ sẽ\nội dung, 10 lần trở lên

18111
17:18:41,661 --> 17:18:43,361
một lần cho mỗi danh hiệu đó.

18112
17:18:43,362 --> 17:18:47,351
Và thực sự, nếu tôi gõ lại\nVăn phòng, Enter.

18113
17:18:52,091 --> 17:18:55,394
Ồ, lần này tôi không nên đổi tên\ntitle để phản đối.

18114
17:18:55,394 --> 17:18:57,101
Vậy đó chỉ là\nsai lầm ngớ ngẩn của tôi.

18115
17:18:58,752 --> 17:19:01,572
Và bây giờ tôi nên xem sau\nnhập văn phòng

18116
17:19:01,572 --> 17:19:03,762
Nhập vào, cả đống Văn phòng.

18117
17:19:03,762 --> 17:19:05,862
Và bởi vì tôi đang sử dụng\nlike, ngay cả những điều đã bỏ lỡ

18118
17:19:05,862 --> 17:19:08,891
chữ viết hoa đang được sử dụng,\n

18119
17:19:08,891 --> 17:19:11,231
Không quan trọng đó là chữ hoa hay chữ thường.

18120
17:19:11,232 --> 17:19:15,642
Trong khi đó tôi đã sử dụng dấu bằng\n

18121
17:19:17,277 --> 17:19:20,592
Được rồi, có câu hỏi nào về vấn đề này tiếp theo không?

18122
17:19:20,591 --> 17:19:25,041
Được rồi, hãy chuyển\nsang dữ liệu lớn hơn, hấp dẫn hơn

18123
17:19:25,042 --> 17:19:26,952
đặt ra và xem xét một số\nvấn đề

18124
17:19:26,951 --> 17:19:31,211
phát sinh khi thực sự đang sử dụng SQL và\n

18125
17:19:31,211 --> 17:19:34,311
sử dụng SQL cho ứng dụng dành cho thiết bị di động, web\napp và nói chung

18126
17:19:36,141 --> 17:19:39,432
Vì vậy, hãy bắt đầu với tập\ndữ liệu lớn hơn như thế.

18127
17:19:39,432 --> 17:19:45,141
Hãy cho tôi một chút thời gian để chuyển đổi màn hình\n

18128
17:19:45,141 --> 17:19:48,311
đó là một cơ sở dữ liệu\nquan hệ thực tế mà chúng tôi đã tạo ra

18129
17:19:48,311 --> 17:19:51,881
của tập dữ liệu trong thế giới thực từ IMDb.

18130
17:19:51,881 --> 17:19:54,551
Vậy InternetMovieDatabase.com\là một trang web

18131
17:19:54,552 --> 17:19:57,132
nơi bạn có thể tìm kiếm\nchương trình truyền hình, phim và diễn viên

18132
17:19:57,131 --> 17:20:00,221
v.v., tất cả đều sử dụng\ncơ sở dữ liệu của họ ở hậu trường.

18133
17:20:00,222 --> 17:20:04,872
IMDb tạo ra dữ liệu của họ một cách tuyệt vời\n

18134
17:20:04,872 --> 17:20:08,302
nhưng các tệp TSV, các giá trị được phân tách bằng tab.

18135
17:20:08,302 --> 17:20:11,802
Và những gì chúng tôi đã làm là trước giờ học\n

18136
17:20:11,802 --> 17:20:15,641
Chúng tôi đã viết một chương trình Python\ntương tự như tệp favorite8.py của tôi

18137
17:20:15,641 --> 17:20:19,091
trước đó đã đọc\ntất cả các tệp TSV đó

18138
17:20:19,091 --> 17:20:24,161
đã tạo một số bảng SQL\trong cơ sở dữ liệu IMDb

18139
17:20:24,161 --> 17:20:28,611
dành cho bạn trong SQLite có nhiều\nbảng và nhiều cột.

18140
17:20:28,612 --> 17:20:32,531
Vì vậy, hãy đi và quấn lấy tâm trí của chúng ta\n

18141
17:20:32,531 --> 17:20:36,281
Hãy để tôi quay lại VS Code\ntại đây, và lát nữa

18142
17:20:36,281 --> 17:20:40,601
Tôi sẽ tiếp tục và sao chép\n

18143
17:20:40,601 --> 17:20:45,851
Và tôi sẽ tiếp tục và tăng\n

18144
17:20:45,851 --> 17:20:48,911
Bất cứ khi nào chơi đùa với một\n

18145
17:20:48,911 --> 17:20:51,822
gõ .schema có lẽ là một điều tốt\n

18146
17:20:52,752 --> 17:20:54,461
Và mọi thứ chỉ leo thang nhanh chóng.

18147
17:20:54,461 --> 17:20:56,981
Có rất nhiều thứ trong tập dữ liệu này\n, bởi vì, thực sự, có

18148
17:20:56,982 --> 17:21:01,092
sẽ là hàng chục trăm\n

18149
17:21:01,091 --> 17:21:04,572
và cả tập bài tập 7, nơi chúng ta sẽ\n

18150
17:21:06,262 --> 17:21:09,281
Vậy lược đồ\nchúng tôi đã tạo cho bạn là gì

18151
17:21:09,281 --> 17:21:12,491
từ dữ liệu thực tế của IMDb?

18152
17:21:12,491 --> 17:21:14,292
Một, có một cái bàn tên là shows.

18153
17:21:14,292 --> 17:21:17,292
Và lưu ý rằng chúng tôi vừa thêm khoảng trắng\n

18154
17:21:17,292 --> 17:21:19,391
để làm cho nó dễ đọc hơn một chút về mặt phong cách.

18155
17:21:19,391 --> 17:21:23,322
Bảng hiển thị có cột ID\n, cột tiêu đề, năm

18156
17:21:23,322 --> 17:21:26,082
và tổng số\tập của một chương trình nhất định.

18157
17:21:26,082 --> 17:21:31,092
Và loại cột đó là\n

18158
17:21:31,091 --> 17:21:33,431
Vậy hóa ra\thực tế là có một vài dữ liệu khác nhau

18159
17:21:33,432 --> 17:21:39,192
những loại đáng lưu ý khi\n

18160
17:21:39,192 --> 17:21:43,512
Trên thực tế, trong SQLite có\nnăm kiểu dữ liệu và chỉ có năm kiểu

18161
17:21:43,512 --> 17:21:46,992
thật may mắn thay, một trong số đó thực sự là\n

18162
17:21:46,991 --> 17:21:50,351
số, là một dạng\nbắt được cho ngày và giờ

18163
17:21:50,351 --> 17:21:52,661
những thứ là số\nnhưng không chỉ là số nguyên

18164
17:21:52,661 --> 17:21:54,851
và không chỉ là số thực chẳng hạn.

18165
17:21:54,851 --> 17:21:58,362
Số thực là số chúng ta thường có\n

18166
17:21:58,362 --> 17:22:00,400
Tất nhiên, văn bản\nchỉ là văn bản, nhưng hãy chú ý

18167
17:22:00,400 --> 17:22:02,442
mà bạn không phải\nlo lắng về việc nó lớn đến mức nào.

18168
17:22:02,442 --> 17:22:04,452
Giống như trong Python, nó sẽ có kích thước phù hợp.

18169
17:22:04,451 --> 17:22:07,182
Và sau đó là BLOB, đối tượng lớn nhị phân,

18170
17:22:07,182 --> 17:22:10,641
chỉ dành cho các số 0 và 1 thô, như\ncho các tệp hoặc những thứ tương tự.

18171
17:22:10,641 --> 17:22:12,911
Nhưng nhìn chung chúng ta sẽ sử dụng\n4 cái còn lại trong số này.

18172
17:22:12,911 --> 17:22:16,301
Và quả thật vậy, khi chúng tôi\nhập dữ liệu này cho bạn

18173
17:22:16,302 --> 17:22:21,612
chúng tôi đã quyết định rằng mọi buổi biểu diễn sẽ\n

18174
17:22:21,612 --> 17:22:24,802
Tất nhiên, mỗi chương trình đều có\ntiêu đề không được để trống.

18175
17:22:24,802 --> 17:22:26,662
Nếu không thì tại sao nó lại có trong cơ sở dữ liệu?

18176
17:22:26,661 --> 17:22:30,171
Mỗi chương trình có một năm,\nđược đánh số theo

18177
17:22:30,171 --> 17:22:31,521
theo định nghĩa đó một lúc trước.

18178
17:22:31,521 --> 17:22:34,881
Và tổng số tập của\n

18179
17:22:34,881 --> 17:22:38,451
Bây giờ những khóa chính này là gì\n

18180
17:22:38,451 --> 17:22:43,432
Khóa chính là cột\n

18181
17:22:43,432 --> 17:22:46,461
Trong trường hợp của chúng tôi, với\nfavorites, tôi tự động

18182
17:22:46,461 --> 17:22:50,091
đã cung cấp cho mỗi bài gửi của bạn một điểm duy nhất\n

18183
17:22:50,091 --> 17:22:52,701
đã nhập vào The Office,\nnội dung gửi của bạn vẫn

18184
17:22:52,701 --> 17:22:57,651
có một mã định danh duy nhất, một con số\n

18185
17:22:57,652 --> 17:23:01,671
với thể loại của bạn, giống\nas chúng ta đã thấy cách đây một lát.

18186
17:23:01,671 --> 17:23:04,621
Trong phiên bản IMDb này\ncũng có nhiều thể loại.

18187
17:23:04,622 --> 17:23:07,461
Nhưng chúng không đến từ\nus, chúng đến từ IMDb.com.

18188
17:23:07,461 --> 17:23:11,661
Vì vậy, một thể loại có ID chương trình và\n

18189
17:23:11,661 --> 17:23:15,231
Tuy nhiên, đây là những thể loại trong thế giới thực\nđược lọc kỹ hơn một chút.

18190
17:23:15,232 --> 17:23:19,862
Tuy nhiên, hãy lưu ý, giống như\nphiên bản của tôi, có một khóa ngoại.

18191
17:23:19,862 --> 17:23:25,311
Khóa ngoại là sự xuất hiện\ncủa khóa chính của bảng khác

18192
17:23:27,391 --> 17:23:30,442
Vì vậy, khi bạn có một bảng\ncác thể loại giống như vậy, bằng cách nào đó

18193
17:23:30,442 --> 17:23:36,262
tham khảo chéo các chương trình gốc\n

18194
17:23:36,262 --> 17:23:40,612
được gọi là ID và những số tương tự\nxuất hiện trong bảng thể loại

18195
17:23:40,612 --> 17:23:45,592
dưới cột có tên là ID hiển thị, bởi\n

18196
17:23:45,591 --> 17:23:47,991
Đó là những con số giống nhau nhưng\nit có ý nghĩa xa lạ

18197
17:23:47,991 --> 17:23:50,601
rằng số đó đang được\nsử dụng trong bảng này

18198
17:23:50,601 --> 17:23:54,472
mặc dù nó đã được xác định chính thức\n

18199
17:23:54,472 --> 17:23:57,112
Đây chính là ý nghĩa của\ncơ sở dữ liệu quan hệ.

18200
17:23:57,112 --> 17:24:02,512
Bạn có nhiều bảng với một số\n

18201
17:24:02,512 --> 17:24:06,202
Và những con số đó cho phép bạn xếp hàng\n

18202
17:24:06,201 --> 17:24:09,381
rằng bạn có thể kết nối lại\ncác chương trình với thể loại của chúng

18203
17:24:09,381 --> 17:24:12,141
giống như chúng ta đã làm với tập dữ liệu\nnhỏ hơn cách đây không lâu.

18204
17:24:12,141 --> 17:24:14,391
Logic này được mở rộng hơn nữa.

18205
17:24:14,391 --> 17:24:18,411
Lưu ý rằng cơ sở dữ liệu IMDb mà chúng tôi\n

18206
17:24:18,411 --> 17:24:22,072
như các ngôi sao chương trình truyền hình, các diễn viên trong đó.

18207
17:24:22,072 --> 17:24:25,552
Và thật thú vị, cái bàn đó\nh lại không đề cập đến con người

18208
17:24:25,552 --> 17:24:27,562
và không đề cập đến các buổi biểu diễn.

18209
17:24:27,561 --> 17:24:31,072
Nó chỉ có một cột có tên\nhiển thị ID, là một số nguyên

18210
17:24:31,072 --> 17:24:33,561
và ID người, là một số nguyên.

18211
17:24:33,561 --> 17:24:39,661
Trong khi đó, nếu chúng ta cuộn\nxuống cuối

18212
17:24:39,661 --> 17:24:42,831
bạn sẽ thấy một bảng có tên là mọi người.

18213
17:24:42,832 --> 17:24:48,351
Và chúng ta đã quyết định trong thế giới của IMDb\n

18214
17:24:48,351 --> 17:24:52,851
sẽ có một mã định danh duy nhất\n

18215
17:24:52,851 --> 17:24:56,841
ngày, là số, và\nsau đó, một lần nữa, chỉ định ID đó

18216
17:24:56,841 --> 17:25:00,691
sẽ là khóa chính của họ.

18217
17:25:02,281 --> 17:25:07,981
Chà, hóa ra là các ngôi sao truyền hình và\n

18218
17:25:07,982 --> 17:25:13,072
Vì vậy, bằng cách sử dụng cơ sở dữ liệu quan hệ này,\n

18219
17:25:13,072 --> 17:25:15,112
Chúng tôi đang tính đến những điểm chung.

18220
17:25:15,112 --> 17:25:17,912
Và nếu một người có thể trở thành những điều khác biệt trong cuộc sống

18221
17:25:17,911 --> 17:25:20,601
chà, chúng tôi đang định nghĩa họ\ntrước hết là con người.

18222
17:25:20,601 --> 17:25:23,491
Và sau đó, hãy chú ý rằng hai\nbảng này gần như giống nhau.

18223
17:25:23,491 --> 17:25:26,002
Bảng sao có show\nID, là một số

18224
17:25:26,002 --> 17:25:28,012
và ID người,\là một số, mà

18225
17:25:28,012 --> 17:25:36,052
cho phép chúng tôi thông qua bảng trung gian này, nếu\n

18226
17:25:36,052 --> 17:25:41,422
Tương tự, bảng người viết cho phép\n

18227
17:25:41,421 --> 17:25:43,561
chỉ bằng cách ghi lại những con số đó.

18228
17:25:43,561 --> 17:25:46,322
Vì vậy, nếu chúng ta đi sâu vào tập dữ liệu\nnày, hãy thực hiện như sau.

18229
17:25:46,322 --> 17:25:49,682
Hãy chọn dấu sao\ntừ dấu chấm phẩy của mọi người.

18230
17:25:49,682 --> 17:25:52,372
Vì vậy, một lượng lớn dữ liệu đang quay trở lại.

18231
17:25:52,372 --> 17:25:56,822
Đây là hàng trăm nghìn hàng\n

18232
17:25:56,822 --> 17:25:59,661
Vì vậy, đây là dữ liệu trong thế giới thực\nhiện đang bay trên màn hình.

18233
17:25:59,661 --> 17:26:03,501
Có rất nhiều người trong chương trình truyền hình\n

18234
17:26:06,021 --> 17:26:07,318
Có rất nhiều dữ liệu ở đó.

18235
17:26:07,319 --> 17:26:09,652
Chúa ơi, nếu bạn phải làm\bất cứ điều gì thủ công trong dữ liệu này

18236
17:26:09,652 --> 17:26:12,002
thiết lập thì có lẽ nó sẽ không hoạt động tốt lắm.

18237
17:26:12,002 --> 17:26:14,932
Và trên thực tế, chúng tôi đang nhắm tới\na triệu người trong dữ liệu này

18238
17:26:14,932 --> 17:26:17,332
được đặt, cộng, điều đó có nghĩa\nđiều này thậm chí có thể không

18239
17:26:17,332 --> 17:26:20,932
sẽ mở rất tốt trong Excel, hoặc\n

18240
17:26:20,932 --> 17:26:23,042
SQL có lẽ là cách tiếp cận\ntốt hơn ở đây.

18241
17:26:23,042 --> 17:26:25,702
Hãy tìm kiếm ai đó\ncụ thể, chẳng hạn như chọn ngôi sao

18242
17:26:25,701 --> 17:26:31,401
từ mọi người, trong đó tên bằng\n

18243
17:26:32,044 --> 17:26:33,502
Được rồi, có Steve Carell.

18244
17:26:33,502 --> 17:26:39,442
Anh là người số\n136.797, sinh năm 1962.

18245
17:26:39,442 --> 17:26:41,882
Và đó là tất cả dữ liệu\nchúng tôi có về Steve Carell ở đây.

18246
17:26:41,881 --> 17:26:44,551
Làm thế nào để chúng ta biết được những gì\ncho thấy, chẳng hạn như anh ấy đang tham gia?

18247
17:26:44,552 --> 17:26:48,842
Nào, hãy xem, chọn\nngôi sao từ các chương trình, dấu chấm phẩy.

18248
17:26:48,841 --> 17:26:52,521
Có một số lượng lớn các chương trình\nkhông có trong cơ sở dữ liệu IMDb.

18249
17:26:52,521 --> 17:26:55,491
Và bạn có thể nhìn thấy nó ở đây\nbay ngang qua màn hình.

18250
17:26:55,491 --> 17:26:58,972
Có cảm giác như chúng ta sắp phải\n

18251
17:26:58,972 --> 17:27:02,402
để có mặt ở tất cả các buổi biểu diễn của Steve Carell.

18252
17:27:02,402 --> 17:27:04,562
Vậy chúng ta sẽ làm điều đó như thế nào?

18253
17:27:04,561 --> 17:27:07,072
Chúa ơi, có rất nhiều dữ liệu ở đây.

18254
17:27:07,072 --> 17:27:10,461
Và trên thực tế, vâng, chúng tôi có 15 triệu

18255
17:27:10,461 --> 17:27:12,622
cũng hiển thị điểm cộng trong tập dữ liệu này.

18256
17:27:12,622 --> 17:27:15,682
Vì vậy, thực hiện mọi việc một cách hiệu quả\nbây giờ sẽ bắt đầu trở nên quan trọng.

18257
17:27:17,131 --> 17:27:18,801
Hãy để tôi chọn một chương trình cụ thể.

18258
17:27:18,802 --> 17:27:23,932
Chọn ngôi sao từ các chương trình có tiêu đề\n

18259
17:27:23,932 --> 17:27:26,262
Và có lẽ\nkhông nên có lỗi chính tả trong dữ liệu này

18260
17:27:26,262 --> 17:27:28,812
vì nó đến từ trang web\nreal IMDb.com.

18261
17:27:30,341 --> 17:27:33,551
Hóa ra trên thế giới có rất nhiều\nVăn phòng.

18262
17:27:33,552 --> 17:27:37,512
Cái bắt đầu vào năm 2005\là cái mà chúng tôi muốn

18263
17:27:37,512 --> 17:27:40,332
có lẽ là\nphổ biến nhất với 188 tập.

18264
17:27:41,561 --> 17:27:46,991
Có lẽ chúng ta có thể làm và năm\không bằng, còn năm 2005 thì sao?

18265
17:27:46,991 --> 17:27:50,591
Được rồi, bây giờ chúng ta đã lấy lại được\nID của The Office

18266
17:27:52,572 --> 17:27:55,451
Hãy để tôi bật bộ hẹn giờ\ntrong SQLite

18267
17:27:55,451 --> 17:27:57,131
để có được cảm giác về thời gian đang chạy.

18268
17:27:58,451 --> 17:28:01,391
Chọn ngôi sao từ các chương trình, trong đó\ntitle bằng The Office

18269
17:28:04,192 --> 17:28:05,711
Bây giờ chúng ta hãy chỉ làm tiêu đề.

18270
17:28:06,792 --> 17:28:08,802
Được rồi, không lâu lắm đâu.

18271
17:28:08,802 --> 17:28:12,332
Nó tìm thấy nó khá nhanh, nhưng có vẻ như\n

18272
17:28:12,332 --> 17:28:15,351
0,02 giây, không tệ cho một tiêu đề.

18273
17:28:15,351 --> 17:28:18,551
Nhưng chỉ cần gieo một hạt giống, hóa ra chúng ta có thể

18274
17:28:20,271 --> 17:28:23,561
Hãy để tôi tạo một thứ gọi là\n

18275
17:28:23,561 --> 17:28:25,511
trong CRUD để tạo ra thứ gì đó.

18276
17:28:25,512 --> 17:28:28,152
Và tôi sẽ gọi đây là chỉ mục tiêu đề.

18277
17:28:28,152 --> 17:28:32,682
Và tôi sẽ tạo\nit trên bảng hiển thị

18278
17:28:32,682 --> 17:28:34,614
cụ thể ở cột tiêu đề.

18279
17:28:34,614 --> 17:28:37,031
Và lát nữa chúng ta sẽ xem\nđiều này sẽ có tác dụng gì với tôi.

18280
17:28:38,262 --> 17:28:42,472
Mất một lúc, khoảng 0,349 giây,\n

18281
17:28:42,472 --> 17:28:46,932
Nhưng bây giờ hãy xem, nếu tôi chọn ngôi sao từ\n

18282
17:28:46,932 --> 17:28:49,572
trước đây tôi mất 0,021 giây.

18283
17:28:53,021 --> 17:28:56,531
Thực sự là không có thời gian, hoặc quá thấp\n

18284
17:28:56,531 --> 17:28:58,811
Và tôi sẽ làm lại chỉ\nđể hiểu được mọi thứ.

18285
17:29:00,201 --> 17:29:05,362
Bây giờ dù chỉ là 0,021 giây nhưng cũng không điên rồ\n

18286
17:29:05,362 --> 17:29:07,902
rất nhiều người dùng đang chạy một\ntrang web thực hoặc ứng dụng di động thực.

18287
17:29:07,902 --> 17:29:11,322
Mỗi mili giây chúng ta có thể bắt đầu\n

18288
17:29:13,152 --> 17:29:17,171
Thực ra chúng tôi vừa tạo\nthứ gọi là chỉ mục.

18289
17:29:17,171 --> 17:29:19,301
Và đây là một cách hay\nđể gắn kết, bây giờ, một số

18290
17:29:19,302 --> 17:29:21,762
trong cuộc thảo luận tuần 5 của chúng ta\no về cấu trúc dữ liệu

18291
17:29:21,762 --> 17:29:23,592
và cuộc thảo luận tuần 3 của chúng tôi về thời gian chạy.

18292
17:29:23,591 --> 17:29:26,621
Một chỉ mục trong cơ sở dữ liệu là\nmột loại dữ liệu ưa thích nào đó

18293
17:29:26,622 --> 17:29:31,452
cấu trúc cho phép cơ sở dữ liệu\n

18294
17:29:31,451 --> 17:29:35,921
Theo nghĩa đen, như bạn vừa thấy, những thứ này\n

18295
17:29:37,491 --> 17:29:39,641
Và vì thế khi tôi\ntìm kiếm The Office lần đầu tiên

18296
17:29:39,641 --> 17:29:43,122
nó thực sự đang thực hiện tìm kiếm tuyến tính,\n

18297
17:29:46,211 --> 17:29:48,671
Nó không chậm đến thế, 0,021 giây.

18298
17:29:48,671 --> 17:29:52,362
Nhưng tốc độ đó tương đối chậm\nvề mặt lý thuyết, thuật toán

18299
17:29:53,921 --> 17:29:57,432
Nhưng thay vào đó, nếu bạn tạo chỉ mục\nan bằng cú pháp

18300
17:29:57,432 --> 17:30:03,222
như thế này, điều tôi vừa làm, tạo một\n

18301
17:30:03,222 --> 17:30:06,561
bảng, điều đó giống như cung cấp trước cho\ncơ sở dữ liệu một manh mối rằng

18302
17:30:06,561 --> 17:30:10,002
này, tôi biết tôi sẽ tìm kiếm\n

18303
17:30:10,002 --> 17:30:12,771
Làm điều gì đó với cấu trúc dữ liệu để tăng tốc mọi thứ.

18304
17:30:12,771 --> 17:30:15,371
Và vì vậy nếu bạn nghĩ lại cuộc thảo luận\thảo luận của chúng ta về cấu trúc dữ liệu

18305
17:30:17,061 --> 17:30:21,401
Có thể nó đang sử dụng trie hoặc hash\n

18306
17:30:21,402 --> 17:30:25,272
cấu trúc nhìn chung sẽ nâng cao\n

18307
17:30:26,152 --> 17:30:28,961
Vì vậy,\nviệc tìm kiếm dữ liệu sẽ nhanh hơn nhiều, đặc biệt là

18308
17:30:28,961 --> 17:30:31,841
nếu bây giờ nó đang sắp xếp\ndựa trên tiêu đề chứ không phải

18309
17:30:31,841 --> 17:30:33,371
chỉ lưu trữ nó trong một danh sách dài.

18310
17:30:33,372 --> 17:30:35,562
Và trên thực tế, trong thế giới\ncơ sở dữ liệu quan hệ

18311
17:30:35,561 --> 17:30:37,901
kiểu cấu trúc thường được sử dụng trong cơ sở dữ liệu

18312
17:30:37,902 --> 17:30:39,262
được gọi là cây B.

18313
17:30:40,512 --> 17:30:44,382
Cách sử dụng chữ B khác nhau, nhưng nó\n

18314
17:30:45,161 --> 17:30:47,021
Nó không phải là nhị phân vì\nmột số nút

18315
17:30:47,021 --> 17:30:50,231
có thể có nhiều hơn\nhai con hoặc ít hơn

18316
17:30:50,232 --> 17:30:53,532
nhưng nó là một cái cây rất rộng nhưng\ntương đối nông.

18317
17:30:55,332 --> 17:30:59,112
Và mặt trái của điều đó là nếu\n

18318
17:30:59,112 --> 17:31:01,402
cơ sở dữ liệu có thể tìm thấy nó nhanh hơn.

18319
17:31:01,402 --> 17:31:06,612
Và lý do khiến nó mất nửa giây,\n

18320
17:31:06,612 --> 17:31:10,601
là bởi vì SQLite cần phải mất\nmột khoảng thời gian khác 0

18321
17:31:10,601 --> 17:31:12,972
chỉ để xây dựng cây này trong bộ nhớ.

18322
17:31:12,972 --> 17:31:17,241
Và nó có các thuật toán để làm việc đó dựa trên\n

18323
17:31:17,241 --> 17:31:20,682
Nhưng bạn dành một chút thời gian\nlên phía trước, một phần ba giây.

18324
17:31:22,811 --> 17:31:25,811
Mỗi truy vấn tiếp theo, nếu tôi\ntiếp tục thực hiện lại việc đó

18325
17:31:25,811 --> 17:31:29,381
sẽ rất điên rồ\nthấp, 0,000, có thể là 0,001.

18326
17:31:29,381 --> 17:31:33,581
Nhưng một bậc độ lớn,\nnhanh hơn nó 10 hoặc 100 lần

18327
17:31:36,131 --> 17:31:39,701
Vì vậy, chúng tôi có những chỉ mục này\cho phép chúng tôi lấy dữ liệu nhanh hơn.

18328
17:31:39,701 --> 17:31:42,671
Nhưng điều gì sẽ xảy ra nếu chúng ta\thực sự muốn nhận được dữ liệu

18329
17:31:42,671 --> 17:31:44,711
bây giờ trên nhiều bảng này?

18330
17:31:45,582 --> 17:31:48,402
Và những chỉ mục\cũng như chỉ mục này có thể giúp ích thêm như thế nào?

18331
17:31:48,402 --> 17:31:52,241
Chà, hóa ra có\na cách mà chúng ta đã thấy rồi

18332
17:31:52,241 --> 17:31:54,851
gián tiếp để nối hai bảng lại với nhau.

18333
17:31:54,851 --> 17:31:58,752
Trước đây, khi tôi chọn\nID của The Office

18334
17:31:58,752 --> 17:32:03,082
và sau đó tôi tìm kiếm nó ở nơi khác\n

18335
17:32:03,082 --> 17:32:05,752
Tôi đã tham gia hai bảng với nhau.

18336
17:32:05,752 --> 17:32:08,241
Và hóa ra có\ncách để thực hiện việc này.

18337
17:32:08,241 --> 17:32:11,891
Bây giờ chúng ta hãy tiếp tục và, chẳng hạn,\n

18338
17:32:11,891 --> 17:32:14,021
Không chỉ The Office\nmà tất cả bọn họ nữa.

18339
17:32:14,021 --> 17:32:21,656
Thật không may, nếu chúng ta nhìn vào lược đồ của mình,\n

18340
17:32:21,656 --> 17:32:27,201
ồ, các chương trình ở đây không có\nđề cập đến các ngôi sao truyền hình trong đó.

18341
17:32:27,201 --> 17:32:30,471
Và mọi người không đề cập đến các chương trình.

18342
17:32:30,472 --> 17:32:34,702
Bằng cách nào đó chúng ta cần sử dụng\ntable này ở đây để kết nối cả hai.

18343
17:32:34,701 --> 17:32:40,161
Và đây được gọi là bảng nối, trong\n

18344
17:32:40,161 --> 17:32:43,131
nó nối hai bảng\nvới nhau một cách hợp lý.

18345
17:32:43,131 --> 17:32:47,091
Và vì vậy nếu bạn đủ hiểu biết về SQL,\n

18346
17:32:47,091 --> 17:32:51,351
trước đó và thích kết hợp lại\nbảng bằng cách sử dụng các ID chung này

18347
17:32:53,671 --> 17:32:58,072
Hãy để tôi tiếp tục và tìm hiểu,\n

18348
17:32:58,072 --> 17:32:59,311
Vậy tôi sẽ làm điều này như thế nào?

18349
17:32:59,311 --> 17:33:04,461
Chà, nếu tôi chọn ngôi sao từ mọi người,\n

18350
17:33:04,461 --> 17:33:06,182
may mắn thay, chỉ có một trong số họ.

18351
17:33:06,182 --> 17:33:12,141
Vì vậy, điều này sẽ trả lại cho tôi tên,\nhấy ID và năm sinh của anh ấy.

18352
17:33:12,141 --> 17:33:14,302
Nhưng thực sự chỉ có\nID của anh ấy là điều tôi quan tâm.

18353
17:33:15,021 --> 17:33:20,841
Bởi vì để lấy lại những buổi diễn của anh ấy,\n

18354
17:33:20,841 --> 17:33:22,981
Vì vậy tôi cần biết số ID của anh ấy.

18355
17:33:22,982 --> 17:33:24,932
Vậy tôi có thể làm gì với điều này?

18356
17:33:24,932 --> 17:33:29,572
Chà, hãy nhớ lược đồ\nvà bảng sao.

18357
17:33:29,572 --> 17:33:33,171
Tôi vừa nhận được từ bảng\nngười, ID của Steve Carell.

18358
17:33:33,171 --> 17:33:38,871
Tôi cá bằng tính bắc cầu tôi có thể\nbây giờ sử dụng ID cá nhân của anh ấy, ID của anh ấy

18359
17:33:38,872 --> 17:33:41,242
để lấy lại tất cả ID chương trình của anh ấy.

18360
17:33:41,241 --> 17:33:44,511
Và sau khi tôi đã xem hết buổi trình diễn của anh ấy\n

18361
17:33:44,512 --> 17:33:46,672
và lấy lại tất cả các tựa phim trong chương trình của anh ấy.

18362
17:33:46,671 --> 17:33:50,781
Vậy câu trả lời thực ra là tiếng Anh\n

18363
17:33:51,631 --> 17:33:52,981
Vậy hãy để tôi tiếp tục và làm điều này.

18364
17:33:52,982 --> 17:33:57,082
Hãy để tôi lấy lại số ID của Steve\nCarell nhưng không phải dấu sao.

18365
17:33:58,402 --> 17:34:00,952
Đó là ký tự đại diện trong SQL.

18366
17:34:00,951 --> 17:34:03,651
Hãy để tôi chọn\nID của Steve Carell.

18367
17:34:03,652 --> 17:34:06,982
Và điều đó mang lại cho tôi 136.797.

18368
17:34:06,982 --> 17:34:08,782
Và nó chỉ mang lại cho tôi một giá trị.

18369
17:34:08,781 --> 17:34:12,051
Thứ được gọi là ID chỉ là\ncột tiêu đề phía trên.

18370
17:34:12,052 --> 17:34:16,702
Bây giờ, giả sử tôi muốn\nchọn tất cả ID chương trình

18371
17:34:16,701 --> 17:34:18,801
mà Steve Carell có liên kết.

18372
17:34:18,802 --> 17:34:25,912
Hãy để tôi chọn Hiển thị ID theo dấu sao,\ntrong đó ID người đó theo dấu sao

18373
17:34:25,911 --> 17:34:28,822
tình cờ trùng với ID của Steve Carell.

18374
17:34:28,822 --> 17:34:32,661
Vì vậy, một lần nữa, tôi đang xây dựng câu trả lời của mình trong\n

18375
17:34:32,661 --> 17:34:36,771
Ở bên phải, trong ngoặc đơn,\nTôi nhận được ID của Steve Carell.

18376
17:34:36,771 --> 17:34:40,671
Ở bên trái, tôi hiện\nđang chọn tất cả ID chương trình

18377
17:34:40,671 --> 17:34:44,752
có mối liên hệ nào đó với\n

18378
17:34:44,752 --> 17:34:47,192
Câu trả lời này cũng sẽ không sáng tỏ đến thế.

18379
17:34:47,192 --> 17:34:50,762
Đó chỉ là một loạt các số nguyên\n

18380
17:34:50,762 --> 17:34:53,112
Nhưng hãy tiến thêm một bước nữa.

18381
17:34:53,112 --> 17:34:54,862
Và mặc dù\ncode của tôi ngày càng dài, tôi

18382
17:34:54,862 --> 17:34:57,262
có thể nhấn Enter và định dạng\nit một cách độc đáo, đặc biệt

18383
17:34:57,262 --> 17:34:59,002
nếu tôi đang làm điều này trong một tệp mã.

18384
17:34:59,002 --> 17:35:00,921
Nhưng hiện tại tôi chỉ đang làm việc đó\nmột cách tương tác.

18385
17:35:00,921 --> 17:35:04,761
Bây giờ chúng ta hãy chọn tất cả\ntiêu đề từ bảng hiển thị

18386
17:35:04,762 --> 17:35:13,442
nơi ID của chương trình nằm trong\ntruy vấn tiếp theo trước đó.

18387
17:35:13,442 --> 17:35:15,082
Vì vậy, một lần nữa, truy vấn lại trở nên dài dòng.

18388
17:35:15,082 --> 17:35:17,542
Nhưng hãy lưu ý, đây là\nbước cuối cùng.

18389
17:35:17,542 --> 17:35:21,292
Chọn tiêu đề từ bảng chương trình\n, trong đó ID của chương trình

18390
17:35:21,292 --> 17:35:23,932
nằm trong danh sách tất cả\nID chương trình

18391
17:35:23,932 --> 17:35:27,381
đã trở lại từ bảng sao\n

18392
17:35:27,381 --> 17:35:28,822
Làm sao chúng tôi có được ID người đó?

18393
17:35:30,021 --> 17:35:36,502
Ừm, tôi đã chọn, trong thâm tâm\n

18394
17:35:36,502 --> 17:35:38,781
Vì vậy, bây giờ, khi tôi nhấn Enter, thì đấy.

18395
17:35:38,781 --> 17:35:41,866
Tôi xem được tất cả các chương trình\nTV của Steve Carell cho đến nay.

18396
17:35:41,866 --> 17:35:44,991
Và nếu tôi muốn dọn dẹp thêm nữa,\n

18397
17:35:47,521 --> 17:35:50,881
Bây giờ tôi đã có tất cả\n bảng chữ cái như trước đây.

18398
17:35:50,881 --> 17:35:53,421
Một lần nữa, SQL đi kèm với khả năng tìm kiếm--

18399
17:35:53,421 --> 17:35:56,631
Ý tôi là, hãy nhìn xem chúng ta làm việc này nhanh như thế nào\n, 0,094 giây

18400
17:35:56,631 --> 17:35:59,991
để tìm kiếm trên ba bảng\n khác nhau để tìm ra câu trả lời này.

18401
17:35:59,991 --> 17:36:04,161
Nhưng dữ liệu của tôi bây giờ đã được thiết kế gọn gàng\ntrong các bảng riêng lẻ

18402
17:36:04,161 --> 17:36:07,341
điều này sẽ quan trọng\n

18403
17:36:07,341 --> 17:36:09,681
Nhưng hãy để tôi tiến thêm một bước nữa.

18404
17:36:09,682 --> 17:36:12,271
Hãy để tôi tiếp tục và làm điều này.

18405
17:36:12,271 --> 17:36:16,921
Hãy để tôi tiếp tục và chỉ ra\nđiều đó với truy vấn này

18406
17:36:16,921 --> 17:36:20,211
để ý rằng tôi đang tìm kiếm--

18407
17:36:20,211 --> 17:36:24,051
giả sử tôi đang tìm kiếm\không phải ID người ở đây.

18408
17:36:24,052 --> 17:36:27,752
Và ở cuối đây, tôi\nđang tìm kiếm trên cột tên ở đây.

18409
17:36:27,752 --> 17:36:30,572
Vì vậy, hãy để tôi thực sự tiếp tục và làm điều này.

18410
17:36:30,572 --> 17:36:34,851
Hãy để tôi tiếp tục và xem\n liệu chúng ta có thể tăng tốc độ này hay không.

18411
17:36:34,851 --> 17:36:38,432
Truy vấn này hiện\n mất 0,092 giây.

18412
17:36:38,432 --> 17:36:41,271
Hãy xem liệu chúng ta có thể tăng tốc độ này không\n

18413
17:36:41,271 --> 17:36:44,271
thêm một vài cây B trong bộ nhớ cơ sở dữ liệu.

18414
17:36:44,271 --> 17:36:49,581
Tạo một chỉ mục có tên là chỉ mục người và\n

18415
17:36:52,192 --> 17:36:53,830
Phải mất một lúc, mất một lúc.

18416
17:36:53,830 --> 17:36:56,122
Gần đầy một giây\nvì đó là một cái bàn lớn.

18417
17:36:56,122 --> 17:37:00,391
Hãy tạo một chỉ mục khác có tên\nhiển thị chỉ mục trên bảng sao.

18418
17:37:00,891 --> 17:37:03,292
Bởi vì tôi cũng muốn tìm kiếm\ntheo ID chương trình.

18419
17:37:03,292 --> 17:37:05,122
Đó là một phần trong truy vấn lớn của tôi.

18420
17:37:06,002 --> 17:37:09,152
Được rồi, chỉ hơn\nkhoảng 2/3 giây.

18421
17:37:09,152 --> 17:37:11,781
Bây giờ hãy tạo một chỉ mục cuối cùng,\nanother chỉ mục được gọi là chỉ mục tên

18422
17:37:11,781 --> 17:37:14,502
nhưng tôi có thể gọi những thứ này\n

18423
17:37:14,902 --> 17:37:16,891
Bởi vì tôi cũng đang tìm kiếm\không phải cột tên.

18424
17:37:16,891 --> 17:37:19,072
Tóm lại, tôi\ntạo chỉ mục trên mỗi

18425
17:37:19,072 --> 17:37:22,792
trong số các cột có liên quan\nliên quan đến truy vấn tìm kiếm của tôi

18426
17:37:22,792 --> 17:37:25,022
đi từ bàn này sang bàn khác.

18427
17:37:25,021 --> 17:37:32,932
Bây giờ chúng ta hãy quay lại truy vấn\n trước đó, mà, nhớ lại, đã--

18428
17:37:36,112 --> 17:37:37,987
Chà, nó gần như\ntheo mức độ này.

18429
17:37:37,987 --> 17:37:39,482
Chúng tôi hiện không nhìn thấy dữ liệu.

18430
17:37:39,482 --> 17:37:42,502
Nhưng hãy để tôi tiếp tục và chạy\ntruy vấn lớn ban đầu của tôi một lần.

18431
17:37:42,502 --> 17:37:45,722
Và bùng nổ, chúng ta gần như chẳng còn gì cả.

18432
17:37:45,722 --> 17:37:48,202
Vì vậy, một lần nữa, việc tạo\ncác chỉ mục này trong bộ nhớ

18433
17:37:48,201 --> 17:37:52,981
có tác dụng nhanh chóng\ntăng tốc thời gian tính toán của chúng tôi.

18434
17:37:52,982 --> 17:37:56,482
Bây giờ, chẳng hạn, nếu bạn đã từng sử dụng\n

18435
17:37:56,482 --> 17:38:00,472
ở đây trong khuôn viên trường, hoặc tương tự như ở Yale, bạn\n

18436
17:38:00,472 --> 17:38:04,671
Đây có thể là một trong những lý do tại sao\n

18437
17:38:04,671 --> 17:38:07,011
hàng ngàn khóa học\ntcó xu hướng chậm, nếu

18438
17:38:07,012 --> 17:38:10,222
và tôi chỉ phỏng đoán, nếu\n

18439
17:38:10,222 --> 17:38:12,232
Nếu bạn đang xây dựng ứng dụng web\now của mình

18440
17:38:12,232 --> 17:38:14,512
và bạn nhận thấy rằng người dùng\na đang chờ đợi và chờ đợi

18441
17:38:14,512 --> 17:38:17,632
và mọi thứ cứ quay mãi,\n

18442
17:38:17,631 --> 17:38:21,112
Chà, nó hoàn toàn có thể tệ\n

18443
17:38:21,112 --> 17:38:23,612
Hoặc có thể là bạn chưa nghĩ tới, à

18444
17:38:23,612 --> 17:38:27,112
cột nào cần được tối ưu hóa\ncho tìm kiếm và lọc

18445
17:38:27,112 --> 17:38:31,046
như tôi đã làm ở đây để\ntăng tốc các truy vấn tiếp theo?

18446
17:38:31,046 --> 17:38:33,171
Một lần nữa, từ bên ngoài\n, chúng ta chỉ có thể phỏng đoán.

18447
17:38:33,171 --> 17:38:36,921
Nhưng cuối cùng, đây\nchỉ là một trong những điều

18448
17:38:36,921 --> 17:38:39,650
cũng giải thích các vấn đề về hiệu suất.

18449
17:38:39,650 --> 17:38:42,442
Được rồi, hãy chỉ ra một\n

18450
17:38:42,442 --> 17:38:45,112
và sau đó chúng ta sẽ xem xét\nbức tranh lớn hơn, một số vấn đề

18451
17:38:45,112 --> 17:38:47,451
điều đó có thể xảy ra trên thế giới này.

18452
17:38:47,451 --> 17:38:52,221
Nếu các truy vấn lồng nhau này\nbắt đầu nhận được nhiều hơn một chút

18453
17:38:52,222 --> 17:38:54,502
có nhiều cách khác\nchỉ để bạn thấy thôi

18454
17:38:54,502 --> 17:38:57,262
rằng bạn có thể thực thi\nlogic tương tự trong SQL.

18455
17:38:57,262 --> 17:38:59,752
Ví dụ, nếu tôi\nbiết trước rằng tôi

18456
17:38:59,752 --> 17:39:04,732
muốn kết nối Steve Carell với\n

18457
17:39:04,732 --> 17:39:06,532
chúng ta có thể làm điều gì đó giống thế này hơn.

18458
17:39:06,531 --> 17:39:17,391
Chọn tiêu đề từ bảng người,\n

18459
17:39:21,832 --> 17:39:25,124
Và một lần nữa, đây không phải là thứ bạn sẽ\n

18460
17:39:25,124 --> 17:39:29,422
Nhưng chỉ để bạn thấy khác\n

18461
17:39:30,502 --> 17:39:35,031
Đây là một cách rõ ràng để nói, lấy\n

18462
17:39:35,031 --> 17:39:37,371
mặt khác,\nvà bằng cách nào đó hãy tham gia cùng họ

18463
17:39:37,372 --> 17:39:39,332
như tôi vẫn tiếp tục làm với những đầu ngón tay của mình ở đây.

18464
17:39:40,951 --> 17:39:45,711
Tham gia cùng họ để mọi người, ID\n

18465
17:39:45,711 --> 17:39:48,601
với ID người trong bảng sao.

18466
17:39:48,601 --> 17:39:50,601
Nhưng đó không hẳn là tất cả.

18467
17:39:50,601 --> 17:39:54,082
Tôi cũng có thể nói, hãy tham gia\nthêm vào bảng chương trình

18468
17:39:54,082 --> 17:40:00,632
trong đó các ngôi sao hiển thị ID\nebằng cột ID hiển thị.

18469
17:40:01,881 --> 17:40:11,331
Điều đó có nghĩa là hãy tiến xa hơn và tham gia\n

18470
17:40:11,332 --> 17:40:14,332
nối cột ID\n hiển thị với cột ID.

18471
17:40:14,332 --> 17:40:17,092
Một lần nữa, điều này bắt đầu khiến bạn hơi bối rối khi nghĩ đến.

18472
17:40:17,091 --> 17:40:21,171
Nhưng bây giờ tôi chỉ có thể nói, tên ở đâu\n

18473
17:40:21,171 --> 17:40:24,411
Tôi có thể thực hiện một truy vấn những gì trước đây\n

18474
17:40:24,411 --> 17:40:25,941
và nhận lại những câu trả lời tương tự.

18475
17:40:25,942 --> 17:40:30,722
Và tôi vẫn có thể thêm vào đơn hàng\ntheo tiêu đề của mình để lấy lại kết quả.

18476
17:40:30,722 --> 17:40:35,122
Và nếu tôi làm điều này nhiều hơn một chút\n

18477
17:40:36,091 --> 17:40:41,961
Hãy để tôi gõ cái này bằng cách thêm một\n

18478
17:40:41,961 --> 17:40:43,461
Bây giờ tôi sẽ để nó một mình.

18479
17:40:43,461 --> 17:40:46,042
Chúng ta có thể gõ nó trên nhiều\ndòng trong các ngữ cảnh khác.

18480
17:40:46,042 --> 17:40:49,042
Và hãy để tôi làm một điều cuối cùng.

18481
17:40:50,353 --> 17:40:52,311
Tôi sẽ cho nó xem,\nnhưng đây không phải là thứ gì đó

18482
17:40:52,311 --> 17:40:53,781
bạn cũng nên ăn sâu vào.

18483
17:40:53,781 --> 17:40:56,961
Chọn tiêu đề từ\nngười, ngôi sao và chương trình.

18484
17:40:56,961 --> 17:41:00,201
Nếu bạn biết trước rằng bạn muốn\n

18485
17:41:00,201 --> 17:41:03,471
bạn chỉ có thể liệt kê chúng,\không tên bảng nào nối tiếp tên bảng kia.

18486
17:41:03,472 --> 17:41:08,838
Sau đó, bạn có thể nói nơi\npeople.ID bằng stars.personID.

18487
17:41:08,838 --> 17:41:10,671
Và bây giờ tôi đang nhấn\nEnter để nó định dạng

18488
17:41:10,671 --> 17:41:12,411
dễ đọc hơn một chút trên màn hình của tôi.

18489
17:41:12,411 --> 17:41:20,481
Và stars.showID bằng shows.ID,\n

18490
17:41:20,482 --> 17:41:25,072
Tóm lại, bạn xác định rằng bạn\n

18491
17:41:26,031 --> 17:41:31,792
Và sau đó bạn cho cơ sở dữ liệu biết cách\n

18492
17:41:31,792 --> 17:41:35,031
nghĩa là các cột có chung các số nguyên đó.

18493
17:41:35,031 --> 17:41:38,061
Nếu tôi nhấn Enter ngay bây giờ,\ntôi sẽ nhận được\nkết quả chính xác như vậy, bao giờ hết

18494
17:41:38,061 --> 17:41:41,451
hơn thế nữa nếu tôi cũng thêm\nmột đơn hàng theo tiêu đề.

18495
17:41:43,612 --> 17:41:45,531
Đó là lý do tại sao tôi\nkhông muốn làm điều này sớm hơn.

18496
17:41:45,531 --> 17:41:48,531
Tôi phải xem lại lịch sử của mình\n

18497
17:41:48,531 --> 17:41:49,981
truy vấn nhiều dòng lần này.

18498
17:41:52,622 --> 17:41:56,707
Nhưng điều này chỉ để nói rằng, thậm chí\n

18499
17:41:56,707 --> 17:41:59,332
phức tạp hơn, và chúng tôi đặt\nmột số ở đây, một số

18500
17:41:59,332 --> 17:42:03,472
ở đây, một số ở đây để\n

18501
17:42:03,472 --> 17:42:07,252
giống như đặt dấu phẩy vào dữ liệu, chúng ta\n

18502
17:42:07,252 --> 17:42:09,622
mà chúng tôi có thể muốn trên\nnhững bảng này.

18503
17:42:09,622 --> 17:42:13,922
Và bằng cách sử dụng các chỉ mục, chúng tôi có thể\ntăng tốc đáng kể các quá trình này

18504
17:42:13,921 --> 17:42:17,481
để xử lý số lượng người dùng gấp 10 lần\n, số lượng người dùng gấp 100 lần

18505
17:42:17,482 --> 17:42:19,012
trên cùng một cơ sở dữ liệu thực tế.

18506
17:42:19,012 --> 17:42:20,362
Sẽ có một nhược điểm.

18507
17:42:20,362 --> 17:42:22,881
Và nghĩ lại cuộc thảo luận của chúng ta về thuật toán và dữ liệu

18508
17:42:22,881 --> 17:42:27,461
cấu trúc trong những tuần qua, điều gì có thể xảy ra\n

18509
17:42:27,461 --> 17:42:31,451
Bởi vì tính đến thời điểm hiện tại, tôi đã tạo ra bốn\n

18510
17:42:31,451 --> 17:42:34,901
cột tiêu đề và\nmột số cột khác nữa.

18511
17:42:34,902 --> 17:42:37,272
Tại sao tôi không tiếp tục\và lập chỉ mục mọi thứ

18512
17:42:37,271 --> 17:42:39,731
nếu nó rõ ràng đang tăng tốc mọi thứ?

18513
17:42:41,112 --> 17:42:44,232
Bất cứ lúc nào bạn bắt đầu được hưởng lợi\n

18514
17:42:44,232 --> 17:42:47,292
rất có thể bạn đang hy sinh\nkhông gian hoặc ngược lại.

18515
17:42:47,292 --> 17:42:50,741
Và có lẽ việc lập chỉ mục hoàn toàn\nmọi thứ đều hơi ngớ ngẩn

18516
17:42:50,741 --> 17:42:54,771
bởi vì bạn sẽ lãng phí nhiều hơn\n

18517
17:42:54,771 --> 17:42:56,951
Vì vậy, việc tìm ra điểm uốn\nđúng ở đâu

18518
17:42:56,951 --> 17:43:01,752
là một phần của quá trình thiết kế và\n

18519
17:43:01,752 --> 17:43:06,252
Thật không may, rất nhiều\n

18520
17:43:06,252 --> 17:43:10,211
và họ tiếp tục ở trong thực tế\n

18521
17:43:10,211 --> 17:43:12,101
Và trên thực tế, từ giờ trở đi, nếu bạn đang đọc

18522
17:43:12,101 --> 17:43:16,871
đôi điều mang tính kỹ thuật về cơ sở dữ liệu SQL,\n

18523
17:43:16,872 --> 17:43:20,002
và mật khẩu bị rò rỉ,\thật không may, lại thường xuyên như vậy

18524
17:43:20,002 --> 17:43:22,847
đó là do cái được gọi là tấn công tiêm nhiễm SQL.

18525
17:43:22,847 --> 17:43:24,972
Và bây giờ chỉ để mang lại cho bạn cảm giác về sự cân bằng

18526
17:43:24,972 --> 17:43:26,930
có lẽ [KHÔNG NGHE ĐƯỢC] sự nhiệt tình\nnhư, ồ, cái đó

18527
17:43:26,930 --> 17:43:28,961
thật tuyệt vời khi chúng tôi có thể\nthực hiện mọi việc nhanh chóng như vậy.

18528
17:43:28,961 --> 17:43:32,021
Với sức mạnh to lớn,\ntrách nhiệm cũng đi kèm với thế giới này.

18529
17:43:32,021 --> 17:43:34,661
Và rất nhiều người đưa\nlỗi vào mã của họ

18530
17:43:34,661 --> 17:43:42,501
bằng cách không đánh giá cao nó như thế nào\n

18531
17:43:43,732 --> 17:43:46,542
Ví dụ: đây là màn hình đăng nhập điển hình của Yale.

18532
17:43:46,542 --> 17:43:49,122
Và đây là ví dụ tương tự cho\nHarvard nơi bạn được nhắc

18533
17:43:49,122 --> 17:43:51,792
có lẽ mỗi ngày, cho\ntên người dùng và mật khẩu của bạn

18534
17:43:51,792 --> 17:43:53,802
địa chỉ email và\nmật khẩu của bạn tại đây.

18535
17:43:53,802 --> 17:43:57,762
Tuy nhiên, giả sử rằng\nđằng sau trang đăng nhập này

18536
17:43:57,762 --> 17:44:00,372
dù là của Harvard hay Yale,\ncũng có một số trang web.

18537
17:44:00,372 --> 17:44:03,612
Và trang web đó đang sử dụng\nSQL bên dưới

18538
17:44:03,612 --> 17:44:06,042
để lưu trữ tất cả\ncủa người Harvard hoặc Yale

18539
17:44:06,042 --> 17:44:09,281
tên người dùng, mật khẩu, số ID\n, khóa học, bảng điểm

18540
17:44:10,311 --> 17:44:12,822
Vậy là có cơ sở dữ liệu SQL\nằm bên dưới trang web.

18541
17:44:12,822 --> 17:44:15,701
Chà, điều gì có thể xảy ra\nsai với quy trình này?

18542
17:44:15,701 --> 17:44:18,191
Thật không may, có\nmột số cú pháp đặc biệt trong SQL

18543
17:44:18,192 --> 17:44:19,872
giống như có trong C và Python.

18544
17:44:19,872 --> 17:44:22,302
Ví dụ: cũng có\nnhận xét trong SQL.

18545
17:44:22,302 --> 17:44:26,022
Nếu bạn sử dụng hai dấu gạch nối, dấu gạch ngang,\nd dấu gạch ngang, thì đó là nhận xét trong SQL.

18546
17:44:26,021 --> 17:44:31,511
Và nếu bạn, lập trình viên, không\n

18547
17:44:31,512 --> 17:44:34,902
để bạn bảo vệ khỏi\ncác cuộc tấn công có thể có hại

18548
17:44:34,902 --> 17:44:36,502
bạn có thể làm điều gì đó như thế này

18549
17:44:36,502 --> 17:44:41,412
Giả sử tôi đăng nhập một cách có phần ác ý hoặc tò mò

18550
17:44:41,411 --> 17:44:44,471
bằng cách nhập tên người dùng của tôi,\nMalan@harvard.edu, và sau đó có thể

18551
17:44:44,472 --> 17:44:46,332
một trích dẫn duy nhất và một dấu gạch ngang, dấu gạch ngang.

18552
17:44:47,021 --> 17:44:50,201
Bởi vì tôi đang cố gắng tìm hiểu\nnếu có lỗ hổng ở đây

18553
17:44:53,252 --> 17:44:56,502
Nhưng nếu tôi là chủ sở hữu của trang web\n

18554
17:44:56,502 --> 17:45:00,641
Tôi có thể thử sử dụng các ký tự có khả năng\nguy hiểm trong dữ liệu nhập của mình.

18555
17:45:01,631 --> 17:45:05,682
Bởi vì trích dẫn đơn được sử dụng cho\n

18556
17:45:05,682 --> 17:45:07,152
dấu ngoặc đơn hoặc dấu ngoặc kép.

18557
17:45:07,152 --> 17:45:10,272
Dấu gạch ngang, dấu gạch ngang, tôi khẳng định bây giờ,\nđược dùng để bình luận.

18558
17:45:10,271 --> 17:45:13,301
Nhưng bây giờ chúng ta hãy tưởng tượng\nmã bên dưới mui xe là gì

18559
17:45:13,302 --> 17:45:17,502
có thể dành cho thông tin đăng nhập như\nYale hoặc thông tin đăng nhập của Harvard.

18560
17:45:17,502 --> 17:45:19,942
Điều gì sẽ xảy ra nếu mã trông như thế này?

18561
17:45:19,942 --> 17:45:21,882
Vì vậy, hãy để tôi đọc nó từ trái sang phải.

18562
17:45:21,881 --> 17:45:26,051
Giả sử họ đang sử dụng thứ gì đó\n

18563
17:45:26,052 --> 17:45:28,572
và họ đã nhập một số lệnh SQL\nvào trang web

18564
17:45:28,572 --> 17:45:32,502
nói chọn sao từ người dùng,\ntrong đó tên người dùng bằng với điều này

18565
17:45:34,391 --> 17:45:37,851
Và họ đang cắm\ntên người dùng và mật khẩu.

18566
17:45:38,949 --> 17:45:41,531
Chà, khi người dùng nhập mật khẩu\nusername của họ, hãy nhấn Enter

18567
17:45:41,531 --> 17:45:44,262
Có lẽ tôi muốn chọn\nngười dùng đó từ cơ sở dữ liệu của mình

18568
17:45:44,262 --> 17:45:46,362
để xem tên người dùng\nand mật khẩu có khớp không.

18569
17:45:46,362 --> 17:45:49,061
Vì vậy, SQL\ncơ bản có thể là, chọn sao

18570
17:45:49,061 --> 17:45:51,131
từ người dùng, trong đó tên người dùng\nebằng dấu chấm hỏi

18571
17:45:51,131 --> 17:45:52,548
và mật khẩu bằng dấu chấm hỏi.

18572
17:45:57,341 --> 17:46:02,771
Và nếu chúng ta quay lại một hàng,\ncó lẽ là Malan@harvard.edu

18573
17:46:04,311 --> 17:46:06,531
Chúng ta nên để anh ấy tiếp tục\ntừ đó trở đi.

18574
17:46:06,531 --> 17:46:10,481
Vì vậy, đó là một số mã giả, nếu\nbạn muốn, cho kịch bản này.

18575
17:46:10,482 --> 17:46:14,922
Tuy nhiên, điều gì sẽ xảy ra nếu mã này không phải\n

18576
17:46:14,921 --> 17:46:16,841
có và không sử dụng dấu hỏi?

18577
17:46:16,841 --> 17:46:20,098
Vì vậy, cú pháp dấu chấm hỏi\là một thứ SQL khá phổ biến

18578
17:46:20,099 --> 17:46:22,182
nơi các dấu chấm hỏi\nare được sử dụng làm phần giữ chỗ

18579
17:46:22,182 --> 17:46:24,732
giống như trong printf, phần trăm S là.

18580
17:46:24,732 --> 17:46:28,242
Nhưng hàm này, db.execute\ntừ thư viện của CS50

18581
17:46:28,241 --> 17:46:30,761
và các thư viện của bên thứ ba\nas cũng vậy

18582
17:46:30,762 --> 17:46:33,132
đang làm một số điều hay\nvới những dấu chấm hỏi này

18583
17:46:33,131 --> 17:46:35,171
và phòng thủ trước\nđòn tấn công sau.

18584
17:46:35,171 --> 17:46:38,261
Giả sử bạn không sử dụng\na thư viện của bên thứ ba như của chúng tôi

18585
17:46:38,262 --> 17:46:41,832
và bạn vừa mới xây dựng một cách thủ công\n

18586
17:46:41,832 --> 17:46:45,281
Bạn phải làm điều gì đó như thế này\n

18587
17:46:45,281 --> 17:46:47,141
Bây giờ bạn đã cảm thấy thoải mái với\ncác chuỗi định dạng.

18588
17:46:47,141 --> 17:46:50,224
Bạn đã có thói quen sử dụng\n

18589
17:46:50,224 --> 17:46:52,572
Giả sử bạn, lập trình viên đầy tham vọng

18590
17:46:52,572 --> 17:46:55,002
chỉ là sử dụng các kỹ thuật\nmà bạn đã được dạy.

18591
17:46:55,002 --> 17:46:58,002
Vậy là bạn có một chuỗi f\nvới dấu sao được chọn từ người dùng

18592
17:46:58,002 --> 17:47:01,811
trong đó tên người dùng bằng, trích dẫn,\n

18593
17:47:01,811 --> 17:47:06,612
Và mật khẩu bằng, trích dẫn,\nunquote, "mật khẩu" trong dấu ngoặc nhọn.

18594
17:47:06,612 --> 17:47:09,612
Như thế nào, hai tuần trước\na, điều này thật hoàn hảo

18595
17:47:09,612 --> 17:47:14,802
kỹ thuật hợp pháp trong Python\nđể cắm các giá trị vào một chuỗi.

18596
17:47:14,802 --> 17:47:18,972
Nhưng hãy chú ý nếu bạn đang sử dụng\ndấu ngoặc đơn

18597
17:47:18,972 --> 17:47:24,092
và người dùng đã nhập một\ndấu ngoặc kép vào thông tin đầu vào của họ, thì sao?

18598
17:47:25,262 --> 17:47:29,851
Chúng ta sẽ đi đâu với vấn đề này nếu bạn\n

18599
17:47:29,851 --> 17:47:33,691
vào chuỗi văn bản do chính bạn chuẩn bị?

18600
17:47:40,942 --> 17:47:46,012
Trường hợp xấu nhất, họ có thể chèn những gì\n

18601
17:47:47,152 --> 17:47:50,482
Nói chung, nếu bạn đang sử dụng\n

18602
17:47:50,482 --> 17:47:52,342
để bao quanh thông tin đầu vào của người dùng, tốt hơn hết bạn nên

18603
17:47:52,341 --> 17:47:54,591
hy vọng rằng họ không có\nan dấu nháy đơn trong tên của họ.

18604
17:47:54,591 --> 17:47:57,216
Hoặc tốt hơn hết bạn nên hy vọng rằng họ cũng không gõ một câu trích dẫn nào.

18605
17:47:57,216 --> 17:48:01,366
Bởi vì điều gì sẽ xảy ra nếu một trích dẫn duy nhất của họ\n

18606
17:48:01,366 --> 17:48:03,241
và sau đó phần còn lại\nbằng cách nào đó bị bỏ qua?

18607
17:48:03,241 --> 17:48:04,671
Nào, hãy xem\nđiều này có thể xảy ra như thế nào.

18608
17:48:05,851 --> 17:48:08,182
Ở đây hơi\nmờ, nhưng hãy để tôi

18609
17:48:08,182 --> 17:48:10,192
cắm vào đây-- ồ, trông tệ quá.

18610
17:48:13,281 --> 17:48:15,771
Chỉ cần thay đổi thành màu trắng\nđể dễ đọc hơn.

18611
17:48:15,771 --> 17:48:22,072
Điều gì sẽ xảy ra nếu\nngười dùng thực hiện việc này thay thế?

18612
17:48:22,072 --> 17:48:24,652
Họ gõ vào, giống như tôi đã nhập vào ảnh chụp màn hình

18613
17:48:24,652 --> 17:48:28,101
'Malan@harvard.edu,'\ntrích dẫn duy nhất, dấu gạch ngang, dấu gạch ngang.

18614
17:48:28,101 --> 17:48:30,411
Điều gì vừa xảy ra\nmột cách hợp lý, mặc dù chúng ta đã

18615
17:48:30,411 --> 17:48:32,241
chỉ mới bắt đầu với SQL ngày hôm nay?

18616
17:48:32,241 --> 17:48:37,491
Vâng, hãy chọn dấu sao từ người dùng, trong đó\n

18617
17:48:38,661 --> 17:48:42,681
Phần còn lại của điều này có gì xấu?

18618
17:48:42,682 --> 17:48:45,093
Tôi khẳng định gạch ngang, gạch ngang\ncó nghĩa là một nhận xét, trong đó

18619
17:48:45,093 --> 17:48:47,551
có nghĩa là mã màu của tôi\nsẽ lại hơi mờ.

18620
17:48:47,552 --> 17:48:50,482
Nhưng mọi thứ sau dấu gạch ngang\ndash đều bị bỏ qua.

18621
17:48:50,482 --> 17:48:52,782
Logic của\ntruy vấn SQL là

18622
17:48:52,781 --> 17:48:56,101
chỉ cần nói, chọn\nMalan@harvard.edu từ cơ sở dữ liệu

18623
17:48:56,101 --> 17:48:58,832
thậm chí không kiểm tra mật khẩu nữa.

18624
17:48:58,832 --> 17:49:01,522
Do đó, bạn sẽ\ntrả lại ít nhất một hàng.

18625
17:49:01,521 --> 17:49:06,531
Vì vậy độ dài của các hàng sẽ bằng 1, v.v.\n

18626
17:49:06,531 --> 17:49:09,531
đăng nhập người dùng, cấp cho họ\nquyền truy cập vào tài khoản my.harvard của tôi

18627
17:49:10,491 --> 17:49:15,981
Và họ đã giả vờ đơn giản là tôi\n

18628
17:49:15,982 --> 17:49:17,787
dấu gạch ngang trong trường tên người dùng.

18629
17:49:17,786 --> 17:49:19,911
Một lần nữa, xin đừng bắt đầu làm việc này sau ngày hôm nay

18630
17:49:19,911 --> 17:49:21,481
trên Harvard, Yale hoặc các trang web khác.

18631
17:49:21,482 --> 17:49:23,012
Nhưng nó có thể đơn giản như vậy.

18632
17:49:23,512 --> 17:49:25,372
Bởi vì lập trình viên\nđã thực hành những gì họ

18633
17:49:25,372 --> 17:49:29,452
đã được dạy, chỉ là\nsử dụng dấu ngoặc nhọn để cắm vào

18634
17:49:30,902 --> 17:49:33,932
Nhưng nếu bạn không hiểu cách\n

18635
17:49:33,932 --> 17:49:37,597
và nếu bạn không tin tưởng vào người dùng của mình\n

18636
17:49:37,597 --> 17:49:39,472
ở ngoài kia sắp có\n, thật không may

18637
17:49:39,472 --> 17:49:44,722
một số đối thủ chỉ muốn thử\n

18638
17:49:45,832 --> 17:49:48,322
Đây được gọi là\na cuộc tấn công tiêm nhiễm SQL

18639
17:49:48,322 --> 17:49:52,341
bởi vì người dùng có thể gõ một cái gì đó\n

18640
17:49:52,341 --> 17:49:56,451
và lừa cơ sở dữ liệu của bạn thực hiện\n

18641
17:49:56,451 --> 17:50:00,171
chẳng hạn như đăng nhập người dùng.

18642
17:50:00,171 --> 17:50:02,222
Trường hợp xấu nhất, họ thậm chí không thể làm điều gì khác.

18643
17:50:02,222 --> 17:50:06,832
Có thể người dùng gõ một dấu chấm phẩy, sau đó\n

18644
17:50:06,832 --> 17:50:10,522
Bạn có thể tưởng tượng việc thực hiện dấu chấm phẩy\ncập nhật điểm trong bảng, trong đó

18645
17:50:10,521 --> 17:50:14,481
tên bằng Malan và đặt\ngrade bằng A thay vì B

18646
17:50:16,012 --> 17:50:18,891
Khả năng đưa\nSQL vào cơ sở dữ liệu

18647
17:50:18,891 --> 17:50:22,161
có nghĩa là bạn có thể làm bất cứ điều gì bạn muốn với\n

18648
17:50:25,341 --> 17:50:28,221
Và bây giờ, nhanh thôi, một chút\n

18649
17:50:34,752 --> 17:50:38,362
Được rồi, cho một người trong chúng ta, hai người trong chúng ta.

18650
17:50:39,741 --> 17:50:41,902
Được rồi, vậy hãy chuyển\không sang điều kiện cuối cùng.

18651
17:50:41,902 --> 17:50:44,472
Có một vấn đề khác\ncó thể trở nên tồi tệ ở đây.

18652
17:50:44,472 --> 17:50:45,722
Ồ, và tôi nên giải thích điều này.

18653
17:50:45,722 --> 17:50:50,842
Vậy đây là sự ám chỉ đến con trai,\n

18654
17:50:50,841 --> 17:50:54,151
Từ thả, bảng, học sinh và\n

18655
17:50:54,152 --> 17:50:56,781
Đây là sự hài hước mà chỉ\nngười CS mới hiểu

18656
17:50:56,781 --> 17:51:00,381
bởi vì mẹ đang nhận ra,\n

18657
17:51:01,650 --> 17:51:04,942
Ít buồn cười hơn khi bạn giải thích, nhưng một lần\n

18658
17:51:06,802 --> 17:51:10,192
Vì vậy, lời đe dọa cuối cùng,\nbây giờ bạn sắp tốt nghiệp

18659
17:51:10,192 --> 17:51:14,662
đến với thế giới của cơ sở dữ liệu thích hợp\và không chỉ có các tệp CSV.

18660
17:51:14,661 --> 17:51:17,511
Mọi thứ có thể xảy ra sai sót\nkhi sử dụng cơ sở dữ liệu

18661
17:51:17,512 --> 17:51:21,180
và thành thật mà nói, thậm chí sử dụng tệp CSV\n nếu bạn có nhiều người dùng.

18662
17:51:21,180 --> 17:51:22,972
Và cho đến nay, bạn và\ntôi đã có được sự xa xỉ

18663
17:51:22,972 --> 17:51:25,889
trong hầu hết mọi chương trình chúng tôi đã viết\n

18664
17:51:25,889 --> 17:51:27,172
Chỉ là bạn đang sử dụng mã của mình.

18665
17:51:27,171 --> 17:51:30,112
Và ngay cả khi đồng nghiệp\cũng như TA của bạn đang sử dụng nó, có thể

18666
17:51:31,402 --> 17:51:36,112
Nhưng thế giới sẽ trở nên thú vị nếu bạn\n

18667
17:51:36,112 --> 17:51:40,072
trên các trang web, như vậy bây giờ bạn có thể\n

18668
17:51:40,072 --> 17:51:42,771
để đăng nhập cùng lúc,\nnhấn vào nút theo đúng nghĩa đen

18669
17:51:42,771 --> 17:51:44,752
cùng một lúc hoặc gần như cùng một lúc.

18670
17:51:44,752 --> 17:51:47,722
Vậy thì điều gì sẽ xảy ra nếu\na máy tính đang cố gắng

18671
17:51:47,722 --> 17:51:50,632
để xử lý các yêu cầu từ hai\nngười khác nhau cùng một lúc

18672
17:51:50,631 --> 17:51:52,822
điều có thể xảy ra mọi lúc trên một trang web?

18673
17:51:52,822 --> 17:51:54,951
Bạn có thể nhận được những gì được gọi là điều kiện chạy đua.

18674
17:51:54,951 --> 17:51:58,401
Và đây là một vấn đề trong việc tính toán trong\n

18675
17:51:58,402 --> 17:52:02,302
với Python, thực sự là bất cứ lúc nào\n bạn chia sẻ dữ liệu

18676
17:52:02,302 --> 17:52:04,492
giống như một cơ sở dữ liệu, như sau.

18677
17:52:04,491 --> 17:52:08,961
Đây rõ ràng là một trong những\nbài đăng được thích nhất trên Instagram từ trước đến nay.

18678
17:52:08,961 --> 17:52:11,451
Theo nghĩa đen, nó chỉ là hình ảnh một quả trứng.

18679
17:52:11,451 --> 17:52:12,987
Có ai click vào quả trứng này chưa?

18680
17:52:15,561 --> 17:52:19,222
Vì vậy, hãy tìm kiếm bức ảnh này nếu bạn muốn\n

18681
17:52:19,222 --> 17:52:21,452
Tài khoản là world_record_egg.

18682
17:52:21,451 --> 17:52:24,381
Đây chỉ là ảnh chụp màn hình của\n

18683
17:52:24,381 --> 17:52:25,881
Nếu bạn có thói quen\nsử dụng Instagram

18684
17:52:25,881 --> 17:52:28,839
hoặc giống như bất kỳ trang mạng xã hội nào, có\n

18685
17:52:28,839 --> 17:52:30,261
hoặc một nút trái tim ngày nay.

18686
17:52:30,262 --> 17:52:32,242
Và đó thực sự là một vấn đề\nrất khó khăn.

18687
17:52:32,241 --> 17:52:35,391
Thật là một ý tưởng đơn giản để đếm\nsố lượt thích thứ gì đó

18688
17:52:35,391 --> 17:52:38,332
có, nhưng điều đó có nghĩa\nai đó phải nhấp vào nó.

18689
17:52:38,332 --> 17:52:40,252
Mã của bạn phải phát hiện nhấp chuột.

18690
17:52:40,252 --> 17:52:43,201
Mã của bạn phải cập nhật cơ sở dữ liệu,\n

18691
17:52:43,201 --> 17:52:48,081
ngay cả khi có lẽ có nhiều người\n

18692
17:52:48,082 --> 17:52:53,692
Và thật không may, những điều tồi tệ có thể\n

18693
17:52:53,692 --> 17:52:55,882
đồng thời trên máy tính.

18694
17:52:57,031 --> 17:53:01,012
Vì vậy, đây là một số mã nữa, một nửa\n

18695
17:53:01,921 --> 17:53:05,572
Giả sử điều gì xảy ra khi bạn,\n

18696
17:53:05,572 --> 17:53:08,811
vào nút thích trên\nbài đăng trên Instagram.

18697
17:53:08,811 --> 17:53:13,101
Giả sử đoạn mã đó, như sau,\n

18698
17:53:13,101 --> 17:53:19,531
db.execute của các lượt thích được chọn từ\n

18699
17:53:22,432 --> 17:53:24,622
Tôi giả định rằng\nbức ảnh đó có một ID duy nhất.

18700
17:53:24,622 --> 17:53:28,012
Đó là một số nguyên lớn, bất kể\nit là gì, được gán ngẫu nhiên.

18701
17:53:28,012 --> 17:53:30,472
Tôi cho rằng khi\nbạn nhấp vào trái tim

18702
17:53:30,472 --> 17:53:33,502
ID duy nhất bằng cách nào đó\nđược gửi đến máy chủ Instagram

18703
17:53:33,502 --> 17:53:36,082
để mã của họ có thể gọi nó là ID.

18704
17:53:36,082 --> 17:53:39,171
Và tôi giả sử rằng Instagram\nis sử dụng cơ sở dữ liệu SQL của nó

18705
17:53:39,171 --> 17:53:43,131
và chọn, từ bảng bài đăng\n, số lượt thích hiện tại

18706
17:53:43,131 --> 17:53:46,502
của quả trứng đó cho số ID đã cho.

18707
17:53:47,002 --> 17:53:50,294
Bởi vì tôi cần biết nó có bao nhiêu lượt thích\n

18708
17:53:50,294 --> 17:53:51,531
rồi cập nhật cơ sở dữ liệu.

18709
17:53:51,531 --> 17:53:55,051
Tôi cần chọn dữ liệu, sau đó\nTôi cần cập nhật dữ liệu tại đây.

18710
17:53:55,552 --> 17:53:59,122
Vì vậy, trong một số mã Python ở đây,\nhãy lưu trữ trong một biến có tên là

18711
17:53:59,122 --> 17:54:03,292
lượt thích, bất cứ điều gì sẽ quay trở lại trong\n

18712
17:54:03,292 --> 17:54:06,002
Một lần nữa, đây là cú pháp mới\ndành riêng cho thư viện của chúng tôi

18713
17:54:06,002 --> 17:54:09,171
nhưng cách phổ biến để quay lại\nhàng đầu tiên và cột có tên là

18714
17:54:10,141 --> 17:54:12,262
Vì vậy tại thời điểm này trong\ncâu chuyện, lượt thích đang được lưu trữ

18715
17:54:12,262 --> 17:54:14,804
tổng số lượt thích, tính bằng\nhàng triệu hoặc bất cứ giá trị nào

18716
17:54:17,241 --> 17:54:21,741
Thực hiện cập nhật bài đăng,\nđặt số lượt thích

18717
17:54:21,741 --> 17:54:25,949
bằng giá trị này, trong đó\nID của bài đăng bằng giá trị này.

18718
17:54:25,949 --> 17:54:27,531
Tôi muốn cập nhật lượt thích để làm gì?

18719
17:54:27,531 --> 17:54:31,881
Bất cứ lượt thích nào hiện tại đều là cộng\n1, sau đó cắm ID.

18720
17:54:33,682 --> 17:54:37,072
Tôi đang kiểm tra giá trị\nlượt thích và có thể nó là 10.

18721
17:54:37,072 --> 17:54:40,372
Tôi đang thay đổi 10 thành 11 và\nsau đó cập nhật bảng.

18722
17:54:40,372 --> 17:54:43,732
Nhưng một vấn đề có thể nảy sinh\nnếu hai người có

18723
17:54:43,732 --> 17:54:48,352
đã nhấp vào quả trứng đó vào khoảng\n

18724
17:54:49,682 --> 17:54:52,192
Chà, trong thế giới\ncơ sở dữ liệu và máy chủ

18725
17:54:52,192 --> 17:54:56,461
và Instagram trên thế giới có\n

18726
17:54:56,461 --> 17:55:00,771
Vì vậy, ngày nay họ có thể hỗ trợ hàng triệu,\nthậm chí hàng tỷ người dùng.

18727
17:55:02,252 --> 17:55:05,872
Chà, thông thường mã như thế này\không phải thứ mà chúng ta gọi là nguyên tử.

18728
17:55:05,872 --> 17:55:09,772
Trở thành nguyên tử có nghĩa là tất cả đều thực hiện cùng nhau hoặc không hề thực hiện.

18729
17:55:09,771 --> 17:55:14,841
Đúng hơn là mã thường được thực thi,\n

18730
17:55:14,841 --> 17:55:18,451
Và nếu mã của bạn đang chạy trên máy chủ\n

18731
17:55:18,451 --> 17:55:20,871
điều này hoàn toàn đúng\nđối với một ứng dụng như Instagram

18732
17:55:20,872 --> 17:55:23,902
nếu bạn và tôi nhấp vào\ntrái tim gần như cùng lúc

18733
17:55:23,902 --> 17:55:27,502
để đạt hiệu quả, máy tính,\nmáy chủ do Instagram sở hữu

18734
17:55:27,502 --> 17:55:29,841
có thể thực thi dòng mã này cho tôi.

18735
17:55:29,841 --> 17:55:31,878
Sau đó nó có thể thực thi\ndòng mã này cho bạn.

18736
17:55:31,879 --> 17:55:34,461
Rồi dòng mã này cho tôi,\nrồi dòng mã này cho bạn

18737
17:55:34,461 --> 17:55:37,044
rồi dòng mã này cho tôi,\nrồi dòng mã này cho bạn.

18738
17:55:37,044 --> 17:55:41,891
Điều đó có nghĩa là, các truy vấn của chúng tôi có thể\n

18739
17:55:41,891 --> 17:55:44,711
Bởi vì nó sẽ hơi khó chịu\n

18740
17:55:44,711 --> 17:55:47,381
Tôi bị chặn khi bạn\ntương tác với trang web.

18741
17:55:47,381 --> 17:55:50,119
Sẽ tốt hơn rất nhiều về hiệu quả\nvà sự công bằng nếu bằng cách nào đó họ

18742
17:55:50,120 --> 17:55:52,662
làm một chút việc cho tôi,\na một chút việc cho bạn

18743
17:55:52,661 --> 17:55:55,881
qua lại và qua lại\nmột cách công bằng trên máy chủ.

18744
17:55:55,881 --> 17:55:58,661
Vì vậy đó là điều thường xảy ra\ntheo mặc định. Những dòng mã này

18745
17:56:00,762 --> 17:56:05,112
Và chúng có thể xảy ra theo thứ tự xen kẽ với những người dùng khác.

18746
17:56:05,112 --> 17:56:07,150
Bạn có thể kết hợp chúng như thế này.

18747
17:56:07,150 --> 17:56:11,182
Thứ tự từ trên xuống dưới giống nhau nhưng khác\n

18748
17:56:11,182 --> 17:56:15,342
Vì vậy, giả sử rằng số lượng\n

18749
17:56:15,341 --> 17:56:19,421
Và giả sử rằng Carter và tôi đều nhấp chuột\n

18750
17:56:19,421 --> 17:56:21,761
Và giả sử dòng\ncode này được thực thi cho tôi

18751
17:56:21,762 --> 17:56:25,211
và điều đó mang lại cho tôi giá trị\nin lượt thích cuối cùng là 10.

18752
17:56:25,211 --> 17:56:28,631
Sau đó, giả sử rằng máy tính sử dụng\n

18753
17:56:28,631 --> 17:56:31,031
thực hiện cùng một mã cho\nCarter và quay lại

18754
17:56:31,031 --> 17:56:33,252
giá trị nào cho\nsố lượt thích hiện tại?

18755
17:56:34,512 --> 17:56:36,550
Bởi vì của tôi vẫn chưa được ghi lại.

18756
17:56:36,550 --> 17:56:39,252
Tại thời điểm này trong câu chuyện,\nở đâu đó trong bộ nhớ của máy tính

18757
17:56:39,252 --> 17:56:41,561
có một biến số lượt thích\nđối với tôi, lưu trữ 10.

18758
17:56:41,561 --> 17:56:44,741
Có một biến lượt thích\nlưu trữ 10 cho Carter.

18759
17:56:44,741 --> 17:56:46,631
Sau đó, dòng mã này sẽ thực thi cho tôi.

18760
17:56:46,631 --> 17:56:50,560
Nó cập nhật cơ sở dữ liệu thành lượt thích\n

18761
17:56:50,561 --> 17:56:55,781
Sau đó mã của Carter được thực thi,\n

18762
17:56:59,502 --> 17:57:03,550
Bởi vì giá trị lượt thích của anh ấy đã xảy ra\n

18763
17:57:03,550 --> 17:57:06,881
Và phép ẩn dụ ở đây là nếu chúng ta\n

18764
17:57:06,881 --> 17:57:10,131
thực sự hành động, đó là điều gì đó\n

18765
17:57:10,131 --> 17:57:15,640
lớp hệ thống, trong đó lớp tương tự nhất\n

18766
17:57:15,641 --> 17:57:17,712
nếu bạn có một\ntủ lạnh mini trong phòng ký túc xá của mình.

18767
17:57:17,711 --> 17:57:23,781
Và một trong số các bạn và bạn cùng phòng của bạn đến\n

18768
17:57:23,781 --> 17:57:26,502
ồ, chúng tôi hết sữa rồi,\ncâu chuyện xảy ra vào thời của tôi như thế nào.

18769
17:57:26,502 --> 17:57:30,525
Vì vậy bạn đóng tủ lạnh lại và\n

18770
17:57:30,525 --> 17:57:31,900
và xếp hàng để mua một ít sữa.

18771
17:57:31,900 --> 17:57:33,650
Trong khi đó, bạn cùng phòng của bạn về nhà.

18772
17:57:33,650 --> 17:57:38,265
Họ cũng kiểm tra trạng thái\n của bạn

18773
17:57:38,266 --> 17:57:40,391
mở cửa và nhận ra\noh, chúng tôi hết sữa rồi.

18774
17:57:41,322 --> 17:57:43,362
Đóng tủ lạnh lại, băng qua đường và đi về phía

18775
17:57:43,362 --> 17:57:45,400
có thể là đến một cửa hàng khác,\cũng không phải xếp hàng đủ dài

18776
17:57:45,400 --> 17:57:47,192
rằng các bạn không gặp nhau ở cửa hàng.

18777
17:57:47,192 --> 17:57:51,042
Truyện dài quá, cuối cùng thì cả hai bạn cũng vậy\n

18778
17:57:51,042 --> 17:57:52,900
bây giờ có sữa từ\nbạn cùng phòng khác của bạn

18779
17:57:52,900 --> 17:57:56,021
ở đó bởi vì cả hai bạn\nđã đưa ra quyết định về việc này

18780
17:57:56,021 --> 17:58:01,150
dựa trên trạng thái của một biến\n

18781
17:58:01,150 --> 17:58:03,042
Và bạn đã không giao tiếp bằng cách nào đó.

18782
17:58:03,042 --> 17:58:05,952
Trong thế giới thực, điều này hoàn toàn có thể giải quyết được.

18783
17:58:05,951 --> 17:58:09,461
Bạn sẽ khắc phục hoặc tránh\nsự cố này trong thế giới thực bằng cách nào?

18784
17:58:09,461 --> 17:58:11,112
Nghĩa đen là bạn cùng phòng riêng, tủ lạnh riêng.

18785
17:58:11,112 --> 17:58:13,092
ĐỐI TƯỢNG: Nhắn tin cho\nbạn cùng phòng của bạn [KHÔNG NGHE ĐƯỢC]..

18786
17:58:14,091 --> 17:58:15,824
Hãy cho họ biết, để bằng cách nào đó giao tiếp.

18787
17:58:15,824 --> 17:58:18,281
Và trên thực tế, thuật ngữ\nở đây sẽ có nhiều chủ đề

18788
17:58:18,281 --> 17:58:20,800
bằng cách nào đó có thể liên lạc với nhau\nbằng cách chia sẻ trạng thái

18789
17:58:20,800 --> 17:58:22,572
giống như chuỗi iMessage trên điện thoại của bạn.

18790
17:58:23,531 --> 17:58:26,832
Đáng chú ý hơn là bạn có thể\nkhóa tủ lạnh bằng cách nào đó

18791
17:58:26,832 --> 17:58:30,912
do đó làm cho quá trình mua sữa trở nên nguyên tử.

18792
17:58:30,911 --> 17:58:33,730
Vấn đề cơ bản là\nvề hiệu quả, một lần nữa

18793
17:58:33,730 --> 17:58:37,031
máy tính có xu hướng\kết hợp logic cần

18794
17:58:37,031 --> 17:58:41,322
xảy ra khi nó xảy ra trên\n

18795
17:58:42,521 --> 17:58:45,161
Bạn cần đảm bảo rằng tất cả\nba dòng mã này

18796
17:58:45,161 --> 17:58:48,610
xử tử cho tôi, rồi\ncho Carter, và sau đó cho bạn

18797
17:58:48,610 --> 17:58:51,050
nếu bạn muốn đảm bảo rằng\nsố đếm này là chính xác.

18798
17:58:51,050 --> 17:58:54,561
Và trong nhiều năm, khi mạng xã hội\n

18799
17:58:54,561 --> 17:58:56,442
đây là một vấn đề siêu khó.

18800
17:58:56,442 --> 17:58:59,262
Twitter thường xuyên ngừng hoạt động và các tweet

18801
17:58:59,262 --> 17:59:01,601
và những lượt tweet lại là điều\ncũng xảy ra tương tự

18802
17:59:02,832 --> 17:59:04,362
Đây là những vấn đề khó giải quyết.

18803
17:59:04,362 --> 17:59:06,031
Và may mắn thay, có những giải pháp.

18804
17:59:06,031 --> 17:59:08,781
Và chúng ta sẽ không đi vào đám cỏ\n

18805
17:59:08,781 --> 17:59:11,442
nhưng hãy biết rằng có những giải pháp dưới dạng sự vật

18806
17:59:11,442 --> 17:59:14,952
được gọi là khóa, cái mà tôi sử dụng\n

18807
17:59:14,951 --> 17:59:18,911
Khóa phần mềm có thể cho phép bạn\n

18808
17:59:18,911 --> 17:59:20,891
nhìn vào nó cho đến khi bạn làm xong nó.

18809
17:59:20,891 --> 17:59:23,112
Có những thứ được gọi là\ngiao dịch,

18810
17:59:23,112 --> 17:59:26,442
cho phép bạn làm điều tương đương với\n

18811
17:59:26,442 --> 17:59:29,472
ngăn cản bạn cùng phòng của bạn truy cập\ncùng một biến đó

18812
17:59:29,472 --> 17:59:32,262
nhưng với khoảng thời gian ít hơn một chút.

18813
17:59:32,262 --> 17:59:34,222
Có giải pháp cho những vấn đề này.

18814
17:59:34,222 --> 17:59:37,991
Vì vậy, ví dụ, trong Python,\nmã tương tự bây giờ có màu xanh lục

18815
17:59:37,991 --> 17:59:39,701
có thể trông giống như thế này.

18816
17:59:39,701 --> 17:59:42,491
Khi bạn biết điều gì đó\nhất sẽ xảy ra ngay lập tức

18817
17:59:42,491 --> 17:59:46,362
nói chung, trước tiên bạn bắt đầu một\n

18818
17:59:46,362 --> 17:59:49,048
và sau đó bạn thực hiện\ngiao dịch ở cuối.

18819
17:59:49,048 --> 17:59:51,131
Tuy nhiên, ở đây cũng sẽ có một nhược điểm.

18820
17:59:51,131 --> 17:59:55,243
Thông thường, bạn càng sử dụng\ncác giao dịch theo cách này

18821
17:59:55,243 --> 17:59:56,951
có khả năng càng cao\nxác suất là

18822
17:59:56,951 --> 18:00:00,531
rằng bạn sắp loại ai đó hoặc\n

18823
18:00:01,031 --> 18:00:02,824
Bởi vì chúng ta không thể tương tác\na cùng một lúc.

18824
18:00:02,824 --> 18:00:05,262
Hoặc bạn có thể thực hiện yêu cầu của anh ấy\nkhông thành công nếu anh ấy cố gắng cập nhật

18825
18:00:05,262 --> 18:00:07,211
một cái gì đó đã được cập nhật.

18826
18:00:07,211 --> 18:00:10,061
Vì vậy, bạn thường muốn\ncó ít dòng mã nhất

18827
18:00:10,061 --> 18:00:13,182
cùng nhau giữa các giao dịch này\n

18828
18:00:13,182 --> 18:00:16,122
Và bạn truy cập CVS và bạn quay lại\nrất nhanh để không

18829
18:00:16,122 --> 18:00:17,891
gây ra những loại hiệu suất này.

18830
18:00:17,891 --> 18:00:20,411
Vì vậy, ngày hôm nay mọi thứ thực sự đã leo thang nhanh chóng.

18831
18:00:20,411 --> 18:00:23,613
Mục tiêu ban đầu chỉ là giải quyết\n

18832
18:00:23,614 --> 18:00:24,822
hiệu quả hơn Python.

18833
18:00:24,822 --> 18:00:27,114
Nhưng ngay khi bạn có\nnhững kỹ thuật mạnh mẽ hơn này

18834
18:00:27,114 --> 18:00:28,866
một loạt vấn đề mới nảy sinh.

18835
18:00:28,866 --> 18:00:30,491
Cần thực hành để cảm thấy thoải mái.

18836
18:00:30,491 --> 18:00:34,511
Nhưng cuối cùng, tất cả đều dẫn đầu\n

18837
18:00:34,512 --> 18:00:37,601
lập trình web với HTML,\nCSS và một số JavaScript.

18838
18:00:37,601 --> 18:00:40,432
Tuần sau, đưa Python\nand SQL trở lại hoạt động hỗn hợp.

18839
18:00:40,432 --> 18:00:42,281
Vì vậy đến cuối học kỳ,\nchúng tôi thực sự đã sử dụng

18840
18:00:42,281 --> 18:00:45,101
tất cả những ngôn ngữ khác nhau này\ncho những gì họ giỏi nhất.

18841
18:00:45,101 --> 18:00:48,184
Và trong vài tuần tới, mục tiêu\n

18842
18:00:48,184 --> 18:00:51,273
và thoải mái với những gì trong số đó\n

18843
18:00:51,273 --> 18:00:52,481
Chúng ta hãy tiếp tục và kết thúc ở đây.

18844
18:00:52,482 --> 18:00:53,815
Tôi sẽ ở lại để hỏi.

18845
18:02:15,171 --> 18:02:19,222
Đây là CS50 và đây đã là tuần thứ 8.

18846
18:02:19,222 --> 18:02:21,705
Và nếu bây giờ chúng ta nghĩ lại\nnhững tuần vừa qua

18847
18:02:21,705 --> 18:02:24,622
nhớ lại rằng mọi thứ đã bắt đầu khá tốt đẹp\n

18848
18:02:24,622 --> 18:02:27,049
vào tuần thứ 0, khi\nchúng tôi sử dụng Scratch

18849
18:02:27,048 --> 18:02:29,631
vì với Scratch chúng tôi có\nGUI, giao diện đồ họa người dùng.

18850
18:02:29,631 --> 18:02:33,171
Vì vậy, ngay cả khi chúng tôi khám phá các biến và\n

18851
18:02:33,171 --> 18:02:36,083
bạn đã có một môi trường vui vẻ\n

18852
18:02:36,084 --> 18:02:37,792
Và sau đó trong tuần 1,\nchúng tôi đã mất rất nhiều

18853
18:02:37,792 --> 18:02:41,692
về điều đó, khi chúng tôi giới thiệu C và\n

18854
18:02:41,692 --> 18:02:46,372
bởi vì bây giờ, tất cả các chương trình của bạn đã trở thành\n

18855
18:02:46,372 --> 18:02:49,432
và chuột,\nanimations, menu, v.v. đã biến mất.

18856
18:02:49,432 --> 18:02:51,622
Và bây giờ,\nchuyển nhanh đến tuần 8, chúng ta

18857
18:02:51,622 --> 18:02:54,952
sẽ đưa các loại giao diện người dùng, giao diện người dùng, các thành phần đó trở lại

18858
18:02:54,951 --> 18:02:56,511
dưới dạng lập trình web.

18859
18:02:56,512 --> 18:02:58,851
Và điều này vượt xa\nviệc chỉ bố trí các trang web.

18860
18:02:58,851 --> 18:03:03,069
Điều này sẽ, cho đến tuần này và tuần tới,\n

18861
18:03:03,069 --> 18:03:05,362
những việc chúng tôi đã làm\ntrong vài tuần qua

18862
18:03:05,362 --> 18:03:07,972
sử dụng Python, sử dụng\nSQL và bây giờ đang giới thiệu

18863
18:03:07,972 --> 18:03:10,972
một vài ngôn ngữ khác,\không phải ngôn ngữ được gọi là phía máy khách

18864
18:03:10,972 --> 18:03:13,461
trên máy Mac của chính bạn, PC của chính bạn,\nđiện thoại của chính bạn, điều đó sẽ diễn ra

18865
18:03:13,461 --> 18:03:15,472
để nói chuyện với những dịch vụ phụ trợ đó.

18866
18:03:15,472 --> 18:03:18,772
Vì vậy, thực sự, ở phần cuối\nCS50 này, mọi thứ thực hiện khá

18867
18:03:18,771 --> 18:03:22,131
kết hợp với nhau thành một giao diện người dùng\nđiều đó cực kỳ quen thuộc.

18868
18:03:22,131 --> 18:03:24,951
Tất cả chúng ta đều sử dụng điện thoại,\nmáy tính để bàn, máy tính xách tay hàng ngày.

18869
18:03:24,951 --> 18:03:28,252
Và ngày càng có nhiều ứng dụng di động\napp mà tất cả các bạn đang sử dụng

18870
18:03:28,252 --> 18:03:32,512
được triển khai, không nhất thiết\n

18871
18:03:32,512 --> 18:03:34,641
nếu bạn quen với\nnhững thứ đó nhưng với ngôn ngữ

18872
18:03:34,641 --> 18:03:38,552
được gọi là HTML, CSS và JavaScript,\n

18873
18:03:38,552 --> 18:03:43,372
Nhưng trước khi làm điều đó, hãy cung cấp\n

18874
18:03:43,372 --> 18:03:46,822
bởi vì thực sự, chúng ta sẽ bắt đầu xem xét\n

18875
18:03:46,822 --> 18:03:51,105
nó hoạt động, mặc dù nhanh chóng, nên\n

18876
18:03:51,105 --> 18:03:54,022
tất cả mã này đang chạy, bạn\n thế nào

18877
18:03:54,021 --> 18:03:56,752
thực sự, cuối cùng, sau\nCS50, bạn có thể học, chỉ bằng cách

18878
18:03:56,752 --> 18:03:59,156
chọc xung quanh các trang web thực tế khác.

18879
18:03:59,156 --> 18:04:00,531
Vì vậy, internet, tất cả chúng ta đều có trên đó.

18880
18:04:00,531 --> 18:04:05,101
Theo nghĩa đen, ngay bây giờ, theo cách nói của bạn thì nó là gì?

18881
18:04:07,671 --> 18:04:10,371
Đó là tiện ích ngày nay, mà\ntất cả chúng ta đều coi đó là điều hiển nhiên.

18882
18:04:12,654 --> 18:04:14,572
GIỌNG 1: Được rồi,\nbộ nhớ lớn, và quả thực, đó là

18883
18:04:14,572 --> 18:04:18,451
đám mây được mô tả như thế nào\n

18884
18:04:18,451 --> 18:04:21,771
cho rất nhiều dây\nand cáp và phần cứng.

18885
18:04:21,771 --> 18:04:24,941
Và internet,\ncác công thức khác của thuật ngữ này, còn cách nào nữa?

18886
18:04:24,942 --> 18:04:26,692
ĐỐI TƯỢNG: Một loạt\ndữ liệu mà chúng tôi có thể tiếp cận.

18887
18:04:26,692 --> 18:04:28,609
GIỌNG 1: Được rồi, một loạt\ndữ liệu mà tất cả chúng ta có thể

18888
18:04:28,608 --> 18:04:32,241
tiếp cận, bằng cách kết nối với nhau\n

18889
18:04:32,241 --> 18:04:35,002
Và thực sự, Internet\ncũng là một thứ phần cứng.

18890
18:04:35,002 --> 18:04:38,811
Có rất nhiều máy chủ\n

18891
18:04:38,811 --> 18:04:41,331
qua cáp vật lý, qua\nnhà cung cấp dịch vụ internet

18892
18:04:41,332 --> 18:04:43,382
thông qua kết nối không dây, và những thứ tương tự.

18893
18:04:43,381 --> 18:04:46,161
Và một khi bạn bắt đầu có\nmạng của mạng của mạng

18894
18:04:47,362 --> 18:04:50,332
Quả thực, Harvard có mạng lưới riêng\n

18895
18:04:50,332 --> 18:04:52,687
và nhà riêng của bạn có thể\nhã có mạng riêng.

18896
18:04:52,686 --> 18:04:54,561
Nhưng một khi bạn bắt đầu\nkết nối các mạng đó

18897
18:04:54,561 --> 18:04:58,921
bạn có nhận được mạng kết nối không\n

18898
18:04:58,921 --> 18:05:01,551
Vậy là có toàn bộ món súp\nalphabet này

18899
18:05:01,552 --> 18:05:03,802
với Internet, một số\ntừ viết tắt và thuật ngữ của chúng

18900
18:05:03,802 --> 18:05:04,732
có lẽ bạn đã từng thấy trước đây.

18901
18:05:04,732 --> 18:05:06,532
Nhưng ít nhất chúng ta hãy bóc\nback một số lớp đó

18902
18:05:06,531 --> 18:05:08,752
và xem xét một số\nkhối xây dựng là gì.

18903
18:05:08,752 --> 18:05:11,752
Đây là hình ảnh của Internet\n

18904
18:05:11,752 --> 18:05:14,182
trở lại năm 1969, khi nó\nđược gọi là

18905
18:05:14,182 --> 18:05:17,482
ARPANET, từ Cơ quan Dự án Nghiên cứu Nâng cao\n.

18906
18:05:17,482 --> 18:05:20,872
Và mục đích ban đầu chỉ là\n

18907
18:05:20,872 --> 18:05:25,702
ở Utah và California, theo nghĩa đen là\nmáy chủ hoặc máy tính ở mỗi nơi

18908
18:05:25,701 --> 18:05:27,891
của những khu vực đó, bằng cách nào đó\nđược kết nối với nhau bằng dây dẫn

18909
18:05:27,891 --> 18:05:29,616
để mọi người có thể\nbắt đầu chia sẻ dữ liệu.

18910
18:05:29,616 --> 18:05:33,182
Một năm sau, nó mở rộng sang\nbao gồm MIT, Harvard và những trường khác.

18911
18:05:33,182 --> 18:05:36,201
Và bây giờ hãy tua nhanh đến\nhôm nay, bạn có một con số khổng lồ

18912
18:05:36,201 --> 18:05:39,322
của các hệ thống trên khắp thế giới\ntrên cùng một mạng này.

18913
18:05:39,322 --> 18:05:41,841
Và trên thực tế, nếu tôi\nchỉ cần kéo lên một trang web

18914
18:05:41,841 --> 18:05:44,301
ở đây, điều đó\nliên tục thay đổi

18915
18:05:44,302 --> 18:05:48,802
một hình ảnh trực quan của Internet như\n

18916
18:05:48,802 --> 18:05:52,072
về mặt trừu tượng, tất cả\nnhững dòng và mối liên kết này

18917
18:05:52,072 --> 18:05:56,008
thể hiện mức độ kết nối của thế giới ngày nay.

18918
18:05:56,008 --> 18:05:59,091
Và nó chỉ có nghĩa là có tất cả\n

18919
18:05:59,091 --> 18:06:02,822
cung cấp nhiều phần cứng hơn\n

18920
18:06:02,822 --> 18:06:07,402
Nhưng nếu chúng ta thực sự tập trung vào\n

18921
18:06:07,402 --> 18:06:11,872
dù là vào năm 1970 hay bây giờ là năm 2021,\n

18922
18:06:11,872 --> 18:06:15,385
vâng, một máy chủ, nhưng một loại nhất định\n

18923
18:06:15,385 --> 18:06:17,302
Và một bộ định tuyến, như\ntên ngụ ý, chỉ định tuyến

18924
18:06:17,302 --> 18:06:21,302
dữ liệu từ trái sang phải, từ trên xuống\ndưới cùng, từ điểm này sang điểm khác.

18925
18:06:21,302 --> 18:06:25,132
Và vì vậy có tất cả các máy chủ ở đây\n

18926
18:06:25,131 --> 18:06:28,651
trong mạng của Comcast, mạng\n của Verizon, mạng gia đình của riêng bạn

18927
18:06:28,652 --> 18:06:31,461
bạn có bộ định tuyến của riêng mình\nvới mục đích trong cuộc sống

18928
18:06:31,461 --> 18:06:34,277
là lấy dữ liệu rồi\nquyết định xem tôi có nên gửi nó theo cách này không

18929
18:06:34,277 --> 18:06:36,652
hoặc theo cách này, hoặc theo cách này,\ncó thể nói như vậy, giả sử có

18930
18:06:36,652 --> 18:06:38,512
nhiều lựa chọn với nhiều loại cáp.

18931
18:06:38,512 --> 18:06:41,692
Bạn, ở nhà bạn, có lẽ chỉ có\n

18932
18:06:41,692 --> 18:06:46,162
Nhưng chắc chắn, nếu bạn ở một nơi như\n

18933
18:06:46,161 --> 18:06:49,221
có lẽ có rất nhiều\ncác mối liên kết

18934
18:06:49,222 --> 18:06:51,891
mà cuối cùng thì dữ liệu có thể\nđi qua.

18935
18:06:51,891 --> 18:06:54,981
Vậy làm cách nào để chúng tôi lấy được dữ liệu\nam trong số các bộ định tuyến này?

18936
18:06:54,982 --> 18:06:57,652
Ví dụ: nếu bạn muốn\ngửi email cho ai đó

18937
18:06:57,652 --> 18:07:00,502
tại Stanford, California,\ntừ đây, trên Bờ Đông

18938
18:07:00,502 --> 18:07:04,771
hoặc nếu bạn muốn truy cập\nwww.stanford.edu, máy tính xách tay của bạn hoạt động như thế nào

18939
18:07:04,771 --> 18:07:08,557
thực ra là điện thoại của bạn, máy tính để bàn của bạn\n

18940
18:07:08,557 --> 18:07:12,112
Về cơ bản,\nmáy tính xách tay hoặc điện thoại của bạn biết

18941
18:07:12,112 --> 18:07:16,141
khi nó khởi động lúc bắt đầu\n

18942
18:07:16,141 --> 18:07:17,682
địa chỉ của bộ định tuyến cục bộ đó là.

18943
18:07:17,682 --> 18:07:20,491
Vì vậy, nếu bạn muốn gửi\nemail từ máy tính xách tay của tôi ở đây

18944
18:07:20,491 --> 18:07:23,701
về cơ bản máy tính xách tay của tôi sẽ đi\n

18945
18:07:23,701 --> 18:07:25,711
Và rồi, từ đó, tôi\nkhông biết, tôi không quan tâm

18946
18:07:25,711 --> 18:07:27,254
làm thế nào nó đi được quãng đường còn lại.

18947
18:07:27,254 --> 18:07:29,822
Nhưng hy vọng rằng sau vài\nmột vài bước nữa

18948
18:07:29,822 --> 18:07:32,461
Bộ định tuyến của Harvard sẽ\nsgửi nó tới bộ định tuyến của Boston

18949
18:07:32,461 --> 18:07:34,586
sẽ gửi nó tới\nbộ định tuyến của California đang hoạt động

18950
18:07:34,586 --> 18:07:37,771
để gửi nó tới bộ định tuyến của Stanford, cho đến khi\n

18951
18:07:38,372 --> 18:07:41,822
Và thực ra, chúng ta có thể miêu tả điều này\nmột cách vui tươi một chút.

18952
18:07:41,822 --> 18:07:44,072
Thật may mắn,\nnhân viên của khóa học đã tình nguyện nhiệt tình

18953
18:07:44,072 --> 18:07:48,792
để tạo hình ảnh trực quan\nđiều này bằng cách sử dụng công nghệ quen thuộc.

18954
18:07:48,792 --> 18:07:52,322
Vì vậy, ở đây chúng tôi có một số TF của mình\n

18955
18:07:52,322 --> 18:07:55,472
Hãy để tôi tiếp tục và hiển thị toàn bộ\ncửa sổ này tại đây.

18956
18:07:55,472 --> 18:07:58,391
Hãy đợi một lát để\nkéo nó lên màn hình của tôi ở đây.

18957
18:07:58,391 --> 18:08:03,182
Và chúng ta sẽ xem xét điều gì sẽ xảy ra nếu chúng ta\n

18958
18:08:03,182 --> 18:08:07,502
từ một người hoặc bộ định tuyến,\ncụ thể là Phyllis trong trường hợp này

18959
18:08:07,502 --> 18:08:10,561
ở góc dưới bên phải,\n cho Brian, trong trường hợp này

18960
18:08:10,561 --> 18:08:11,831
ở góc trên bên trái.

18961
18:08:11,832 --> 18:08:14,461
Vì vậy, mỗi nhân viên\nở đây đại diện cho chính xác một

18962
18:08:14,461 --> 18:08:17,051
của các bộ định tuyến này trên internet.

18963
18:08:47,612 --> 18:08:49,891
Chúng tôi thực sự đã phải thử rất nhiều lần

18964
18:08:49,891 --> 18:08:51,481
để có được điều đó cuối cùng đúng.

18965
18:08:51,482 --> 18:08:54,632
Vậy khi nào, tất cả các nhân viên đều đi ngang qua đây là khi nào?

18966
18:08:54,631 --> 18:08:57,714
Ở đây, về mặt vật lý, chúng ta có những gì\n

18967
18:08:57,714 --> 18:08:59,881
Vì vậy, Phyllis bắt đầu với một\phong bì, bên trong nó

18968
18:08:59,881 --> 18:09:01,951
có lẽ đó là email\\không phải Bờ Đông

18969
18:09:01,951 --> 18:09:05,136
và cô ấy muốn gửi nó cho Brian vào\n

18970
18:09:05,137 --> 18:09:08,012
Và vì vậy cô ấy có tất cả những điều khác biệt\n

18971
18:09:08,012 --> 18:09:11,112
giữa cô ấy và điểm B, cụ thể là Brian.

18972
18:09:11,112 --> 18:09:14,671
Trong trường hợp của cô ấy, cô ấy có thể đi lên, đi xuống và\n

18973
18:09:14,671 --> 18:09:17,461
có thể đi lên, xuống, sang trái hoặc sang phải,\n

18974
18:09:17,461 --> 18:09:19,442
Và tóm lại,\ncó những thuật toán

18975
18:09:19,442 --> 18:09:22,812
tìm hiểu cách bạn quyết định\ngửi gói lên, xuống

18976
18:09:22,811 --> 18:09:24,661
trái, hoặc phải, có thể nói như vậy.

18977
18:09:24,661 --> 18:09:29,716
Nhưng họ làm như vậy bằng cách lấy dữ liệu đầu vào và\n

18978
18:09:29,716 --> 18:09:32,341
Và có ít nhất một vài\nthứ ở bên ngoài này

18979
18:09:32,341 --> 18:09:35,281
bởi vì tất cả các bộ định tuyến này và\n

18980
18:09:35,281 --> 18:09:38,012
và điện thoại ngày nay,\nnói điều gì đó được gọi là

18981
18:09:38,012 --> 18:09:41,132
TCP/IP, một tập hợp\từ viết tắt mà bạn có thể đã biết

18982
18:09:41,131 --> 18:09:44,011
được nhìn thấy ở đâu đó trên\nđiện thoại, máy Mac hoặc PC của bạn

18983
18:09:44,012 --> 18:09:48,422
được in ở đâu đó, trong đó đề cập đến\n

18984
18:09:48,421 --> 18:09:51,194
mà các máy tính ngày nay sử dụng để liên lạc với nhau.

18985
18:09:52,112 --> 18:09:54,631
Một giao thức giống như một bộ quy tắc mà bạn hành xử.

18986
18:09:54,631 --> 18:09:57,091
Vào những lúc khỏe mạnh hơn, tôi có thể\ntiếp tay tôi và ai đó

18987
18:09:57,091 --> 18:10:00,631
như thể Carter có thể đưa tay ra,\n

18988
18:10:00,631 --> 18:10:03,871
trên một giao thức của con người giống như\nbắt tay vật lý theo nghĩa đen.

18989
18:10:03,872 --> 18:10:07,082
Ngày nay, chúng ta có các giao thức mặt nạ,\ntheo đó bạn cần làm gì

18990
18:10:08,591 --> 18:10:11,641
Nhưng đó cũng chỉ là một bộ quy tắc\n

18991
18:10:11,641 --> 18:10:13,951
đó là nơi nào đó\nđược chuẩn hóa và ghi lại.

18992
18:10:13,951 --> 18:10:16,711
Vì vậy, máy tính luôn sử dụng các giao thức\n để quản lý

18993
18:10:16,711 --> 18:10:19,622
cách họ gửi thông tin\nvà nhận thông tin.

18994
18:10:19,622 --> 18:10:24,482
Và TCP và IP là hai giao thức như vậy\n

18995
18:10:24,482 --> 18:10:27,212
TCP/IP yêu cầu ai đó\nnhư Phyllis làm gì

18996
18:10:27,211 --> 18:10:31,152
nếu cô ấy muốn gửi email cho Brian,\n

18997
18:10:31,902 --> 18:10:37,082
Nhưng ở bên ngoài cái ảo đó\n

18998
18:10:37,082 --> 18:10:41,132
Và tôi sẽ mô tả đây là điểm đến\n

18999
18:10:41,131 --> 18:10:44,011
giống như trong thế giới con người của chúng ta,\nbạn sẽ viết đích đến

19000
18:10:45,332 --> 18:10:49,202
Và sau đó cô ấy sẽ tự đặt\n

19001
18:10:49,201 --> 18:10:51,750
góc, giống như bạn,\nsender, sẽ ghi nguồn của riêng bạn

19002
18:10:51,750 --> 18:10:53,171
địa chỉ trong thế giới con người.

19003
18:10:53,171 --> 18:10:56,432
Tuy nhiên, thay vì những địa chỉ này\n

19004
18:10:56,432 --> 18:11:01,141
Cambridge, Massachusetts 02138, Hoa Kỳ,\n

19005
18:11:01,141 --> 18:11:05,641
trên internet có địa chỉ duy nhất\n

19006
18:11:05,641 --> 18:11:08,192
Và địa chỉ IP\nchỉ là một mã định danh bằng số

19007
18:11:08,192 --> 18:11:11,461
trên internet, điều đó cho phép\nmáy tính, như Phyllis và Brian

19008
18:11:11,461 --> 18:11:14,432
để giải quyết các phong bì\nđến và từ nhau.

19009
18:11:14,432 --> 18:11:16,741
Và bạn có thể đã từng thấy\nđịnh dạng này ở một thời điểm nào đó.

19010
18:11:16,741 --> 18:11:20,311
Thông thường, định dạng của địa chỉ IP\n là cái gì đó chấm cái gì đó

19011
18:11:20,311 --> 18:11:22,261
chấm cái gì đó chấm cái gì đó.

19012
18:11:22,262 --> 18:11:24,872
Mỗi thứ trong số đó,\nđược biểu thị ở đây bằng ký hiệu băm

19013
18:11:24,872 --> 18:11:29,852
là một số từ 0 đến 255.

19014
18:11:29,851 --> 18:11:32,911
Và, dựa trên\nhint đó, nếu mỗi giá trị băm này

19015
18:11:32,911 --> 18:11:36,631
đại diện cho một số từ 0\nđến 255, mỗi giá trị băm đó

19016
18:11:36,631 --> 18:11:39,542
được biểu diễn bằng\nbao nhiêu byte hoặc bit?

19017
18:11:39,542 --> 18:11:43,442
Tám bit hoặc một byte, tức là\n

19018
18:11:43,442 --> 18:11:47,072
địa chỉ IP phải sử dụng\n32 bit hoặc 4 byte

19019
18:11:47,072 --> 18:11:50,641
nếu bây giờ chúng ta tua lại một số\n

19020
18:11:50,641 --> 18:11:52,991
Và điều đó có nghĩa là,\nang ít nhất là trong nháy mắt

19021
18:11:52,991 --> 18:11:57,153
có vẻ như chúng ta có khoảng 4 tỷ\n

19022
18:11:57,154 --> 18:11:58,862
Thật không may,\ncó một con số rất lớn

19023
18:11:58,862 --> 18:12:01,772
của con người trên thế giới ngày nay,\n

19024
18:12:01,771 --> 18:12:05,221
chắc chắn có nhiều thiết bị\n

19025
18:12:05,222 --> 18:12:08,974
một máy tính xách tay và một chiếc điện thoại và bạn có\n

19026
18:12:08,974 --> 18:12:10,391
tất cả đều cần được giải quyết.

19027
18:12:10,391 --> 18:12:12,332
Vì vậy, có một loại địa chỉ IP khác

19028
18:12:12,332 --> 18:12:14,012
bắt đầu được sử dụng phổ biến hơn.

19029
18:12:16,411 --> 18:12:19,232
Ngoài ra còn có phiên bản 6\n, thay vì 32 bit

19030
18:12:19,232 --> 18:12:23,552
sử dụng 128 bit, mang lại cho chúng ta một\n

19031
18:12:23,551 --> 18:12:27,872
cho máy tính nên ít nhất chúng tôi có thể xử lý được\n

19032
18:12:28,812 --> 18:12:31,772
Vậy điều này có nghĩa là, rốt cuộc điều gì đang diễn ra trên chiếc phong bì này

19033
18:12:31,771 --> 18:12:35,941
là địa chỉ đích, tức là\n

19034
18:12:35,941 --> 18:12:40,021
địa chỉ, đó là địa chỉ IP của Phyllis,\n

19035
18:12:40,021 --> 18:12:43,051
tới điểm B, và nếu cần\ncó thể quay lại bằng cách lật

19036
18:12:43,051 --> 18:12:44,641
nguồn và đích.

19037
18:12:44,642 --> 18:12:49,652
Nhưng trên internet, có lẽ bạn biết\n

19038
18:12:49,652 --> 18:12:53,191
Có máy chủ web, có trò chuyện\n

19039
18:12:53,191 --> 18:12:56,191
Giống như có tất cả những điều khác biệt\n

19040
18:12:56,191 --> 18:12:58,771
Và vì vậy, khi Brian\nnhận được phong bì đó

19041
18:12:58,771 --> 18:13:05,432
làm sao anh ấy biết đó là một email, so với\n

19042
18:13:05,432 --> 18:13:07,622
so với một cái gì đó hoàn toàn khác.

19043
18:13:07,622 --> 18:13:10,771
Chà, hóa ra là chúng ta\ncó thể nhìn vào phần khác

19044
18:13:10,771 --> 18:13:14,281
của từ viết tắt này, TCP trong TCP/IP.

19045
18:13:14,282 --> 18:13:17,172
Và những gì TCP cho phép chúng ta\nlàm chẳng hạn

19046
18:13:17,172 --> 18:13:18,822
là chỉ định một vài điều.

19047
18:13:18,822 --> 18:13:23,792
Một, loại dịch vụ\n

19048
18:13:23,792 --> 18:13:26,881
nó thực hiện điều này với một mã định danh bằng số.

19049
18:13:26,881 --> 18:13:31,652
Và tôi sẽ tiếp tục viết ra\n

19050
18:13:31,652 --> 18:13:35,222
Và tôi sẽ viết điều đó trong\n

19051
18:13:35,221 --> 18:13:37,381
Về mặt kỹ thuật, bây giờ,\ncó gì trên phong bì này

19052
18:13:37,381 --> 18:13:40,111
không chỉ là địa chỉ,\nmà còn là một con số duy nhất

19053
18:13:40,111 --> 18:13:45,182
đại diện cho loại dịch vụ nào\n

19054
18:13:45,182 --> 18:13:48,792
cho dù đó là email hay lưu lượng truy cập web,\cũng không phải Skype hay thứ gì khác.

19055
18:13:48,792 --> 18:13:53,342
Những con số này đã được chuẩn hóa và đây\n

19056
18:13:53,342 --> 18:13:56,192
thậm chí không phải trong ngữ cảnh của email,\nmà trong ngữ cảnh của web.

19057
18:13:56,191 --> 18:13:59,131
Cổng 80 thường được sử dụng\nbất cứ khi nào một phong bì chứa

19058
18:13:59,131 --> 18:14:03,361
một trang web hoặc một yêu cầu\ntheo đó hoặc số 443

19059
18:14:03,361 --> 18:14:07,201
khi yêu cầu đó thực sự là\n

19060
18:14:07,202 --> 18:14:11,192
biết đấy, trong các URL, được gọi là HTTPS,\n

19061
18:14:11,191 --> 18:14:13,081
Tìm hiểu thêm về ý nghĩa của HTTP sau.

19062
18:14:13,081 --> 18:14:16,955
Nếu là email thì số\ncó thể là 25 hoặc 465 hoặc 587.

19063
18:14:16,955 --> 18:14:19,872
Đây là những thứ bạn\n

19064
18:14:19,872 --> 18:14:24,271
Nhưng nếu bạn đã từng phải định cấu hình,\nchẳng hạn như Outlook hoặc thậm chí Gmail

19065
18:14:24,271 --> 18:14:26,671
để nói chuyện với một tài khoản khác,\nbạn có thể rất tốt

19066
18:14:26,672 --> 18:14:30,902
đã nhìn thấy những con số này bằng cách gõ\n

19067
18:14:30,902 --> 18:14:33,892
và sau đó là một số, chỉ để\n

19068
18:14:33,892 --> 18:14:35,642
Nhưng chúng thường\nkhông phải là những thứ bạn và tôi

19069
18:14:35,642 --> 18:14:38,582
phải quan tâm, bởi vì\nmáy chủ và máy tính ngày nay

19070
18:14:38,581 --> 18:14:40,811
tự động hóa phần lớn quá trình này.

19071
18:14:40,812 --> 18:14:45,211
Nhưng cuối cùng thì đó cũng là tất cả những gì cần thiết cho\n

19072
18:14:45,211 --> 18:14:47,042
Nhưng nếu đó là một thông điệp thực sự lớn thì sao?

19073
18:14:47,042 --> 18:14:50,351
Nếu đó là một email ngắn thì có thể\n

19074
18:14:50,941 --> 18:14:54,241
Nhưng giả sử Phyllis muốn\ngửi cho Brian bức ảnh một con mèo

19075
18:14:54,241 --> 18:14:56,581
như thế này, hoặc tệ hơn, một đoạn video về một con mèo.

19076
18:14:56,581 --> 18:15:00,811
Sẽ là không công bằng\nnếu không ai khác có thể làm được gì

19077
18:15:00,812 --> 18:15:03,062
trên internet, chỉ vì Phyllis muốn

19078
18:15:03,062 --> 18:15:06,601
để gửi cho Brian một bức ảnh thật lớn,\na một video thật lớn về một con mèo.

19079
18:15:06,601 --> 18:15:10,351
Sẽ thật tuyệt nếu chúng ta có thể tử tế\n

19080
18:15:10,351 --> 18:15:13,529
qua các bộ định tuyến này, để\nchúng ta có thể dành chút thời gian

19081
18:15:13,529 --> 18:15:15,572
dành cho Phyllis, một chút thời gian dành cho người khác

19082
18:15:15,572 --> 18:15:18,779
một chút thời gian dành cho người khác,\n

19083
18:15:19,892 --> 18:15:25,472
Nhưng xét về mặt công bằng thì cô ấy không độc chiếm băng thông

19084
18:15:27,842 --> 18:15:31,982
Và điều này cho phép chúng ta\nthực hiện một tính năng khác của TCP/IP

19085
18:15:31,982 --> 18:15:35,072
đó là sự phân mảnh,\nnơi chúng ta có thể tạm thời

19086
18:15:35,072 --> 18:15:37,952
và máy tính của Phyllis sẽ\ntự động thực hiện việc này, phân mảnh

19087
18:15:37,952 --> 18:15:41,582
gói lớn được đề cập,\cũng như tệp lớn được đề cập

19088
18:15:41,581 --> 18:15:46,561
và sau đó sử dụng, không chỉ một\n

19089
18:15:48,369 --> 18:15:50,161
Tuy nhiên, nếu chúng ta làm điều đó,\ncó thể chúng ta sẽ đi

19090
18:15:50,161 --> 18:15:54,031
cần một thông tin khác,\n

19091
18:15:54,032 --> 18:15:57,332
Giống như, nếu bạn đang triển khai điều này,\n

19092
18:15:57,331 --> 18:16:00,301
thành bốn phần, như\theo trực giác, bạn có thể làm gì

19093
18:16:00,301 --> 18:16:03,911
bây giờ bạn muốn đặt hầu như vào\nbên ngoài phong bì này?

19094
18:16:05,259 --> 18:16:06,842
GIỌNG 1: Thứ tự của chúng, bằng cách nào đó.

19095
18:16:06,842 --> 18:16:10,472
Vì vậy có lẽ phần nào đó giống như phần\không có trong số bốn, phần hai trong số bốn

19096
18:16:10,471 --> 18:16:12,161
phần ba trong số bốn, v.v.

19097
18:16:12,161 --> 18:16:14,792
Vậy nên tôi sẽ viết thêm một điều nữa\n

19098
18:16:15,301 --> 18:16:17,551
Tôi đặt một số\nsố thứ tự, đó là

19099
18:16:17,551 --> 18:16:20,191
chỉ một chút manh mối\ncho Brian biết

19100
18:16:20,191 --> 18:16:22,171
theo thứ tự nào để\nlắp ráp lại những thứ này.

19101
18:16:22,172 --> 18:16:25,202
Và thậm chí còn mạnh mẽ hơn\nhơn thế, điều này thực sự

19102
18:16:25,202 --> 18:16:29,252
mang lại cho chúng ta sự nguyên thủy đơn giản này của\n

19103
18:16:30,452 --> 18:16:35,881
Nếu Brian nhận được những phong bì như thế này,\n

19104
18:16:35,881 --> 18:16:39,691
trường, thì rõ ràng TCP có tính năng nào khác\n

19105
18:16:39,691 --> 18:16:42,542
cho phép Brian và Phyllis thực hiện?

19106
18:16:44,282 --> 18:16:46,612
Nhưng đó không chỉ là việc sắp xếp các gói tin.

19107
18:16:46,611 --> 18:16:50,701
Điều gì khác có thể hữu ích khi\nhập số vào những thứ này

19108
18:16:55,187 --> 18:16:56,932
ĐỐI TƯỢNG: Còn nếu bạn thích bỏ lỡ thì sao.

19109
18:16:56,932 --> 18:16:58,851
LOA 1: Nếu bạn bỏ lỡ nội dung nào đó\ndự định được gửi

19110
18:16:59,851 --> 18:17:04,110
Câu trả lời ngắn gọn, chính xác là có, TCP,\n

19111
18:17:04,110 --> 18:17:06,652
mà chúng tôi đang bao gồm, có thể báo giá\nunquote việc giao hàng "đảm bảo".

19112
18:17:07,161 --> 18:17:10,341
Bởi vì nếu Brian nhận được một trong bốn, thì hai trong bốn

19113
18:17:10,342 --> 18:17:12,562
bốn trên bốn, nhưng\nkhông phải ba trên bốn

19114
18:17:12,562 --> 18:17:16,402
bây giờ anh ấy biết, có thể đoán trước được, rằng\n

19115
18:17:17,911 --> 18:17:21,801
Và đây chính là lý do tại sao hầu như\nluôn luôn, nếu bạn nhận được email

19116
18:17:21,801 --> 18:17:24,411
bạn có thể nhận được toàn bộ hoặc không có gì cả.

19117
18:17:24,411 --> 18:17:27,741
Thực sự không bao giờ nên thích câu, từ và\nđoạn văn

19118
18:17:29,361 --> 18:17:31,478
Hoặc nếu bạn tải xuống một\nbức ảnh trên web

19119
18:17:31,479 --> 18:17:33,562
nó không nên chỉ có một\nlỗ trống ở giữa

19120
18:17:33,562 --> 18:17:36,652
chỉ vì gói\nthông tin đó vô tình bị mất.

19121
18:17:36,652 --> 18:17:40,851
TCP, nếu đó là giao thức đang được sử dụng để\n

19122
18:17:40,851 --> 18:17:44,792
đảm bảo rằng tất cả đều ở đó,\n

19123
18:17:44,792 --> 18:17:48,112
Vì vậy đây là một thuộc tính quan trọng,\nnhưng, giống như một đoạn giới thiệu, có

19124
18:17:49,312 --> 18:17:52,732
Có một thứ gọi là UDP,\nlà một giải pháp thay thế cho TCP

19125
18:17:52,732 --> 18:17:54,472
điều đó không đảm bảo việc giao hàng.

19126
18:17:54,471 --> 18:17:58,072
Và cũng giống như một phần lý do tại sao bạn có thể\n

19127
18:17:58,072 --> 18:18:03,366
có thể bạn đang xem như đang xem trực tuyến\n

19128
18:18:03,366 --> 18:18:05,241
Bạn có thể không nhất thiết muốn thứ đó

19129
18:18:05,241 --> 18:18:08,476
để đệm và đệm và đệm và đệm, chỉ\n

19130
18:18:08,476 --> 18:18:10,351
bởi vì bạn sẽ\nbắt đầu nhớ nhung mọi thứ.

19131
18:18:10,351 --> 18:18:12,471
Và khi đó bạn sẽ là\người duy nhất trên thế giới xem

19132
18:18:12,471 --> 18:18:15,849
trận đấu đã kết thúc 20 phút trước, khi\n

19133
18:18:15,850 --> 18:18:18,142
Tương tự như vậy đối với một cuộc gọi thoại,\nit sẽ thực sự khó chịu

19134
18:18:18,142 --> 18:18:19,942
nếu giọng nói của chúng ta liên tục bị đệm.

19135
18:18:19,941 --> 18:18:22,678
Vì vậy UDP có thể là một giao thức\ntốt để đảm bảo

19136
18:18:22,679 --> 18:18:25,762
điều đó, ngay cả khi người ở bên kia\n

19137
18:18:26,991 --> 18:18:29,781
Nó không tạm dừng rồi\ngửi lại và gửi lại

19138
18:18:29,782 --> 18:18:33,961
bởi vì điều đó sẽ thực sự chậm lại\n

19139
18:18:33,961 --> 18:18:36,861
Vì vậy, tóm lại, IP xử lý việc xác định địa chỉ của các gói này

19140
18:18:36,861 --> 18:18:40,341
và chuẩn hóa những con số mà mọi\n

19141
18:18:40,342 --> 18:18:44,542
và TCP xử lý việc tiêu chuẩn hóa\nof giống như những dịch vụ nào

19142
18:18:44,542 --> 18:18:50,661
có thể được sử dụng, giữa điểm A và\n

19143
18:18:50,661 --> 18:18:54,652
nhưng có lẽ, khi Phyllis\ns gửi tin nhắn cho Brian

19144
18:18:54,652 --> 18:18:56,782
cô ấy thực sự không biết\nvà có lẽ không nên

19145
18:18:56,782 --> 18:18:58,912
quan tâm địa chỉ IP của anh ta là gì, phải không?

19146
18:18:58,911 --> 18:19:01,491
Ngày nay, có vẻ như tôi không biết hầu hết các số điện thoại

19147
18:19:02,661 --> 18:19:04,614
Thay vào đó tôi tìm kiếm chúng theo một cách nào đó.

19148
18:19:04,614 --> 18:19:07,072
Và thực sự, khi bạn truy cập một\ntrang web, bạn gõ gì vào?

19149
18:19:07,072 --> 18:19:10,048
Nó thường không phải là cái gì đó\ndot cái gì đó chấm cái gì đó chấm

19150
18:19:10,048 --> 18:19:12,298
thứ gì đó, trong đó mỗi thứ\nthứ đó là một con số.

19151
18:19:12,298 --> 18:19:14,182
Bạn thường\nnhập gì vào trình duyệt?

19152
18:19:15,622 --> 18:19:20,031
Giống như Stanford.edu,\nHarvard.edu, Yale.edu, gmail.com

19153
18:19:20,031 --> 18:19:22,072
hoặc bất kỳ tên miền nào khác như vậy.

19154
18:19:22,072 --> 18:19:24,622
Và thật may mắn,\ncó một hệ thống khác

19155
18:19:24,622 --> 18:19:29,551
trên internet, thêm một từ viết tắt cho\n

19156
18:19:29,551 --> 18:19:33,742
Và hầu như mọi mạng trên\n

19157
18:19:33,741 --> 18:19:37,838
mạng gia đình của bạn, ở đâu đó,\nbằng cách nào đó lại có máy chủ DNS.

19158
18:19:37,839 --> 18:19:39,922
Có thể bạn chưa\ntự định cấu hình nó.

19159
18:19:39,922 --> 18:19:44,342
Ai đó đã làm vậy, khuôn viên trường của bạn,\n của bạn

19160
18:19:44,342 --> 18:19:48,112
Nhưng có một số máy chủ được kết nối\n

19161
18:19:48,111 --> 18:19:52,701
qua dây hoặc không dây, chỉ vậy\n

19162
18:19:52,702 --> 18:19:55,672
một bảng tính lớn, nếu bạn\nmuốn, hoặc, nếu bạn thích

19163
18:19:55,672 --> 18:19:59,992
một bảng băm, có ít nhất\nhai cột khóa và giá trị

19164
18:20:00,812 --> 18:20:02,241
Ở đâu bên trái\nlà nơi chúng ta sẽ

19165
18:20:02,241 --> 18:20:04,262
gọi tên miền,\nđại loại như Harvard.edu

19166
18:20:04,262 --> 18:20:08,902
Yale.edu, một địa chỉ IP ở\nphía bên phải, nghĩa là

19167
18:20:08,902 --> 18:20:13,612
mục đích sống của máy chủ DNS\nis chỉ là dịch tên miền

19168
18:20:14,896 --> 18:20:17,271
Và ngược lại, nếu bạn muốn\nđi theo hướng khác

19169
18:20:17,271 --> 18:20:22,072
và về mặt kỹ thuật, nói chính xác thì nó\n

19170
18:20:23,432 --> 18:20:25,441
Và chúng ta sẽ xem những gì\n đó là gì sau giây lát nữa.

19171
18:20:25,441 --> 18:20:27,652
Nhưng một lần nữa, tất cả những điều này\nđiều này xảy ra một cách kỳ diệu

19172
18:20:27,652 --> 18:20:29,402
khi bạn bật\nđiện thoại hoặc máy tính xách tay của mình

19173
18:20:29,402 --> 18:20:33,292
hôm nay, bởi vì tất cả những điều này\n

19174
18:20:33,292 --> 18:20:38,752
Vậy làm thế nào chúng ta có thể thực sự bắt đầu\n

19175
18:20:38,751 --> 18:20:44,911
Nào, hãy tiếp tục và khám phá xung quanh,\n

19176
18:20:44,911 --> 18:20:48,531
Hãy xem chúng ta thực sự có thể làm gì\n

19177
18:20:48,532 --> 18:20:52,672
Nếu bây giờ chúng tôi có khả năng\ndi chuyển dữ liệu từ điểm A đến điểm B

19178
18:20:52,672 --> 18:20:55,252
và những gì có thể có trong phong bì đó\ncó thể là một email

19179
18:20:55,251 --> 18:20:58,011
nhưng ngày nay, trở đi, nó thực sự\nsẽ là nội dung web.

19180
18:20:58,012 --> 18:21:00,202
Sẽ có nội dung\nmà bạn đang yêu cầu

19181
18:21:00,202 --> 18:21:01,584
like cho tôi trang chủ của ngày hôm nay.

19182
18:21:01,584 --> 18:21:03,292
Và có nội dung\nbạn đang gửi

19183
18:21:03,292 --> 18:21:05,512
sẽ là nội dung của\ntrang chủ thực sự đó.

19184
18:21:05,512 --> 18:21:10,642
Vì vậy, để đi sâu hơn một cấp,\n

19185
18:21:10,642 --> 18:21:14,602
đang đi từ điểm A đến\nđiểm B bằng TCP/IP, hãy cùng

19186
18:21:14,601 --> 18:21:19,221
đặt thứ gì đó cụ thể vào bên trong chúng,\n

19187
18:21:19,221 --> 18:21:24,149
nhưng có thứ gọi là HTTP,\n

19188
18:21:24,149 --> 18:21:25,941
Có lẽ bạn đã nhìn thấy điều này trong nhiều thập kỷ rồi

19189
18:21:25,941 --> 18:21:29,331
ở dạng URL, nhiều đến mức bạn\n

19190
18:21:29,331 --> 18:21:31,521
Trình duyệt của bạn chỉ tự động thêm\nit cho bạn

19191
18:21:31,521 --> 18:21:35,101
và bạn chỉ cần nhập Harvard.edu,\cũng không phải Yale.edu hoặc tương tự.

19192
18:21:35,101 --> 18:21:38,391
Nhưng HTTP chỉ là giao thức\ncuối cùng mà chúng ta sẽ

19193
18:21:38,392 --> 18:21:42,412
nói ở đây, điều đó chỉ\nchuẩn hóa cách các trình duyệt web và web

19194
18:21:44,611 --> 18:21:47,601
Vì vậy, đây\nlà sự khác biệt giữa Internet và web.

19195
18:21:47,601 --> 18:21:50,001
Internet thực sự giống như\nhệ thống ống nước cấp thấp

19196
18:21:50,001 --> 18:21:53,091
tất cả các loại cáp, tất cả\ncông nghệ giúp di chuyển các gói

19197
18:21:53,092 --> 18:21:57,322
từ trái sang phải, từ phải sang trái, trên\n

19198
18:21:57,322 --> 18:22:01,941
đến điểm B. Bạn có thể làm bất cứ điều gì bạn\n

19199
18:22:01,941 --> 18:22:06,121
email, web, video, trò chuyện\nand chơi game và tất cả những thứ đó.

19200
18:22:06,122 --> 18:22:09,652
Vì vậy HTTP hoặc web\nis chỉ là một ứng dụng

19201
18:22:09,652 --> 18:22:13,695
về mặt khái niệm,\nđược xây dựng trên internet.

19202
18:22:13,695 --> 18:22:15,862
Một khi bạn chấp nhận\nrằng có Internet

19203
18:22:15,861 --> 18:22:17,451
bạn có thể làm những điều thực sự\nthú vị với nó

19204
18:22:17,452 --> 18:22:19,942
giống như trong thế giới vật chất của chúng ta,\nmột khi bạn có điện

19205
18:22:19,941 --> 18:22:22,941
bạn chỉ có thể cho rằng bạn thực sự có thể làm được\n

19206
18:22:22,941 --> 18:22:25,101
thậm chí không cần biết\cũng như không quan tâm nó hoạt động như thế nào.

19207
18:22:25,101 --> 18:22:28,801
Nhưng bây giờ bạn sẽ\nlập trình cho web

19208
18:22:28,801 --> 18:22:32,131
thật hữu ích nếu hiểu được\nmột số thứ này thực sự hoạt động như thế nào.

19209
18:22:32,131 --> 18:22:36,202
Vì vậy, chúng ta hãy xem qua\nđịnh dạng của những thứ

19210
18:22:37,402 --> 18:22:39,922
Ngày nay,\thực tế, đó thường là HTTPS

19211
18:22:39,922 --> 18:22:42,172
trong trò chơi, một lần nữa,\nS chỉ có nghĩa là an toàn.

19212
18:22:42,172 --> 18:22:47,092
Sẽ nói thêm về điều đó sau, nhưng HTTP là\n

19213
18:22:47,092 --> 18:22:48,472
đi vào bên trong những phong bì này.

19214
18:22:48,471 --> 18:22:52,281
Và thật tuyệt vời, thông thường đó chỉ là\nthông tin văn bản.

19215
18:22:52,282 --> 18:22:56,992
Có một định dạng văn bản đơn giản\nmà con người đã quyết định từ nhiều năm trước

19216
18:22:56,991 --> 18:23:00,441
nằm bên trong\phong bì này, cho trình duyệt biết cách

19217
18:23:00,441 --> 18:23:04,762
để yêu cầu thông tin từ máy chủ,\n

19218
18:23:04,762 --> 18:23:06,392
cung cấp thông tin cho khách hàng đó.

19219
18:23:06,392 --> 18:23:12,592
Ví dụ: đây là một chuẩn\n

19220
18:23:12,592 --> 18:23:14,362
Bạn có thể thấy gì ở phần cuối của điều này?

19221
18:23:14,361 --> 18:23:15,829
Đôi khi bạn có thể thấy một dấu gạch chéo.

19222
18:23:15,830 --> 18:23:18,622
Các trình duyệt ngày nay đơn giản hóa hơn\n

19223
18:23:18,622 --> 18:23:21,771
Nhưng dấu gạch chéo, như chúng ta sẽ thấy,\nbiểu thị như mặc định

19224
18:23:21,771 --> 18:23:24,652
thư mục gốc của ổ cứng\nmáy chủ web

19225
18:23:24,652 --> 18:23:26,077
giống như bất cứ điều gì cơ sở của nó.

19226
18:23:26,077 --> 18:23:32,182
Nó giống như dấu gạch chéo ngược dấu hai chấm C trên\n

19227
18:23:32,182 --> 18:23:34,432
Nhưng một URL có thể có nhiều hơn thế.

19228
18:23:34,432 --> 18:23:36,982
Nó có thể có đường gạch chéo,\ntrong đó đường dẫn chỉ là một từ

19229
18:23:36,982 --> 18:23:40,552
hoặc nhiều từ, đại loại như vậy\n

19230
18:23:40,551 --> 18:23:43,072
Đường dẫn đó thực sự có thể là\một tệp cụ thể, chúng ta sẽ thấy

19231
18:23:43,072 --> 18:23:45,262
giống như một thứ gọi là file.html.

19232
18:23:45,262 --> 18:23:48,682
Tìm hiểu thêm về HTML chỉ trong giây lát hoặc\nit thậm chí có thể là thư mục gạch chéo

19233
18:23:48,682 --> 18:23:52,911
có thể bằng một dấu gạch chéo khác, hoặc\ncó thể là /folder/file.html.

19234
18:23:52,911 --> 18:23:57,081
Ngày nay, Safari và thậm chí cả Chrome\n

19235
18:23:57,081 --> 18:24:00,621
đang có thói quen cố gắng che giấu\n

19236
18:24:02,361 --> 18:24:05,121
Tuy nhiên, cuối cùng thì sẽ hữu ích nếu hiểu được

19237
18:24:05,122 --> 18:24:08,812
bạn đang ở URL nào, vì\nit ánh xạ trực tiếp tới mã

19238
18:24:08,812 --> 18:24:10,642
mà cuối cùng chúng ta sẽ viết.

19239
18:24:10,642 --> 18:24:13,282
Nhưng điều này chỉ để nói rằng\ntất cả những thứ này đều có màu vàng

19240
18:24:13,282 --> 18:24:18,322
có lẽ đề cập đến một\ntệp và/hoặc thư mục cụ thể trên web

19241
18:24:18,322 --> 18:24:20,214
máy chủ mà bạn đang lập trình trên đó.

19242
18:24:21,172 --> 18:24:26,002
Ví dụ.com, đây là tên miền\n

19243
18:24:26,001 --> 18:24:28,621
Ví dụ.com là tên miền\nđược gọi là.

19244
18:24:28,622 --> 18:24:33,532
Toàn bộ điều này, www.example.com,\n

19245
18:24:33,532 --> 18:24:37,432
Và thứ mà WW đang đề cập\n cụ thể là cái tên

19246
18:24:37,432 --> 18:24:40,292
của một máy chủ cụ thể trong miền đó.

19247
18:24:40,292 --> 18:24:44,842
Ngày xưa có máy chủ web\na www.example.com.

19248
18:24:44,842 --> 18:24:48,442
Có thể đã có máy chủ thư\nmail.example.com.

19249
18:24:48,441 --> 18:24:51,501
Có thể đã có máy chủ trò chuyện\nchat.example.com.

19250
18:24:51,501 --> 18:24:56,331
Ngày nay, tên máy chủ hoặc\ntên miền phụ này, tùy thuộc vào ngữ cảnh

19251
18:24:56,331 --> 18:24:58,581
thực sự có thể đề cập đến toàn bộ\nmáy chủ, phải không?

19252
18:24:58,581 --> 18:25:01,792
Khi bạn truy cập www.facebook.com,\nđó không phải là một máy chủ

19253
18:25:01,792 --> 18:25:03,652
đó là hàng ngàn máy chủ ngày nay.

19254
18:25:03,652 --> 18:25:05,631
Nói tóm lại,\ncó công nghệ

19255
18:25:05,631 --> 18:25:08,122
bằng cách nào đó lấy dữ liệu của bạn\vào một trong những máy chủ đó

19256
18:25:08,122 --> 18:25:11,491
nhưng toàn bộ chuyện này là những gì chúng ta\n

19257
18:25:11,491 --> 18:25:13,822
Cái này ở đây, tên máy chủ,\trong ngữ cảnh của một email

19258
18:25:13,822 --> 18:25:16,702
địa chỉ nó có thể được gọi là tên miền phụ\n.

19259
18:25:16,702 --> 18:25:20,062
Thứ này ở đây, tên miền cấp\ncao nhất, có lẽ bạn

19260
18:25:20,062 --> 18:25:23,422
biết rằng dot com có nghĩa là thương mại,\n

19261
18:25:23,422 --> 18:25:25,762
Dot org cũng tương tự, dot net.

19262
18:25:25,762 --> 18:25:29,182
Một số trong số chúng bị hạn chế một chút,\n

19263
18:25:29,182 --> 18:25:31,711
dot edu chỉ dành cho các tổ chức giáo dục\được công nhận.

19264
18:25:31,711 --> 18:25:35,211
Nhưng có hàng trăm, nếu\nkhông nhiều hơn, các miền cấp cao nhất

19265
18:25:35,211 --> 18:25:37,702
ngày nay, một số phổ biến hơn những cái khác.

19266
18:25:37,702 --> 18:25:41,542
Ví dụ: các công cụ của CS50 sử dụng CS50.io.

19267
18:25:41,542 --> 18:25:44,182
IO loại bao hàm đầu vào-đầu ra.

19268
18:25:44,182 --> 18:25:49,131
Tuy nhiên, nó thực sự thuộc về\n

19269
18:25:49,131 --> 18:25:55,366
có mã quốc gia là .io và bạn thấy\n

19270
18:25:56,241 --> 18:26:00,399
Thật vậy, đó thường là something.uk,\nsomething.jp và những thứ tương tự

19271
18:26:01,191 --> 18:26:04,042
Nhưng một số trong số đó cũng đã được\nđồng chọn, .tv cũng vậy

19272
18:26:04,042 --> 18:26:06,932
bởi vì chúng cũng có những\ný nghĩa này trong tiếng Anh.

19273
18:26:06,932 --> 18:26:08,991
Cuối cùng, đây là tên\nchúng ta sẽ gọi là giao thức.

19274
18:26:08,991 --> 18:26:13,042
Điều đó chỉ định cách máy chủ sử dụng\n

19275
18:26:13,042 --> 18:26:16,351
đến điểm B. Vậy bên trong phong bì này là gì?

19276
18:26:16,351 --> 18:26:18,622
Bây giờ chúng ta hãy bắt đầu tìm hiểu thêm một chút.

19277
18:26:18,622 --> 18:26:20,211
Bên trong chiếc phong bì này có gì?

19278
18:26:20,211 --> 18:26:23,782
Về cơ bản, đối với mục đích\ncủa chúng ta ngày nay, đó là một trong hai động từ

19279
18:26:25,792 --> 18:26:28,612
Và nếu bất kỳ ai trong số các bạn đã học qua\n

19280
18:26:28,611 --> 18:26:30,569
bạn có thể đã từng thấy một số\nđiều khoản này trước đây.

19281
18:26:30,570 --> 18:26:34,702
Nhưng hai động từ này mô tả\ncách gửi thông tin

19282
18:26:36,952 --> 18:26:39,172
Nói ngắn gọn, nhiều hơn\non vào tuần tới

19283
18:26:39,172 --> 18:26:43,472
GET có nghĩa là đặt bất kỳ thông tin nhập nào của người dùng\vào URL, POST có nghĩa là ẩn nó

19284
18:26:43,471 --> 18:26:46,641
để những thứ bạn đang tìm kiếm,\n

19285
18:26:46,642 --> 18:26:49,634
tên người dùng và mật khẩu bạn\n

19286
18:26:49,634 --> 18:26:51,592
và do đó hiển thị\nvới bất kỳ ai có quyền truy cập

19287
18:26:51,592 --> 18:26:53,672
tới máy tính của bạn và\nlịch sử tìm kiếm của bạn

19288
18:26:53,672 --> 18:26:57,802
mà đúng hơn là bằng cách nào đó chúng được cung cấp\n

19289
18:26:57,801 --> 18:27:00,292
Nhưng hiện tại, chúng ta sẽ tập trung\gần như hoàn toàn vào GET

19290
18:27:00,292 --> 18:27:03,741
có lẽ là phổ biến nhất\n

19291
18:27:03,741 --> 18:27:05,251
Và những gì chúng ta sẽ làm là thế này.

19292
18:27:05,251 --> 18:27:07,461
Hãy để tôi chuyển\nsang một màn hình trống ở đây.

19293
18:27:07,461 --> 18:27:11,182
Và nếu chúng ta cho rằng\nnói với tôi rằng chiếc máy tính xách tay này ở đây

19294
18:27:11,182 --> 18:27:16,191
và tôi được kết nối với đám mây và\n

19295
18:27:16,191 --> 18:27:20,182
muốn yêu cầu trang web\nof, Harvard.edu hoặc Yale.edu

19296
18:27:20,182 --> 18:27:22,982
nó thực sự sẽ là một quá trình gồm hai bước.

19297
18:27:22,982 --> 18:27:27,892
Sẽ có một yêu cầu,\n

19298
18:27:27,892 --> 18:27:29,752
và sau đó, hy vọng là,\nmáy chủ sẽ nghe thấy

19299
18:27:29,751 --> 18:27:34,011
yêu cầu đó sẽ trả lời bằng\n

19300
18:27:34,012 --> 18:27:37,042
Và các thuật ngữ khác\ncó liên quan ở đây, là máy tính xách tay của tôi

19301
18:27:37,042 --> 18:27:40,642
được gọi là khách hàng,\nHarvard.edu, Yale.edu, sao cũng được

19302
18:27:40,642 --> 18:27:42,352
nó được gọi là máy chủ.

19303
18:27:42,351 --> 18:27:45,441
Và cũng giống như trong một nhà hàng, nơi\n

19304
18:27:45,441 --> 18:27:47,091
máy chủ có thể mang nó đến cho bạn.

19305
18:27:47,092 --> 18:27:49,372
Một lần nữa, đó là kiểu quan hệ hai chiều.

19306
18:27:49,372 --> 18:27:54,381
Một yêu cầu, một phản hồi cho\nmỗi trang web mà chúng tôi yêu cầu.

19307
18:27:54,381 --> 18:27:58,042
Được rồi, vậy bên trong những thứ này có gì\n

19308
18:27:58,042 --> 18:28:01,012
À, mũi tên này, đường thẳng này tôi\nvừa vẽ từ trái sang phải

19309
18:28:01,012 --> 18:28:05,301
đại diện cho yêu cầu về mặt kỹ thuật\n

19310
18:28:05,301 --> 18:28:08,031
Khi bạn truy cập một trang web\n bằng trình duyệt của bạn

19311
18:28:08,032 --> 18:28:11,452
trên điện thoại, máy tính xách tay hoặc máy tính để bàn của bạn,\n

19312
18:28:11,452 --> 18:28:14,794
và tin nhắn văn bản trên máy Mac hoặc PC của bạn\n

19313
18:28:14,793 --> 18:28:16,251
trông hơi giống thế này.

19314
18:28:16,251 --> 18:28:20,111
Động từ GET, URL, hay đúng hơn\nđường dẫn mà bạn muốn lấy

19315
18:28:20,111 --> 18:28:22,941
dấu gạch chéo biểu thị\ntrang mặc định trên trang web.

19316
18:28:22,941 --> 18:28:27,682
HTTP/1.1 chỉ là một số đề cập đến\n

19317
18:28:27,682 --> 18:28:31,221
Bây giờ chúng tôi đã lên tới phiên bản 2 và\n

19318
18:28:31,221 --> 18:28:35,811
Và phong bì chứa một ít\n

19319
18:28:35,812 --> 18:28:37,502
tên miền đủ điều kiện.

19320
18:28:37,501 --> 18:28:42,331
Điều này là do các máy chủ đơn lẻ có thể\n

19321
18:28:42,331 --> 18:28:46,011
Nếu bạn đang sử dụng Squarespace hoặc Wix hoặc\n

19322
18:28:46,012 --> 18:28:49,282
ngày nay, rất có thể bạn không có máy chủ\ncá nhân của riêng mình.

19323
18:28:49,282 --> 18:28:52,652
Bạn đang ở trên cùng một máy chủ với\n

19324
18:28:52,652 --> 18:28:56,241
Nhưng khi khách hàng,\ntrình duyệt của người dùng của bạn

19325
18:28:56,241 --> 18:29:00,471
bao gồm một chút đề cập đến\n của bạn

19326
18:29:00,471 --> 18:29:02,841
tên trong phong bì,\nSquarespace và Wix chỉ

19327
18:29:02,842 --> 18:29:06,442
biết gửi nó tới trang web của bạn hoặc\n

19328
18:29:07,142 --> 18:29:09,032
Chấm chấm chấm,\ncó một số nội dung khác ở đó.

19329
18:29:09,032 --> 18:29:12,532
Nhưng đó thực sự là bản chất\ncủa những yêu cầu này.

19330
18:29:12,532 --> 18:29:16,312
Hy vọng rằng khi trình duyệt của bạn\n

19331
18:29:17,361 --> 18:29:21,951
Vâng, hy vọng là sẽ có phản hồi\nnhư thế này, HTTP/1.1

19332
18:29:21,952 --> 18:29:25,822
vì vậy cùng một phiên bản, một số\nmã trạng thái, như số 200

19333
18:29:25,822 --> 18:29:30,021
và sau đó là một cụm từ ngắn như\n

19334
18:29:31,682 --> 18:29:35,062
Sau đó nó chứa một số thứ khác\n

19335
18:29:35,872 --> 18:29:37,789
Và chúng ta sẽ thấy rằng điều này\ncũng đã được tiêu chuẩn hóa.

19336
18:29:37,789 --> 18:29:41,932
Văn bản/HTML có nghĩa là ở đây có một số\n

19337
18:29:41,932 --> 18:29:48,142
Thay vào đó, nó có thể là image/jpeg\cũng không phải Image/png hoặc video/mp4

19338
18:29:48,142 --> 18:29:51,982
có những nội dung khác nhau\n

19339
18:29:51,982 --> 18:29:54,711
xác định duy nhất các loại\ncủa tệp, quay trở lại

19340
18:29:54,711 --> 18:29:57,322
về mặt tinh thần tương tự như file\nexttensions, nhưng nhiều hơn một chút

19341
18:29:59,232 --> 18:30:00,982
Sau đó còn một số\nthứ nữa, chấm chấm chấm.

19342
18:30:00,982 --> 18:30:05,842
Nhưng nói chung, những gì bạn thấy ở đây là\n

19343
18:30:05,842 --> 18:30:09,652
Các khóa và giá trị này\còn được gọi là tiêu đề HTTP.

19344
18:30:09,652 --> 18:30:14,092
Và trình duyệt của bạn đã gửi\n

19345
18:30:14,092 --> 18:30:16,422
Và thực sự, chúng ta có thể tự mình nhìn thấy\nđiều này ngay bây giờ.

19346
18:30:16,422 --> 18:30:20,422
Hãy để tôi chuyển tới Chrome trên máy tính của tôi chỉ trong giây\ngiây nữa

19347
18:30:20,422 --> 18:30:23,552
mặc dù bạn có thể làm điều này\n

19348
18:30:23,551 --> 18:30:28,641
Tôi sẽ tiếp tục và truy cập\nHTTP://Harvard.edu, Enter.

19349
18:30:28,642 --> 18:30:31,459
Và, thì đấy, hôm nay tôi đang ở trang chủ của Harvard.

19350
18:30:32,542 --> 18:30:34,982
Nhưng hiện tại nó\ncó vẻ như thế này.

19351
18:30:34,982 --> 18:30:38,002
Ồ, tôi đã nhập URL nhưng\nnhận thấy nó có thay đổi một chút.

19352
18:30:38,001 --> 18:30:41,011
Nó thực sự đã gửi tôi tới\nHTTPS và thêm www

19353
18:30:41,012 --> 18:30:42,682
mặc dù tôi không gõ cái đó.

19354
18:30:42,682 --> 18:30:46,702
Nhưng hóa ra chúng ta có thể khám phá xung quanh\n

19355
18:30:47,812 --> 18:30:50,542
Tôi sẽ bắt đầu sử dụng chế độ ẩn danh\n

19356
18:30:50,542 --> 18:30:52,500
quan tâm rằng mọi người biết\nTôi đang truy cập Harvard.edu

19357
18:30:52,500 --> 18:30:56,471
nhưng vì nó vứt đi\nlịch sử mà tôi vừa làm.

19358
18:30:56,471 --> 18:30:58,971
Để mọi yêu cầu\nsẽ trông giống như một yêu cầu hoàn toàn mới

19359
18:30:58,971 --> 18:31:01,429
và điều đó chỉ hữu ích\nvề mặt chẩn đoán, bởi vì chúng tôi luôn

19360
18:31:01,429 --> 18:31:02,781
sẽ xem thông tin mới.

19361
18:31:02,782 --> 18:31:06,082
Trình duyệt của tôi sẽ không nhớ\n

19362
18:31:06,081 --> 18:31:09,441
Nhưng tôi sẽ đi\nlên View, nhà phát triển

19363
18:31:09,441 --> 18:31:13,042
công cụ dành cho nhà phát triển, đó là thứ gì đó\n

19364
18:31:13,042 --> 18:31:15,652
Và có điều gì đó\ntương tự đối với Firefox và Edge

19365
18:31:15,652 --> 18:31:17,631
và Safari và các trình duyệt khác.

19366
18:31:17,631 --> 18:31:20,301
Các công cụ dành cho nhà phát triển sẽ\nmở các tab này ở đây.

19367
18:31:20,301 --> 18:31:23,509
Tôi thực sự không quan tâm có gì mới nên tôi\n

19368
18:31:23,509 --> 18:31:26,182
Và tôi sẽ di chuột qua tab\nMạng trong giây lát.

19369
18:31:26,182 --> 18:31:31,252
Và bây giờ tôi sẽ bắt đầu và\nnói HTTP://Harvard.edu, vậy

19370
18:31:32,422 --> 18:31:36,022
Tôi sẽ nhấn Enter,\nvà rất nhiều thứ

19371
18:31:36,021 --> 18:31:37,342
vừa bay ngang qua màn hình.

19372
18:31:38,601 --> 18:31:43,702
Và nếu tôi phóng to xuống đây, Chúa ơi,\n

19373
18:31:43,702 --> 18:31:48,082
đang tải xuống, 17, 18,\n19 megabyte, 20 megabyte là bao nhiêu

19374
18:31:48,081 --> 18:31:53,182
hàng triệu byte thông tin,\nhơn 111 yêu cầu HTTP.

19375
18:31:53,182 --> 18:31:56,062
Nói cách khác, có một\nđơn giản hóa một chút, nhưng trình duyệt của tôi

19376
18:31:56,062 --> 18:31:59,692
Tôi không hề biết, ban đầu đã gửi một\phong bì kèm theo yêu cầu.

19377
18:31:59,691 --> 18:32:01,611
Sau đó người phục vụ nói,\nĐược rồi, nhân tiện, có

19378
18:32:01,611 --> 18:32:05,241
110 thứ khác bạn cần, 112\nthứ khác bạn cần có.

19379
18:32:05,241 --> 18:32:09,441
Thế là máy tính của tôi quay đi quay lại,\n

19380
18:32:10,191 --> 18:32:13,581
Chà, bên trong trang web\n của Harvard có rất nhiều hình ảnh

19381
18:32:13,581 --> 18:32:16,341
và có thể cả các tệp âm thanh,\nvideo và những nội dung khác

19382
18:32:16,342 --> 18:32:18,741
tất cả đều cần được\ntải xuống và soạn thảo

19383
18:32:18,741 --> 18:32:20,161
trang web cuối cùng là gì

19384
18:32:20,161 --> 18:32:22,881
Nhưng tôi không quan tâm đến hơn\n100 điều này.

19385
18:32:22,881 --> 18:32:25,161
Trước tiên hãy tập trung vào điều đầu tiên.

19386
18:32:25,161 --> 18:32:27,711
Yêu cầu đầu tiên\ntôi đã gửi ở đây.

19387
18:32:27,711 --> 18:32:30,771
Và tôi sẽ nhấp vào\nhàng này, trong tab Mạng.

19388
18:32:30,771 --> 18:32:33,501
Sau đó tôi sẽ xem một\nthông tin chẩn đoán.

19389
18:32:33,501 --> 18:32:36,741
Đối với một người bình thường sử dụng\n

19390
18:32:36,741 --> 18:32:39,292
cũng như có thể bạn đã không quan tâm đến nó cho đến tận bây giờ.

19391
18:32:41,001 --> 18:32:44,991
Nhưng nếu tôi cuộn xuống\nyêu cầu tiêu đề, bạn sẽ thấy

19392
18:32:44,991 --> 18:32:48,952
nếu tôi nhấp vào Xem nguồn, theo nghĩa đen\n

19393
18:32:48,952 --> 18:32:51,282
máy Mac của tôi vừa gửi tới Harvard.edu.

19394
18:32:51,282 --> 18:32:56,482
Hai dòng quen thuộc,\nget/http1.1, máy chủ:harvard.edu

19395
18:32:56,482 --> 18:32:59,942
và sau đó là những thứ khác mà hiện tại,\n

19396
18:32:59,941 --> 18:33:03,381
Nhưng hãy xem phản hồi\nđược trả về từ máy chủ.

19397
18:33:03,381 --> 18:33:08,421
Bây giờ tôi sẽ cuộn lên và\n

19398
18:33:11,211 --> 18:33:14,032
Không có 200, không có từ OK.

19399
18:33:14,032 --> 18:33:18,112
Thật kỳ lạ, harvard.edu\nha đã chuyển đi vĩnh viễn.

19400
18:33:18,953 --> 18:33:20,661
Chà, có rất nhiều\nthứ ở đây

19401
18:33:20,661 --> 18:33:22,119
điều đó không thú vị lắm đối với chúng tôi

19402
18:33:22,119 --> 18:33:24,781
Nhưng dòng này, vị trí, là thú vị.

19403
18:33:24,782 --> 18:33:28,552
Đây là tiêu đề HTTP, một cặp giá trị khóa\nchuẩn hóa

19404
18:33:28,551 --> 18:33:32,301
đó là một phần của giao thức HTTP\n, tức là các quy ước.

19405
18:33:32,301 --> 18:33:34,881
Và nếu tôi chỉ đánh dấu\ncái này, nó sẽ cho tôi biết

19406
18:33:34,881 --> 18:33:38,421
mm-mmm, Harvard không phải là HTTP://Harvard.edu

19407
18:33:38,422 --> 18:33:44,242
Trang web của Harvard hiện đã có, và có lẽ\n

19408
18:33:47,631 --> 18:33:50,641
Có lẽ ai đó ở Harvard muốn\n

19409
18:33:50,642 --> 18:33:53,092
Vì vậy, họ đã chuyển hướng bạn\ntừ HTTP sang HTTPS.

19410
18:33:53,092 --> 18:33:57,392
Có thể những người tiếp thị muốn bạn làm vậy\n

19411
18:33:57,892 --> 18:34:00,350
Chỉ để chuẩn hóa mọi thứ,\nnhưng có những lý do kỹ thuật

19412
18:34:00,350 --> 18:34:03,442
để sử dụng tên máy chủ chứ không phải\nchỉ tên miền thô.

19413
18:34:03,441 --> 18:34:06,331
Và tất cả những thứ khác đều được sắp xếp\n

19414
18:34:06,331 --> 18:34:11,361
bây giờ, bởi vì trình duyệt\nnhận được phản hồi 301 sẽ biết

19415
18:34:11,361 --> 18:34:16,461
theo thiết kế, theo định nghĩa của HTTP,\n

19416
18:34:16,461 --> 18:34:20,065
Và đó là lý do tại sao, trong trình duyệt của tôi, tất cả\n

19417
18:34:20,065 --> 18:34:22,732
bởi vì tôi không thực sự biết hoặc\nquan tâm đến tất cả những tiêu đề đó.

19418
18:34:22,732 --> 18:34:26,482
Nhưng đó là lý do và bằng cách nào tôi\nkết thúc tại URL này ở đây.

19419
18:34:26,482 --> 18:34:29,842
Trình duyệt của tôi được yêu cầu di chuyển\đến nơi khác thông qua vị trí mới đó.

19420
18:34:29,842 --> 18:34:32,392
Và trình duyệt chỉ\nđi theo những đường dẫn đó

19421
18:34:32,392 --> 18:34:35,122
nếu bạn muốn, thì vào thời điểm đó\n

19422
18:34:35,122 --> 18:34:39,562
và các tập tin, v.v., tạo nên trang cụ thể này.

19423
18:34:40,638 --> 18:34:42,471
Và hãy để tôi thực sự đi\nvào Mã VS, giá như

19424
18:34:42,471 --> 18:34:45,596
bởi vì nó dễ chịu hơn một chút\n

19425
18:34:45,596 --> 18:34:49,201
mà không thực sự sử dụng\na trình duyệt chính thức.

19426
18:34:49,202 --> 18:34:51,381
Vì vậy bây giờ chúng ta hãy sử dụng chương trình tương đương\nan.

19427
18:34:51,381 --> 18:34:54,351
Nó được gọi là Curl, để\nkết nối với một URL, đó là

19428
18:34:54,351 --> 18:34:57,262
sẽ cho phép tôi chơi cùng\n

19429
18:34:57,262 --> 18:34:59,872
mà không cần tải xuống\ntất cả hình ảnh và văn bản

19430
18:34:59,872 --> 18:35:01,312
và vân vân từ trang web.

19431
18:35:01,312 --> 18:35:03,902
Nó sẽ cho phép tôi\nlàm điều gì đó như thế này.

19432
18:35:03,902 --> 18:35:10,941
Hãy để tôi tiếp tục và chạy, chẳng hạn\n

19433
18:35:10,941 --> 18:35:14,572
đối số dòng có nội dung\nmô phỏng yêu cầu GET bằng văn bản

19434
18:35:15,831 --> 18:35:20,661
Và hãy truy cập\nHTTP://Harvard.edu Enter.

19435
18:35:20,661 --> 18:35:23,834
Bây giờ, về cách thức hoạt động của Curl,\nTôi chỉ nhìn thấy các tiêu đề.

19436
18:35:23,834 --> 18:35:25,792
Không cần phải tải xuống\ntoàn bộ trang web.

19437
18:35:25,792 --> 18:35:28,792
Và bạn cũng thấy điều tương tự\n, 301 đã được chuyển đi vĩnh viễn.

19438
18:35:28,792 --> 18:35:31,562
Vị trí thực sự là ở đây.

19439
18:35:31,562 --> 18:35:33,202
Vì vậy, đó là loại thú vị.

19440
18:35:33,202 --> 18:35:34,881
Nhưng bây giờ chúng ta hãy làm theo nó một cách thủ công.

19441
18:35:34,881 --> 18:35:37,682
Bây giờ chúng ta hãy làm những gì nó bảo tôi làm.

19442
18:35:37,682 --> 18:35:42,381
Hãy đi tới vị trí đó bằng\nHTTPS và www rồi nhấn Enter.

19443
18:35:42,381 --> 18:35:46,402
Và bây giờ,\ndấu hiệu tốt với kết quả này là gì?

19444
18:35:48,831 --> 18:35:51,741
LOA 1: 200 Được rồi,\ncó nghĩa là tôi đang thấy, có lẽ vậy

19445
18:35:51,741 --> 18:35:55,221
nếu tôi đang sử dụng một trình duyệt thực sự,\n

19446
18:35:55,221 --> 18:35:58,911
Có vẻ như phiên bản HTTP của Harvard\n

19447
18:35:58,911 --> 18:36:01,051
Nó đang sử dụng phiên bản HTTP\n2, điều này ổn.

19448
18:36:01,051 --> 18:36:04,611
Nhưng 200 thực sự là dấu hiệu cho thấy mọi việc đều ổn.

19449
18:36:04,611 --> 18:36:07,822
Chà, điều gì sẽ xảy ra nếu tôi thử\ntruy cập một URL không có thật nào đó

19450
18:36:07,822 --> 18:36:14,331
giống như Harvard.edu, khi tệp này hoạt động\n

19451
18:36:14,331 --> 18:36:17,331
có lẽ không tồn tại và nhấn Enter.

19452
18:36:17,331 --> 18:36:20,991
Bây giờ bạn thấy gì, có lẽ\nquen thuộc, trong thế giới thực?

19453
18:36:24,620 --> 18:36:26,600
Tất cả chúng ta đều đã thấy\nđiều này có lẽ là vô tận

19454
18:36:26,600 --> 18:36:29,301
đôi khi bạn\nlàm hỏng việc bằng cách nhập sai một URL

19455
18:36:29,301 --> 18:36:31,221
hoặc ai đó xóa\ntrang web được đề cập.

19456
18:36:31,221 --> 18:36:34,221
Nhưng tất cả những gì đó chỉ là\nmã trạng thái mà trình duyệt

19457
18:36:34,221 --> 18:36:37,521
đang được gửi từ máy chủ,\nđó là một manh mối nhỏ về những gì

19458
18:36:37,521 --> 18:36:40,383
vấn đề thực sự là ở bên dưới mui xe.

19459
18:36:40,384 --> 18:36:42,092
Vì vậy, thay vì nhận\nquay lại chẳng hạn

19460
18:36:42,092 --> 18:36:45,202
đại loại như OK hoặc đã di chuyển vĩnh viễn,\n

19461
18:36:47,902 --> 18:36:51,711
Chà, hóa ra còn có\nloại mã trạng thái khác

19462
18:36:51,711 --> 18:36:55,211
mà bạn sẽ bắt đầu thấy theo thời gian,\n

19463
18:36:57,881 --> 18:37:01,421
302, 304, 307 đều có tinh thần tương tự nhau.

19464
18:37:01,422 --> 18:37:04,782
Chúng liên quan đến việc chuyển hướng\n

19465
18:37:04,782 --> 18:37:08,802
401, 403, trái phép hoặc bị cấm.

19466
18:37:08,801 --> 18:37:11,021
Nếu bạn làm sai\nmật khẩu của mình hoặc bạn

19467
18:37:11,021 --> 18:37:13,134
hãy thử truy cập một URL mà bạn\nkhông được phép xem

19468
18:37:13,134 --> 18:37:15,551
bạn có thể thấy một trong những\nmã này, cho biết rằng bạn vừa

19469
18:37:15,551 --> 18:37:17,441
không có quyền cho những điều đó.

19470
18:37:17,441 --> 18:37:21,671
404 không tìm thấy, 418, tôi là\nấm trà, chỉ là trò đùa Cá tháng Tư

19471
18:37:21,672 --> 18:37:24,072
bởi cộng đồng công nghệ nhiều năm trước.

19472
18:37:25,331 --> 18:37:27,281
Và thật không may,\nang có lẽ tất cả các bạn đều

19473
18:37:27,282 --> 18:37:30,972
hiện đang trên đường tạo ra lỗi\nHTTP 500, một lần

19474
18:37:30,971 --> 18:37:33,114
tuần tới, chúng tôi bắt đầu viết\ncode, bởi vì tất cả chúng tôi

19475
18:37:34,032 --> 18:37:37,632
Chúng ta sẽ có lỗi chính tả, logic\n

19476
18:37:37,631 --> 18:37:42,042
giống như lỗi phân biệt trong thế giới\n

19477
18:37:42,042 --> 18:37:45,254
Dịch vụ 503 không khả dụng, nghĩa là\ncó thể máy chủ bị quá tải

19478
18:37:46,211 --> 18:37:47,721
Và có những mã khác ở đó.

19479
18:37:47,721 --> 18:37:51,011
Nhưng đó có lẽ là một số\nnhững cái phổ biến nhất.

19480
18:37:51,012 --> 18:37:54,642
Có ai không, chúng ta có thể thoát khỏi\n

19481
18:37:54,642 --> 18:37:58,972
có ai đã từng truy cập\nSafetySchool.org chưa?

19482
18:38:01,542 --> 18:38:08,381
HTTP://SafetySchool.org,\ndchúng tôi có thực hiện việc này không, Enter.

19483
18:38:17,262 --> 18:38:20,051
--vậy chuyện này đã giống như một\ntrò đùa khoảng 10 hay 20 năm rồi.

19484
18:38:20,051 --> 18:38:22,811
Ai đó đã\ntrả tiền cho tên miền

19485
18:38:22,812 --> 18:38:26,202
safetyschool.org, chỉ dành cho\nphần minh họa dài hai giây này.

19486
18:38:26,202 --> 18:38:28,542
Nhưng bây giờ chúng ta có thể suy ra, điều này diễn ra như thế nào?

19487
18:38:28,542 --> 18:38:31,452
Người đã mua tên miền\nname đó và đã định cấu hình bằng cách nào đó

19488
18:38:31,452 --> 18:38:35,502
DNS để trỏ đến máy chủ web của họ,\n

19489
18:38:35,501 --> 18:38:37,871
máy chủ web của họ là gì\ncó lẽ đang nói ra

19490
18:38:37,872 --> 18:38:41,021
bất cứ khi nào trình duyệt yêu cầu trang?

19491
18:38:48,221 --> 18:38:49,911
Hãy để tôi tăng cửa sổ terminal của tôi.

19492
18:38:49,911 --> 18:38:58,271
Để tôi làm Curl-I-xget\nHTTP://safetyschool.org Enter

19493
18:38:58,271 --> 18:39:00,012
và đó là tất cả những gì trang web này làm.

19494
18:39:00,012 --> 18:39:02,322
Thậm chí không có một trang web thực tế nào ở đó.

19495
18:39:02,322 --> 18:39:04,842
Không có HTML, không có ngôn ngữ CSS\nchúng ta sắp thấy.

19496
18:39:04,842 --> 18:39:09,702
Theo nghĩa đen, nó chỉ tồn tại trên\n

19497
18:39:09,702 --> 18:39:13,362
Công bằng mà nói, còn có những người khác.

19498
18:39:13,361 --> 18:39:15,611
Hãy để tôi thực sự làm một cái khác ở đây.

19499
18:39:15,611 --> 18:39:19,511
Thay vì safetyschool.org,\nhóa ra có ai đó

19500
18:39:19,512 --> 18:39:25,572
vài năm trước, đã mua\nHarvardSucks.org Enter.

19501
18:39:25,572 --> 18:39:30,072
Và khi chúng tôi làm điều này, bạn sẽ thấy điều đó,\n

19502
18:39:36,762 --> 18:39:38,785
Bản demo này thực sự\nđã hoạt động được rất nhiều năm.

19503
18:39:38,785 --> 18:39:41,202
Nhưng ai đó đã ngừng thanh toán\ncho tài khoản Squarespace

19504
18:39:46,471 --> 18:39:52,111
Được rồi, thật may mắn là chúng ta đã lưu video trên YouTube

19505
18:39:53,672 --> 18:39:56,255
Và vì vậy, hãy đặt\nđiều này vào bối cảnh, vì nó

19506
18:39:56,255 --> 18:39:58,422
đã được vài năm rồi,\ntất nhiên là Harvard và Yale

19507
18:39:58,422 --> 18:40:00,272
có sự cạnh tranh lâu đời này.

19508
18:40:00,271 --> 18:40:02,891
Có truyền thống chơi khăm nhau.

19509
18:40:02,892 --> 18:40:06,822
Và, thành thật mà nói, một trong những\n

19510
18:40:09,062 --> 18:40:10,741
Đó là khoảng ba phút hồi tưởng.

19511
18:40:10,741 --> 18:40:13,074
Tôi dám nói đây là một trong những\nvideo sớm nhất trên YouTube

19512
18:40:13,074 --> 18:40:15,512
vì vậy chất lượng\nđại diện cho điều đó.

19513
18:40:15,512 --> 18:40:18,402
Nhưng hãy để tôi tiếp tục và\nxem toàn bộ trang của tôi ở đây.

19514
18:40:18,402 --> 18:40:22,892
Và thứ từng tồn tại ở\nHarvardSucks.org chính là video này ở đây.

19515
18:40:22,892 --> 18:40:25,738
Nếu chúng ta có thể giảm ánh sáng\ntrong khoảng ba phút.

19516
18:40:53,975 --> 18:40:55,892
- Thực ra chúng ta đang tiến tới đỉnh cao.

19517
18:41:01,142 --> 18:41:04,322
- Chúng tôi tới đây để đến Harvard.

19518
18:41:06,750 --> 18:41:08,402
- Truyền từ trên xuống.

19519
18:41:09,714 --> 18:41:12,822
- Thật vui khi nói rằng ERA tệ hại.

19520
18:41:19,732 --> 18:41:22,402
Nó sẽ phải xảy ra.

19521
18:41:22,402 --> 18:41:25,032
- Thực tế là nó sẽ xảy ra.

19522
18:41:25,032 --> 18:41:26,452
Tôi không thể [BÍP] tin được điều này.

19523
18:41:26,452 --> 18:41:28,512
- Bạn nghĩ gì về Yale?

19524
18:41:33,334 --> 18:41:34,542
- Bởi vì họ không có nó.

19525
18:41:37,013 --> 18:41:40,341
- Có lẽ chữ đó\nsẽ dễ đọc, rất nhỏ.

19526
18:41:45,801 --> 18:41:47,512
- Nói, bây giờ chúng ta đang ở trên thuyền phải không?

19527
18:41:48,262 --> 18:41:49,387
- Còn lại bao nhiêu?

19528
18:41:54,445 --> 18:41:55,903
- Các bạn đến từ Harvard phải không?

19529
18:41:58,611 --> 18:42:00,039
- Chỉ cần đảm bảo là mọi người đều có một cái.

19530
18:42:35,631 --> 18:42:38,891
- Ông nghĩ gì về Yale, thưa ông?

19531
18:42:38,892 --> 18:42:41,376
- Sắp được rồi, làm thêm một lần nữa đi.

19532
18:43:08,812 --> 18:43:13,222
GIỌNG 1: Được rồi, cảm ơn\n

19533
18:43:13,221 --> 18:43:17,129
Hãy tiếp tục ở đây và xem xét, trong\n

19534
18:43:17,130 --> 18:43:18,922
xuống bên trong\phong bì, bởi vì bây giờ chúng ta

19535
18:43:18,922 --> 18:43:24,202
có khả năng lấy dữ liệu từ,\n

19536
18:43:25,342 --> 18:43:30,082
Chúng ta hãy xem xét một lát\n

19537
18:43:30,081 --> 18:43:33,652
rằng bây giờ chúng tôi có khả năng này\n

19538
18:43:33,652 --> 18:43:37,490
Và chúng tôi có khả năng\nnêu rõ trong những phong bì đó những gì

19539
18:43:37,490 --> 18:43:38,782
đó là điều chúng tôi muốn từ trang web.

19540
18:43:38,782 --> 18:43:40,192
Chúng tôi muốn có được trang chủ.

19541
18:43:40,191 --> 18:43:41,932
Chúng tôi muốn lấy lại HTML.

19542
18:43:43,247 --> 18:43:46,372
Thực tế là chúng tôi chưa có ngôn ngữ\n

19543
18:43:46,372 --> 18:43:48,494
được viết, cụ thể là HTML và CSS.

19544
18:43:48,494 --> 18:43:50,702
Nhưng chúng ta hãy tiếp tục và nghỉ ngơi năm phút ở đây.

19545
18:43:50,702 --> 18:43:54,182
Và khi quay lại, chúng ta sẽ\nhọc hai ngôn ngữ đó.

19546
18:43:56,072 --> 18:43:58,372
Vì vậy hôm nay chúng ta có ba\nngôn ngữ để xem xét.

19547
18:43:58,372 --> 18:44:00,832
Nhưng hai trong số đó thực sự không phải là ngôn ngữ lập trình.

19548
18:44:00,831 --> 18:44:05,152
Điều gì khiến một thứ trở thành một chương trình\n

19549
18:44:05,152 --> 18:44:08,472
là có những cấu trúc này thông qua\n

19550
18:44:08,471 --> 18:44:10,971
Bạn có thể có các biến,\ncó thể có các cấu trúc lặp.

19551
18:44:10,971 --> 18:44:13,341
Cuối cùng, bạn có khả năng diễn đạt logic.

19552
18:44:13,342 --> 18:44:16,912
HTML và CSS không liên quan nhiều đến\n

19553
18:44:16,911 --> 18:44:18,441
và tính thẩm mỹ của một trang.

19554
18:44:18,441 --> 18:44:21,262
Và vì vậy chúng ta sẽ tạo\nbộ khung của một trang web bằng cách sử dụng

19555
18:44:21,262 --> 18:44:23,190
cặp ngôn ngữ này, HTML và CSS.

19556
18:44:23,190 --> 18:44:24,982
Và rồi hướng tới\ncuối ngày hôm nay, chúng ta sẽ

19557
18:44:24,982 --> 18:44:26,872
giới thiệu một ngôn ngữ lập trình\nthực tế

19558
18:44:26,872 --> 18:44:30,232
điều đó thực sự khá giống\về tinh thần và cú pháp

19559
18:44:30,232 --> 18:44:34,101
cho cả C và Python, nhưng điều đó sẽ xảy ra\n

19560
18:44:34,101 --> 18:44:38,251
chỉ tĩnh, những thứ bạn nhìn vào,\n

19561
18:44:38,251 --> 18:44:42,771
Và sau đó lại vào tuần sau, vào tuần 9,\n

19562
18:44:42,771 --> 18:44:46,251
liên kết tất cả những điều này lại với nhau để bạn\n

19563
18:44:46,251 --> 18:44:49,221
nói chuyện với máy chủ back-end\nserver và tạo

19564
18:44:49,221 --> 18:44:53,151
trải nghiệm mà bạn và tôi hiện đang có\n

19565
18:44:53,812 --> 18:44:55,187
Nào, hãy tiếp tục và làm điều này.

19566
18:44:55,187 --> 18:44:58,402
Hãy nhanh chóng tạo ra thứ gì đó\trong ngôn ngữ này có tên là HTML.

19567
18:44:59,601 --> 18:45:04,101
Tôi sẽ tiếp tục và tạo một\n

19568
18:45:04,101 --> 18:45:07,491
Quy ước thường là\nend tên tệp của bạn dưới dạng dấu chấm html.

19569
18:45:07,491 --> 18:45:09,783
Và tôi sẽ tiếp tục\nvà giải quyết vấn đề này thật nhanh.

19570
18:45:09,783 --> 18:45:12,842
Nhưng sau đó chúng ta sẽ bước chậm hơn\n

19571
18:45:12,842 --> 18:45:17,482
Vì vậy tôi sẽ nói doctype\nhtml html ngoặc mở

19572
18:45:17,482 --> 18:45:22,072
và sau đó chú ý rằng tôi sẽ mở\n

19573
18:45:22,072 --> 18:45:25,672
Và tôi đang tận dụng một tính năng của VS\n

19574
18:45:25,672 --> 18:45:27,601
nói chung, để thực hiện một chút tự động hoàn thành.

19575
18:45:27,601 --> 18:45:30,831
Vì vậy bạn sẽ thấy có sự đối xứng này\n

19576
18:45:30,831 --> 18:45:32,631
nhưng tôi không gõ tất cả những thứ này.

19577
18:45:32,631 --> 18:45:37,611
Mã VS đang tự động tạo ra\n

19578
18:45:37,611 --> 18:45:41,511
Hãy để tôi tiếp tục và\nnói: Mở thẻ đầu.

19579
18:45:42,831 --> 18:45:44,932
Tôi sẽ nói điều gì đó dễ thương\nnhư, Xin chào, tiêu đề.

19580
18:45:44,932 --> 18:45:47,661
Và sau đó xuống đây, tôi sẽ\n

19581
18:45:47,661 --> 18:45:49,461
và nói điều gì đó như Xin chào, cơ thể.

19582
18:45:49,461 --> 18:45:53,241
Và hãy để tôi chỉ định ở trên cùng,\n

19583
18:45:54,592 --> 18:46:00,562
Vì vậy, tại thời điểm này, tôi có một tập tin trong\n

19584
18:46:00,562 --> 18:46:03,484
Tất nhiên, Mã VS mà chúng tôi đang sử dụng là dựa trên đám mây.

19585
18:46:03,483 --> 18:46:05,691
Chúng tôi đang sử dụng nó trong trình duyệt,\nmặc dù bạn cũng có thể

19586
18:46:05,691 --> 18:46:07,792
tải xuống và chạy nó trên máy Mac và PC.

19587
18:46:07,792 --> 18:46:10,491
Vậy là chúng ta đang ở trong tình huống\nkỳ lạ này khi tôi đang ở

19588
18:46:10,491 --> 18:46:12,771
sử dụng đám mây để\ntạo một trang web và tôi

19589
18:46:12,771 --> 18:46:17,781
muốn trang web đó cũng tồn tại\n

19590
18:46:17,782 --> 18:46:21,082
Nhưng vấn đề về VS\nCode, hay bất kỳ trang web nào

19591
18:46:21,081 --> 18:46:24,741
mà bạn có thể sử dụng trong trình duyệt, bởi\n

19592
18:46:24,741 --> 18:46:29,361
Số cổng TCP 80 hoặc\nsố cổng TCP 443

19593
18:46:29,361 --> 18:46:32,061
tương ứng là HTTP và HTTPS.

19594
18:46:32,062 --> 18:46:34,912
Nhưng tôi ở đây, bản thân tôi cũng là một lập trình viên

19595
18:46:34,911 --> 18:46:39,241
đang cố gắng tạo\ntrang web của riêng tôi trên một trang web hiện có.

19596
18:46:39,241 --> 18:46:40,732
Vì vậy, đó là một tình huống hơi kỳ lạ.

19597
18:46:40,732 --> 18:46:43,222
Nhưng không sao cả, vì\nTCP có gì hay

19598
18:46:43,221 --> 18:46:47,572
là bạn và tôi có thể chọn cổng\n

19599
18:46:49,312 --> 18:46:51,802
Tức là chúng ta có thể kiểm soát\nmôi trường hoàn toàn

19600
18:46:51,801 --> 18:46:57,711
chỉ bằng cách chạy máy chủ web của riêng chúng tôi\n

19601
18:46:58,732 --> 18:47:01,445
Đây là lệnh mà chúng tôi\nđã cài đặt sẵn trong VS Code tại đây.

19602
18:47:01,445 --> 18:47:03,112
Và bạn sẽ nhận thấy một cửa sổ bật lên vừa xuất hiện.

19603
18:47:03,111 --> 18:47:05,841
Ứng dụng của bạn đang chạy\không có cổng 8080 hiện có sẵn.

19604
18:47:05,842 --> 18:47:09,172
Đó là số cổng\nTCP thường được sử dụng khi 80 đã được sử dụng

19605
18:47:09,172 --> 18:47:11,932
và 443 đã được sử dụng,\nbạn có thể chạy máy chủ của riêng mình

19606
18:47:11,932 --> 18:47:14,521
trên cổng của riêng bạn, 8080 trong trường hợp này.

19607
18:47:14,521 --> 18:47:18,592
Tôi đã mở tab đó trước và\n

19608
18:47:18,592 --> 18:47:22,252
ở đây tôi thấy một cái gọi là thư mục\n

19609
18:47:22,251 --> 18:47:24,322
Vì vậy, tôi không thấy bất kỳ tập tin nào khác của mình.

19610
18:47:24,322 --> 18:47:27,351
Tôi không thấy bất kỳ thứ gì\nthuộc về VS Code.

19611
18:47:27,351 --> 18:47:30,562
Tôi chỉ thấy tệp tôi đã tạo\n

19612
18:47:31,851 --> 18:47:36,232
Và vì vậy nếu tôi nhấp vào tệp này\nbây giờ, tôi sẽ thấy Xin chào, nội dung.

19613
18:47:37,312 --> 18:47:39,262
Nhưng đó là vì\ntiêu đề của trang web

19614
18:47:39,262 --> 18:47:41,699
ngày nay thường được\nebedded trong tab.

19615
18:47:41,698 --> 18:47:44,031
Và nếu tôi ở chế độ toàn màn hình trong\ntrình duyệt của mình thì sẽ không có tab nào.

19616
18:47:44,032 --> 18:47:45,652
Vậy hãy để tôi thu nhỏ cửa sổ lại một chút.

19617
18:47:45,652 --> 18:47:50,032
Và bây giờ bạn có thể thấy ngay trong này\n

19618
18:47:50,032 --> 18:47:52,382
đây, phần thân bài Xin chào, nằm ở góc trên cùng bên trái.

19619
18:47:52,381 --> 18:47:54,801
Và nếu tôi phóng to, sẽ có tiêu đề Hello.

19620
18:47:56,271 --> 18:48:01,491
Tôi đã tiếp tục và tạo\ntrang web của riêng mình bằng HTML

19621
18:48:01,491 --> 18:48:04,851
trong một tập tin có tên Hello.html.

19622
18:48:04,851 --> 18:48:09,251
Và sau đó tôi đã mở\na máy chủ web của riêng mình

19623
18:48:09,251 --> 18:48:11,591
đã định cấu hình nó để nghe\không phải cổng TCP 8080

19624
18:48:11,592 --> 18:48:14,982
nó chỉ nói với Internet, này,\n

19625
18:48:14,982 --> 18:48:18,612
không phải trên số cổng tiêu chuẩn\n80 hoặc 443, hãy nghe trên 8080.

19626
18:48:18,611 --> 18:48:22,481
Và điều này có nghĩa là tôi có thể phát triển một trang web\n

19627
18:48:22,482 --> 18:48:24,851
ở đây, điều này ngày càng phổ biến ngày nay.

19628
18:48:24,851 --> 18:48:28,691
Được rồi, bây giờ hãy xem xét\n

19629
18:48:28,691 --> 18:48:32,891
HTML thực sự được đặc trưng bởi\n

19630
18:48:33,732 --> 18:48:36,972
Hầu hết những gì tôi vừa gõ đều là thẻ,\n

19631
18:48:37,732 --> 18:48:41,872
Đây chính là mã nguồn mà tôi\n

19632
18:48:41,872 --> 18:48:43,122
Hãy xem xét đây là gì.

19633
18:48:43,122 --> 18:48:46,631
Dòng đầu tiên của\ncode ở đây, doctype html

19634
18:48:47,892 --> 18:48:51,522
Đó là cái duy nhất bắt đầu bằng\n

19635
18:48:52,782 --> 18:48:55,392
Hiện tại, sau đó không còn dấu chấm than\n.

19636
18:48:55,392 --> 18:48:58,842
Đây là phần khai báo loại tài liệu,\n

19637
18:48:58,842 --> 18:49:00,432
ngày nay nó phải ở đó.

19638
18:49:00,432 --> 18:49:02,974
Nó giống như một mẩu bánh mì nhỏ\na ở đầu tập tin

19639
18:49:02,974 --> 18:49:08,021
nói với trình duyệt rằng bạn sắp\n

19640
18:49:08,021 --> 18:49:11,000
Dòng mã đó đã thay đổi theo năm tháng.

19641
18:49:11,000 --> 18:49:13,542
Phiên bản mới nhất của nó\n hay và cô đọng như thế này

19642
18:49:13,542 --> 18:49:16,572
và đó chỉ là manh mối cho\ntrình duyệt biết phiên bản HTML nào

19643
18:49:16,572 --> 18:49:18,881
đang được sử dụng bởi bạn, lập trình viên.

19644
18:49:18,881 --> 18:49:20,781
Được rồi, sau đó thì sao?

19645
18:49:20,782 --> 18:49:23,592
Chà, sau đó, tôi\nđã đánh dấu hai điều bằng màu vàng

19646
18:49:23,592 --> 18:49:26,442
đây là những gì chúng ta sẽ\nbắt đầu gọi một thẻ mở

19647
18:49:26,441 --> 18:49:30,911
hoặc thẻ bắt đầu, HTML trong ngoặc mở\nsau đó là gì đó, đóng ngoặc

19648
18:49:30,911 --> 18:49:32,991
được gọi là thẻ bắt đầu hoặc thẻ mở.

19649
18:49:32,991 --> 18:49:35,741
Sau đó, thẻ đóng\cũng như thẻ kết thúc tương ứng sẽ ở dưới đây.

19650
18:49:37,092 --> 18:49:40,252
Bạn sử dụng cùng số thẻ, bạn\nsử dụng cùng dấu ngoặc nhọn.

19651
18:49:40,251 --> 18:49:43,121
Nhưng bạn có thêm dấu gạch chéo và\nbạn không lặp lại chính mình

19652
18:49:43,122 --> 18:49:46,032
với bất kỳ thứ gì\nđược gọi là thuộc tính

19653
18:49:46,032 --> 18:49:47,772
bởi vì, thứ ở đây là gì?

19654
18:49:47,771 --> 18:49:50,891
Lang bằng với trích dẫn không trích dẫn\n"en," nghĩa là ngôn ngữ

19655
18:49:50,892 --> 18:49:53,632
trang của tôi được viết\nin bằng tiếng Anh.

19656
18:49:53,631 --> 18:49:56,771
Con người đã chuẩn hóa\nmã hai và ba chữ cái

19657
18:49:56,771 --> 18:49:59,451
cho mọi ngôn ngữ của con người, ngay bây giờ.

19658
18:49:59,452 --> 18:50:03,131
Và đây chỉ là manh mối cho\n

19659
18:50:03,131 --> 18:50:06,402
và mục đích truy cập,\ntrang web sử dụng ngôn ngữ nào

19660
18:50:07,331 --> 18:50:10,661
Không phải thẻ mà là các từ, như\nXin chào, tiêu đề và Xin chào, nội dung

19661
18:50:10,661 --> 18:50:13,182
mặc dù tối giản nhưng thực sự là bằng tiếng Anh.

19662
18:50:13,182 --> 18:50:16,142
Vì vậy khi bạn đóng một thẻ, bạn đóng\ntên của nó bằng dấu gạch chéo

19663
18:50:17,111 --> 18:50:19,319
Bạn không lặp lại thuộc tính.

19664
18:50:19,320 --> 18:50:21,862
Điều đó sẽ gây khó chịu khi\nphải gõ lại mọi thứ.

19665
18:50:21,861 --> 18:50:23,028
Nhưng hãy chú ý mô hình ở đây.

19666
18:50:24,262 --> 18:50:27,551
Nhưng đây là một ví dụ khác về\ncặp giá trị khóa trong điện toán.

19667
18:50:27,551 --> 18:50:31,631
Khóa là Lang, giá trị\n là E-N cho tiếng Anh.

19668
18:50:31,631 --> 18:50:34,182
Thuộc tính được gọi là\nLang, giá trị là

19669
18:50:34,182 --> 18:50:38,142
gọi là E-N. Một lần nữa,\nit chỉ là các cặp giá trị khóa

19670
18:50:38,142 --> 18:50:39,552
chỉ trong một bối cảnh khác.

19671
18:50:39,551 --> 18:50:41,682
Có lẽ trình duyệt đang sử dụng bảng\nhash bên dưới mui xe

19672
18:50:41,682 --> 18:50:44,807
để theo dõi nội dung này, chẳng hạn như\n

19673
18:50:44,807 --> 18:50:48,292
Một lần nữa, con người vẫn tiếp tục sử dụng những thứ tương tự\n

19674
18:50:49,732 --> 18:50:52,241
Việc lồng nhau quan trọng\nvề mặt trực quan, không phải đối với máy tính

19675
18:50:52,241 --> 18:50:54,491
nhưng với chúng ta, con người,\nvì nó ngụ ý

19676
18:50:54,491 --> 18:50:55,971
rằng có một số thứ bậc ở đây.

19677
18:50:55,971 --> 18:50:59,781
Và thực sự, bên trong\nthẻ HTML ở đây có gì?

19678
18:50:59,782 --> 18:51:02,892
Chà, chúng ta có thứ\ngọi là thẻ head.

19679
18:51:02,892 --> 18:51:06,252
Thẻ đầu cho biết, này, trình duyệt,\n

19680
18:51:06,251 --> 18:51:08,519
Và sau đó thẻ nội dung\nnói, này, trình duyệt

19681
18:51:08,519 --> 18:51:09,851
đây là phần thân của trang.

19682
18:51:09,851 --> 18:51:13,902
Cơ thể giống 99% cơ thể người dùng\n

19683
18:51:13,902 --> 18:51:17,532
Phần đầu thực sự chỉ là địa chỉ\n

19684
18:51:17,532 --> 18:51:20,292
giống như tiêu đề mà chúng ta đã thấy cách đây không lâu.

19685
18:51:20,292 --> 18:51:24,732
Chỉ để giới thiệu tiếng bản địa,\n

19686
18:51:24,732 --> 18:51:29,202
là một phần tử, có hai phần tử con,\n

19687
18:51:29,202 --> 18:51:31,961
có nghĩa là đầu\nvà thân bây giờ là anh em ruột.

19688
18:51:31,961 --> 18:51:35,111
Vì vậy bạn có thể sử dụng cùng loại\n

19689
18:51:35,111 --> 18:51:37,421
khi nói về cây cối, vài tuần trước.

19690
18:51:37,422 --> 18:51:41,802
Nếu chúng ta nhìn vào thẻ head,\n

19691
18:51:41,801 --> 18:51:44,591
Tôi đang nhìn thấy một cái, và\thực sự, ít nhất nếu chúng ta

19692
18:51:44,592 --> 18:51:48,851
bỏ qua tất cả khoảng trắng,\n

19693
18:51:48,851 --> 18:51:51,072
chỉ có một phần tử con, phần tử tiêu đề.

19694
18:51:51,072 --> 18:51:55,032
Và một phần tử là thuật ngữ\n

19695
18:51:56,422 --> 18:51:58,242
Vì vậy, đây là yếu tố tiêu đề.

19696
18:51:58,241 --> 18:52:01,812
Và phần tử tiêu đề có một\ncon, chỉ là văn bản thuần túy

19697
18:52:01,812 --> 18:52:03,792
còn được gọi là nút văn bản.

19698
18:52:03,792 --> 18:52:06,911
Hãy nhớ lại, nút, từ các cuộc thảo luận\nvề cấu trúc dữ liệu của chúng ta vài tuần trước.

19699
18:52:06,911 --> 18:52:10,961
Nếu chúng ta nhảy vào cơ thể,\n

19700
18:52:10,961 --> 18:52:14,922
nó cũng có một đứa con, chỉ là\n

19701
18:52:14,922 --> 18:52:17,292
có nội dung, trích dẫn bỏ trích dẫn "Xin chào, body.

19702
18:52:17,292 --> 18:52:21,042
Vết lõm này có gì hay,\n

19703
18:52:21,042 --> 18:52:25,312
sẽ không quan tâm, có phải nó\nngụ ý loại cấu trúc này không.

19704
18:52:25,312 --> 18:52:28,902
Và đây là nơi chúng ta kết nối,\nnhư tuần 5 và bây giờ là tuần 8, tại đây

19705
18:52:28,902 --> 18:52:33,282
là cấu trúc cây mà chúng tôi đã bắt đầu\n

19706
18:52:33,282 --> 18:52:35,585
Nó không phải là cây nhị phân,\mặc dù điều này xảy ra

19707
18:52:35,585 --> 18:52:37,002
không được có nhiều hơn hai con.

19708
18:52:37,001 --> 18:52:40,961
Đó là một cây tùy ý có thể\n

19709
18:52:40,961 --> 18:52:43,842
Nhưng nếu chúng ta có một nút đặc biệt\nhere đề cập đến tài liệu

19710
18:52:43,842 --> 18:52:47,082
nút gốc, có thể nói, là\nHTML, được vẽ bằng một hình chữ nhật

19711
18:52:47,081 --> 18:52:48,671
đây, chỉ để thảo luận thôi.

19712
18:52:48,672 --> 18:52:51,522
Nó có hai con, đầu\nvà thân, cũng là hình chữ nhật.

19713
18:52:51,521 --> 18:52:54,851
Đầu có tiêu đề con\nvà sau đó là nó và thân

19714
18:52:54,851 --> 18:52:57,861
có các nút văn bản mà thay vào đó tôi đã\nvẽ bằng hình bầu dục.

19715
18:52:57,861 --> 18:53:01,301
Điều đó chỉ để nói rằng khi\n của bạn

19716
18:53:01,301 --> 18:53:03,762
tải xuống một trang web,\mở phong bì đó

19717
18:53:03,762 --> 18:53:06,771
và xem nội dung\nđã quay trở lại từ máy chủ

19718
18:53:06,771 --> 18:53:10,221
về cơ bản nó đọc\ncode mà ai đó đã viết

19719
18:53:10,221 --> 18:53:12,631
mã HTML, từ trên xuống\ndưới, từ trái sang phải

19720
18:53:12,631 --> 18:53:16,402
và tạo trong bộ nhớ\ncủa trình duyệt, trong máy Mac hoặc PC của bạn

19721
18:53:16,402 --> 18:53:20,241
hoặc bộ nhớ hoặc RAM của điện thoại,\nloại cấu trúc dữ liệu này.

19722
18:53:20,241 --> 18:53:22,131
Đó là những gì đang diễn ra\nbên dưới mui xe.

19723
18:53:22,131 --> 18:53:24,592
Và đó là lý do tại sao về mặt thẩm mỹ,\nit thật tuyệt vời, như một con người

19724
18:53:24,592 --> 18:53:27,802
để thụt lề mọi thứ theo phong cách,\nvì khi đó nó rất rõ ràng

19725
18:53:27,801 --> 18:53:32,701
cho bạn và cho các lập trình viên khác,\n

19726
18:53:32,702 --> 18:53:36,112
Vậy là xong\ncác nguyên tắc cơ bản của HTML.

19727
18:53:36,111 --> 18:53:38,451
Bây giờ chúng ta sẽ thấy một loạt các thẻ\nvà một loạt các ví dụ.

19728
18:53:38,452 --> 18:53:40,682
Nhưng HTML chỉ là thẻ và thuộc tính.

19729
18:53:40,682 --> 18:53:43,432
Và đó là điều mà\n

19730
18:53:43,432 --> 18:53:45,142
Cuối cùng, nhiều trong số chúng đã ăn sâu vào tâm trí.

19731
18:53:45,142 --> 18:53:47,939
Tôi liên tục kiểm tra tài liệu tham khảo\nguides hoặc tràn ngăn xếp

19732
18:53:47,938 --> 18:53:50,271
nếu tôi đang cố gắng tìm hiểu,\nlàm cách nào tôi có thể trình bày điều gì đó.

19733
18:53:50,271 --> 18:53:52,063
Nó thực sự chỉ là\nnhững khối xây dựng này

19734
18:53:52,063 --> 18:53:55,131
cho phép bạn tập hợp\ncấu trúc của một trang web.

19735
18:53:55,131 --> 18:53:58,551
Cái này cực kỳ đơn giản,\n

19736
18:53:58,551 --> 18:54:01,101
Mọi thắc mắc về\nframework này, trước khi chúng tôi

19737
18:54:01,101 --> 18:54:05,489
bắt đầu thêm nhiều thẻ hơn, nhiều\ntừ vựng hơn, nếu bạn muốn?

19738
18:54:06,322 --> 18:54:09,301
KHÁN GIẢ: Điều gì sẽ xảy ra\nnếu chúng ta đặt thẻ tiêu đề?

19739
18:54:09,301 --> 18:54:13,091
GIỌNG 1: Nếu chúng ta đặt thẻ xin chào\n

19740
18:54:13,751 --> 18:54:20,251
Vì vậy, hãy để tôi thực sự đi sâu vào vấn đề này,\nvà nói tiêu đề trong ngoặc mở

19741
18:54:20,251 --> 18:54:23,461
rất tiếc, đôi khi bạn không muốn\n

19742
18:54:24,601 --> 18:54:27,031
Tôi đã tiếp tục và thay đổi tập tin.

19743
18:54:27,032 --> 18:54:30,362
Để tôi đi mở cửa cho tôi một\n

19744
18:54:30,361 --> 18:54:34,411
và quay lại URL có trang của tôi.

19745
18:54:41,161 --> 18:54:45,891
Và hãy để tôi tiếp tục\nvà nhấp vào Hello.html.

19746
18:54:45,892 --> 18:54:49,352
Và trong trường hợp này, có vẻ như\nchúng tôi thực sự không thấy gì cả.

19747
18:54:49,351 --> 18:54:50,631
Vì vậy, trình duyệt đang ẩn nó.

19748
18:54:50,631 --> 18:54:54,051
Về mặt kỹ thuật, các trình duyệt có xu hướng khá hào phóng.

19749
18:54:54,051 --> 18:54:56,331
Và một nửa thời gian, khi\nbạn mắc lỗi trong HTML

19750
18:54:56,331 --> 18:54:58,101
nó sẽ hiển thị, nó có thể hiển thị--

19751
18:54:58,101 --> 18:54:59,437
không hiển thị như bạn dự định.

19752
18:54:59,437 --> 18:55:03,022
Nó có thể không hiển thị giống nhau trên\n

19753
18:55:03,021 --> 18:55:05,211
Tuy nhiên, có một công cụ\nmà chúng ta sẽ thấy, đó là

19754
18:55:05,211 --> 18:55:07,042
có thể giúp giải đáp thắc mắc này cho bạn.

19755
18:55:07,042 --> 18:55:11,032
Ví dụ: nếu tôi truy cập\n vào Validator.w3.org

19756
18:55:11,032 --> 18:55:13,072
W3 là World Wide\nWeb Consortium, một nhóm

19757
18:55:13,072 --> 18:55:15,232
những người tiêu chuẩn hóa\nloại nội dung này

19758
18:55:15,232 --> 18:55:17,631
Tôi có thể nhấp vào Xác thực\nbằng cách nhập trực tiếp và chỉ

19759
18:55:17,631 --> 18:55:21,411
sao chép, dán HTML mẫu của tôi vào\nhộp này và nhấp vào Kiểm tra.

19760
18:55:21,411 --> 18:55:24,051
Và tôi nên thấy,\hy vọng rằng, thực sự, đó là

19761
18:55:24,051 --> 18:55:25,671
một lỗi, những gì bạn đề nghị tôi làm.

19762
18:55:25,672 --> 18:55:27,744
Trình duyệt vừa cố gắng hết sức để làm điều gì đó

19763
18:55:27,744 --> 18:55:30,952
ít nhất là chẳng cho tôi thấy điều gì cả,\n

19764
18:55:30,952 --> 18:55:34,491
Nhưng nếu tôi hủy bỏ thay đổi đó và\ncho phép tôi hoàn tác những gì chúng ta vừa làm

19765
18:55:34,491 --> 18:55:39,411
để tôi sao chép lại mã ban đầu\n

19766
18:55:39,411 --> 18:55:41,831
bây giờ bạn có thể thấy, ngược lại,\nmã của tôi bây giờ đã chính xác.

19767
18:55:41,831 --> 18:55:43,581
Và có các công cụ\ntự động để kiểm tra điều đó.

19768
18:55:43,581 --> 18:55:45,873
Nhưng chúng tôi sẽ khuyến khích bạn vì\ncác bộ vấn đề và dự án

19769
18:55:45,873 --> 18:55:48,831
để sử dụng công cụ thủ công cụ thể đó.

19770
18:55:48,831 --> 18:55:51,621
Được rồi, hãy tiếp tục\nvà cải thiện điều này một chút

19771
18:55:51,622 --> 18:55:53,572
bằng cách giới thiệu toàn bộ\nmột loạt thẻ, chỉ

19772
18:55:53,572 --> 18:55:55,952
để cho bạn biết về một số\ncác khối xây dựng ở đây.

19773
18:55:55,952 --> 18:56:01,292
Vì vậy tôi sẽ tiếp tục và tạo\n

19774
18:56:01,292 --> 18:56:04,292
Và tôi sẽ làm một loạt\n

19775
18:56:04,292 --> 18:56:07,432
nên tôi không thường xuyên gõ tất cả\n

19776
18:56:07,432 --> 18:56:09,411
bởi vì tôi muốn mọi thứ\nở đây giống như cũ

19777
18:56:09,411 --> 18:56:12,441
ngoại trừ việc tôi sắp thay đổi tiêu đề của mình\n

19778
18:56:12,441 --> 18:56:16,028
Và bên trong cơ thể, tôi cần một\n

19779
18:56:16,028 --> 18:56:18,111
Và tôi thực sự không muốn\n nghĩ ra vài dòng chữ.

19780
18:56:18,111 --> 18:56:21,682
Vậy hãy để tôi truy cập một trang web ngẫu nhiên nào đó\n

19781
18:56:21,682 --> 18:56:25,051
mà nếu bạn tham gia vào việc thích\n

19782
18:56:25,051 --> 18:56:28,581
đây là văn bản giữ chỗ, kiểu như vậy\n

19783
18:56:28,581 --> 18:56:32,121
Tuy nhiên, ở đây tôi có một cách hữu ích\n

19784
18:56:32,122 --> 18:56:33,801
bằng thứ gì đó trông giống tiếng Latin.

19785
18:56:33,801 --> 18:56:36,012
Và tôi đã đặt những thứ đó\nđể ý, bên trong nội dung.

19786
18:56:37,012 --> 18:56:40,112
Hãy xem những\ntừ tạo nên ở đây dài bao nhiêu.

19787
18:56:40,111 --> 18:56:46,251
Vì vậy bây giờ hãy để tôi đi vào\ntab trình duyệt của tôi ở đây.

19788
18:56:46,251 --> 18:56:50,301
Hãy để tôi tải lại trang này và bạn sẽ\n

19789
18:56:50,301 --> 18:56:53,001
Paragraphs.html, đây là\n cái mới của tôi và Hello.html.

19790
18:56:53,001 --> 18:56:58,351
Hãy để tôi nhấp vào Đoạn văn.html,\n

19791
18:57:00,172 --> 18:57:03,172
GIỌNG 1: Vâng, rõ ràng là một\n

19792
18:57:03,172 --> 18:57:07,762
Điều đó thật thú vị, nhưng nó chỉ là\n

19793
18:57:07,762 --> 18:57:09,142
Nó sẽ chỉ làm những gì bạn nói.

19794
18:57:09,142 --> 18:57:12,412
Và mỗi thẻ này cho biết\n

19795
18:57:12,411 --> 18:57:15,801
và sau đó có thể ngừng làm điều gì đó,\n

19796
18:57:15,801 --> 18:57:17,676
Này, trình duyệt, đây\nđầu trang của tôi đây.

19797
18:57:17,676 --> 18:57:20,211
Này, trình duyệt, đây là\ntiêu đề trang của tôi, Xin chào, tiêu đề.

19798
18:57:20,211 --> 18:57:22,042
Này, trình duyệt, tiêu đề như vậy đấy.

19799
18:57:22,042 --> 18:57:24,661
Thế là xong phần đầu,\nđây là thẻ body.

19800
18:57:24,661 --> 18:57:27,411
Vì vậy, gần như có\ncuộc trò chuyện này giữa trình duyệt

19801
18:57:27,411 --> 18:57:30,471
giữa HTML và trình duyệt,\nthực hiện đúng những gì nó nói.

19802
18:57:30,471 --> 18:57:32,721
Vì vậy, nếu bạn muốn có một\nđoạn văn, có thể bạn

19803
18:57:32,721 --> 18:57:35,481
sẽ muốn sử dụng\nthẻ P cho đoạn văn.

19804
18:57:35,482 --> 18:57:38,642
Và tôi sẽ tiếp tục\nvà thêm mã này vào mã của mình.

19805
18:57:38,642 --> 18:57:41,392
Tôi sẽ giữ mọi thứ gọn gàng,\n

19806
18:57:43,072 --> 18:57:47,032
Hãy để tôi tạo một đoạn văn\ntag khác ở đây và đóng nó lại

19807
18:57:47,032 --> 18:57:49,522
ngay sau cái đó,\nindent lại và tôi

19808
18:57:49,521 --> 18:57:51,232
giữ mọi thứ tốt đẹp và có trật tự.

19809
18:57:53,402 --> 18:57:58,892
Hãy để tôi thụt lề rồi để tôi\n

19810
18:57:58,892 --> 18:58:02,672
Một lần nữa, hơi tẻ nhạt một chút, nhưng bây giờ tôi\n

19811
18:58:02,672 --> 18:58:04,101
này, trình duyệt, bắt đầu một đoạn văn.

19812
18:58:04,101 --> 18:58:05,721
Này, trình duyệt, dừng đoạn đó lại đi.

19813
18:58:07,682 --> 18:58:09,961
Hãy để tôi quay lại\ncửa sổ trình duyệt ở đây.

19814
18:58:09,961 --> 18:58:13,491
Để tôi nhấn Command R hoặc\nControl R để tải lại trang.

19815
18:58:13,491 --> 18:58:16,732
Và thì đấy, bây giờ tôi có ba\nđoạn văn rõ ràng hơn, được chứ?

19816
18:58:16,732 --> 18:58:18,562
Vì vậy có thẻ P cho các đoạn văn.

19817
18:58:18,562 --> 18:58:20,572
Vì vậy bây giờ chúng ta có\nkhối xây dựng cụ thể đó.

19818
18:58:20,572 --> 18:58:23,839
Chẳng hạn, nếu tôi muốn thêm\nmột số tiêu đề vào trang này thì sao?

19819
18:58:23,839 --> 18:58:25,672
Chà, đó cũng là điều\ncó thể xảy ra.

19820
18:58:25,672 --> 18:58:29,152
Hãy để tôi tiếp tục và tạo một\ntệp mới có tên Headings.html.

19821
18:58:29,152 --> 18:58:31,911
Hãy để tôi sao chép và dán\nmã tương tự như trước.

19822
18:58:31,911 --> 18:58:36,021
Nhưng bây giờ, hãy mở đầu mỗi\nđoạn bằng H1.

19823
18:58:36,021 --> 18:58:38,482
Và tôi sẽ chỉ\nviết từ một.

19824
18:58:38,482 --> 18:58:41,452
Và ở đây tôi sẽ nói H2, hai.

19825
18:58:41,452 --> 18:58:44,572
Và ở dưới đây tôi có thể nói H3, ba.

19826
18:58:44,572 --> 18:58:49,184
Vì vậy, đây là một thẻ khác,\nanba thẻ khác, H1, H2, H3.

19827
18:58:49,184 --> 18:58:51,351
Như bạn có thể đã suy ra\ntheo tên tập tin tôi đã chọn

19828
18:58:51,351 --> 18:58:55,342
điều này chỉ cung cấp cho bạn các tiêu đề, như trong\n

19829
18:58:55,342 --> 18:58:57,412
hoặc các phần phụ, hoặc trong\nan bài viết học thuật, bạn

19830
18:58:57,411 --> 18:59:00,182
có hệ thống phân cấp khác nhau cho\nvăn bản bạn đang viết.

19831
18:59:00,182 --> 18:59:04,461
Bây giờ tôi đã thêm thẻ H1,\n

19832
18:59:04,461 --> 18:59:07,491
hai, thẻ H3 và từ ba,\nhãy quay lại trình duyệt

19833
18:59:07,491 --> 18:59:12,232
tải lại trang lần nữa,\nvà thì đấy, sau khi trang đó

19834
18:59:12,232 --> 18:59:17,152
tải lại, tôi sẽ thực hiện bằng nút\nthủ công, tải lại trang.

19835
18:59:20,331 --> 18:59:21,623
ĐỐI TƯỢNG: Không có trong tệp tiêu đề.

19836
18:59:21,623 --> 18:59:23,581
GIỌNG 1: Đúng rồi, tôi\nkhông có trong tệp tiêu đề.

19837
18:59:27,601 --> 18:59:29,301
Được rồi, bây giờ chúng ta thấy một số bằng chứng về điều này.

19838
18:59:29,301 --> 18:59:30,921
Một lần nữa, đó là nội dung vô nghĩa.

19839
18:59:30,922 --> 18:59:33,982
Nhưng bạn có thể thấy rằng\nH1 có vẻ to và đậm nét

19840
18:59:33,982 --> 18:59:36,922
H2 hơi nhỏ hơn một chút nhưng vẫn đậm nét.

19841
18:59:36,922 --> 18:59:38,752
H3 cũng tương tự nhưng nhỏ hơn một chút.

19842
18:59:38,751 --> 18:59:40,366
Và nó đi xuống tận H6.

19843
18:59:40,366 --> 18:59:42,741
Sau đó, có lẽ bạn nên\nsắp xếp lại suy nghĩ của mình.

19844
18:59:42,741 --> 18:59:44,631
Nhưng có sáu thứ bậc khác nhau ở đây

19845
18:59:44,631 --> 18:59:48,831
như bạn có thể sử dụng cho các chương, phần,\n

19846
18:59:48,831 --> 18:59:53,061
Vì vậy, đó là những tiêu đề, dưới dạng thẻ\nHTML, trong từ vựng của chúng ta.

19847
18:59:53,062 --> 18:59:59,902
Chuyện thường tình cũng vậy, à, hãy\n

19848
18:59:59,902 --> 19:00:04,851
và lấy một số bản soạn sẵn ở đây,\ntạo một tệp có tên List.html.

19849
19:00:04,851 --> 19:00:07,641
Hãy tạo một\ndanh sách đơn giản bên trong cơ thể tôi

19850
19:00:07,642 --> 19:00:10,522
và tôi sẽ đặt tên cho nó là Danh sách.

19851
19:00:10,521 --> 19:00:13,531
Và hãy để tôi sửa tiêu đề\none này thành Tiêu đề.

19852
19:00:13,532 --> 19:00:19,172
Vì vậy, trong List.html, giả sử tôi muốn có\n

19853
19:00:19,172 --> 19:00:21,172
chúng giống như lời nói của một nhà khoa học\máy tính

19854
19:00:21,172 --> 19:00:23,302
giống như một nhà toán học có thể nói xyz.

19855
19:00:23,301 --> 19:00:26,122
Foo, bar, Baths nằm trong List.html.

19856
19:00:26,122 --> 19:00:29,991
Hãy để tôi quay lại\ntrình duyệt của mình, nhấn nút Quay lại.

19857
19:00:29,991 --> 19:00:33,921
Có List.html và hy vọng là\n

19858
19:00:33,922 --> 19:00:37,892
trên mỗi dòng giống như một\ndanh sách nhỏ xinh xắn, nhưng tất nhiên là tôi không làm vậy.

19859
19:00:38,961 --> 19:00:41,001
Chrome nghĩ đó có thể là tiếng Ả Rập.

19860
19:00:41,001 --> 19:00:44,748
Nhưng điều đó cũng thật tò mò,\nvì thuộc tính Lang

19861
19:00:45,831 --> 19:00:48,023
Vì vậy, Google đang cố gắng ghi đè lên nó.

19862
19:00:48,024 --> 19:00:49,732
Được rồi, lời giải thích rõ ràng là gì

19863
19:00:49,732 --> 19:00:52,762
tại sao chúng ta thấy foo, bar và\nbaths trên cùng một dòng mà không phải

19864
19:00:53,932 --> 19:00:55,342
KHÁN GIẢ: Chúng tôi không nói điều đó.

19865
19:00:55,342 --> 19:00:57,009
GIỌNG 1: Chúng tôi không bảo nó làm điều đó.

19866
19:00:57,009 --> 19:00:59,272
Vì vậy, chúng ta cần thẻ đoạn văn\và có thể là thứ gì khác.

19867
19:00:59,271 --> 19:01:00,921
Hóa ra là có cái gì đó khác.

19868
19:01:00,922 --> 19:01:04,972
Có một thẻ UL dành cho danh sách\không có thứ tự trong HTML

19869
19:01:04,971 --> 19:01:08,596
bên trong đó bạn có thể\ncó thẻ LI cho mục danh sách

19870
19:01:08,596 --> 19:01:10,221
bên trong đó bạn có thể đặt từ ngữ của bạn.

19871
19:01:10,221 --> 19:01:13,861
Đây là đồ ăn của tôi, có\nquầy bar của tôi, có phòng tắm của tôi.

19872
19:01:13,861 --> 19:01:16,671
Và một lần nữa, hãy lưu ý rằng VS Code\nis đã hoàn thiện suy nghĩ của tôi cho tôi.

19873
19:01:16,672 --> 19:01:21,412
Nhưng hãy chú ý đến hệ thống phân cấp, mở\nUL, mở LI, đóng LI, mở LI

19874
19:01:21,411 --> 19:01:24,771
đóng LI, mở LI, đóng LI, đóng UL.

19875
19:01:24,771 --> 19:01:27,141
Vậy là ở đây mọi việc đã hoàn tất\nin theo thứ tự ngược lại.

19876
19:01:27,142 --> 19:01:33,172
Hãy để tôi quay lại trình duyệt của mình, tải lại\n

19877
19:01:33,172 --> 19:01:36,382
một danh sách có dấu đầu dòng mặc định,\ndường như vẫn bằng tiếng Ả Rập.

19878
19:01:36,381 --> 19:01:38,152
Nếu tôi muốn đánh số danh sách này thì sao?

19879
19:01:38,152 --> 19:01:39,801
Vâng, có lẽ bạn có thể đoán được.

19880
19:01:39,801 --> 19:01:43,372
Nếu bạn không muốn có một danh sách không có thứ tự, nhưng\n

19881
19:01:44,661 --> 19:01:46,641
GIỌNG 1: CV, chắc chắn rồi, vậy hãy thử điều đó.

19882
19:01:46,642 --> 19:01:49,312
Không phải lúc nào cũng dễ dàng như\đoán, nhưng trong trường hợp này

19883
19:01:49,312 --> 19:01:51,062
OL sẽ thực hiện thủ thuật này.

19884
19:01:51,062 --> 19:01:52,582
Hãy để tôi quay lại trình duyệt khác của tôi.

19885
19:01:52,581 --> 19:01:55,664
Hãy để tôi tải lại trang và bây giờ là\n

19886
19:01:55,664 --> 19:01:58,111
Đó là điều nhỏ nhặt nhưng\nđiều này thực sự hữu ích

19887
19:01:58,111 --> 19:02:00,451
nếu bạn có một danh sách\ndữ liệu rất dài và có thể bạn

19888
19:02:00,452 --> 19:02:02,612
có thể thêm một số thứ vào\nở giữa, ở đầu hoặc cuối.

19889
19:02:02,611 --> 19:02:04,944
Sẽ thật khó chịu nếu\nphải đi đánh số lại nó.

19890
19:02:04,945 --> 19:02:07,772
Thay vào đó, máy tính đang thực hiện việc đó\ncho chúng ta bằng cách chỉ

19891
19:02:07,771 --> 19:02:10,152
đánh số từ trên xuống dưới đây

19892
19:02:10,152 --> 19:02:12,211
Được rồi, còn\nanloại bố cục khác thì sao

19893
19:02:12,211 --> 19:02:14,959
không chỉ các đoạn văn, không chỉ\n

19894
19:02:14,959 --> 19:02:17,042
Bạn có một số nghiên cứu\ndữ liệu bạn muốn trình bày

19895
19:02:17,042 --> 19:02:20,334
một số dữ liệu tài chính bạn muốn trình bày,\n

19896
19:02:20,334 --> 19:02:23,222
Chúng ta có thể tiến hành sắp xếp dữ liệu như thế nào, giống như một bảng?

19897
19:02:23,221 --> 19:02:26,221
Vâng, hãy để tôi tạo một\ntệp có tên Table.html

19898
19:02:26,221 --> 19:02:28,921
và tôi sẽ chỉ sao chép dán\nnơi chúng ta đã bắt đầu trước đó.

19899
19:02:28,922 --> 19:02:31,292
Hãy để tôi bắt đầu đóng\nmột số tệp khác.

19900
19:02:31,292 --> 19:02:34,688
Và trong Table.html, đây\nsẽ có nhiều HTML hơn một chút

19901
19:02:34,688 --> 19:02:36,271
nhưng tôi sẽ tiếp tục và làm điều này.

19902
19:02:36,271 --> 19:02:40,592
Bảng và đóng bảng, bảng\ncó thể có tiêu đề bảng.

19903
19:02:40,592 --> 19:02:45,881
Vậy T head là tên của thẻ đó, và\n

19904
19:02:45,881 --> 19:02:47,161
Vì vậy, tôi sẽ thêm thẻ đó.

19905
19:02:47,161 --> 19:02:49,619
Và đây là một kỹ thuật phổ biến,\nhãy bắt đầu suy nghĩ của bạn

19906
19:02:49,619 --> 19:02:52,721
suy nghĩ xong rồi đi\n

19907
19:02:52,721 --> 19:02:54,301
Tôi muốn đặt gì vào bảng này?

19908
19:02:54,301 --> 19:02:58,391
Làm thế nào về một loạt các tên và số.

19909
19:02:58,392 --> 19:03:02,352
Vì vậy, ví dụ như tên cột bên trái, số cột bên phải.

19910
19:03:02,351 --> 19:03:05,641
Vì vậy, hãy tạo một hàng trong bảng,\nvới cái được gọi là thẻ TR.

19911
19:03:05,642 --> 19:03:10,382
Hãy tạo một tiêu đề bảng với\n

19912
19:03:10,381 --> 19:03:14,262
Hãy tạo một bảng khác\ntiêu đề được gọi là số ở đây.

19913
19:03:14,262 --> 19:03:17,612
Và tất cả những thứ đó,\nnói rõ, đều nằm trong một hàng của bảng.

19914
19:03:17,611 --> 19:03:21,331
Trong khi đó, trong nội dung bảng,\nhãy để tôi tạo một hàng khác trong bảng

19915
19:03:21,331 --> 19:03:23,101
nhưng lần này, nó không phải là một tiêu đề.

19916
19:03:23,101 --> 19:03:24,581
Bây giờ tôi đang ở trong lòng bàn của mình.

19917
19:03:24,581 --> 19:03:28,171
Hãy làm dữ liệu bảng, đồng nghĩa\n

19918
19:03:28,172 --> 19:03:30,872
giống như bảng tính Excel\cũng như bảng tính Google.

19919
19:03:30,872 --> 19:03:33,722
Trong TD này, tôi sẽ\nnói giống như tên của Carter

19920
19:03:33,721 --> 19:03:39,481
rồi hãy lấy số của Carter\n

19921
19:03:39,482 --> 19:03:43,211
Sau đó hãy đưa tôi vào danh sách kết hợp và\n

19922
19:03:44,342 --> 19:03:47,461
Nhưng chúng ta sẽ thấy rằng có rất nhiều cấu trúc được chia sẻ với HTML.

19923
19:03:47,461 --> 19:03:53,771
Hãy để tôi tiếp tục và làm việc của mình,\n

19924
19:03:53,771 --> 19:03:56,191
Vì vậy, chúng ta sẽ có\na nhiều vết lõm.

19925
19:03:56,191 --> 19:03:59,711
Theo mặc định, tôi đang sử dụng bốn dấu cách.\n

19926
19:03:59,711 --> 19:04:02,191
Miễn là bạn nhất quán,\nđó được coi là phong cách tốt.

19927
19:04:02,191 --> 19:04:04,981
Nhưng hãy để tôi quay lại\ntrình duyệt của tôi ở đây và quay lại.

19928
19:04:04,982 --> 19:04:07,232
Sau đó, điều đó sẽ đưa tôi trở lại danh sách thư mục\ncủa tôi.

19929
19:04:07,232 --> 19:04:10,562
Đây là Table.html, và điều này\nis chưa thú vị lắm.

19930
19:04:10,562 --> 19:04:13,532
Nhưng bạn có thể thấy rằng có\nhai cột, tên và số.

19931
19:04:13,532 --> 19:04:18,302
Bởi vì đó là tiêu đề bảng, TH,\n

19932
19:04:18,301 --> 19:04:22,111
Trong đó, trong bảng, có hai\n

19933
19:04:22,111 --> 19:04:25,261
Có một chút, ồ, tôi quên mất\nsố một, xin lỗi về điều đó.

19934
19:04:25,262 --> 19:04:28,197
Một và một, đó không phải là\ncái bàn đẹp nhất phải không?

19935
19:04:28,197 --> 19:04:30,072
Tôi cảm thấy như\nmuốn tách rời mọi thứ

19936
19:04:30,072 --> 19:04:32,154
thêm một chút nữa, có thể đặt\nmột số đường viền hoặc những thứ tương tự.

19937
19:04:32,154 --> 19:04:36,281
Nhưng chỉ với HTML thôi, tôi thực sự\nchỉ tập trung vào cấu trúc.

19938
19:04:36,282 --> 19:04:37,902
Vì vậy, chúng tôi sẽ sớm làm cho nó đẹp hơn.

19939
19:04:37,902 --> 19:04:41,331
Tuy nhiên, hiện tại, đây là cách bạn\ncó thể sắp xếp dữ liệu dạng bảng.

19940
19:04:41,331 --> 19:04:44,081
Được rồi, hãy để tôi tạm dừng ở đây\n

19941
19:04:44,081 --> 19:04:46,411
Nhưng, một lần nữa, mục tiêu bây giờ\nis chỉ là ném vào bạn

19942
19:04:46,411 --> 19:04:49,801
một số khối xây dựng cơ bản, một lần nữa,\n

19943
19:04:49,801 --> 19:04:53,671
Tuy nhiên, chúng tôi cũng sẽ sớm bắt đầu\ncách điệu hóa những thứ này.

19944
19:04:55,691 --> 19:04:57,387
GIỌNG 1: Bạn thụt lề đoạn văn như thế nào?

19945
19:04:58,262 --> 19:04:59,822
Vì thế, chúng ta có thể\nsẽ muốn thứ gì đó

19946
19:04:59,822 --> 19:05:01,308
được gọi là CSS, Cascading Style Sheets.

19947
19:05:01,308 --> 19:05:03,391
Vậy hãy để tôi quay lại\nvấn đề đó sau một lát nữa.

19948
19:05:03,392 --> 19:05:06,782
Để cách điệu hóa những thứ này,\n

19949
19:05:06,782 --> 19:05:10,172
chúng ta sẽ cần một\nngôn ngữ hoàn toàn khác.

19950
19:05:10,172 --> 19:05:13,172
Được rồi, bây giờ hãy\ntạo ra những gì trên web

19951
19:05:13,172 --> 19:05:17,702
có đầy đủ, giống như\nnhững bức ảnh, hình ảnh và những thứ tương tự.

19952
19:05:17,702 --> 19:05:22,832
Hãy để tôi tiếp tục và tạo một tệp mới\n

19953
19:05:22,831 --> 19:05:25,781
và thay đổi tiêu đề\ở đây, chẳng hạn như Hình ảnh.

19954
19:05:25,782 --> 19:05:29,189
Và sau đó, trong phần nội dung của trang này,\n

19955
19:05:29,188 --> 19:05:31,771
Điều thú vị về\nhình ảnh là nó thực sự không phải

19956
19:05:31,771 --> 19:05:35,251
sẽ có thẻ bắt đầu và thẻ kết thúc\n

19957
19:05:35,251 --> 19:05:38,281
Giống như, làm thế nào bạn có thể bắt đầu một hình ảnh\nvà sau đó hoàn thành nó?

19958
19:05:38,282 --> 19:05:39,902
Nó ở đó hoặc không.

19959
19:05:39,902 --> 19:05:42,542
Vì vậy một số thẻ không có thẻ kết thúc.

19960
19:05:42,542 --> 19:05:49,081
Vì vậy, hãy để tôi tạo hình ảnh, IMG,\nsource bằng Harvard.jpeg.

19961
19:05:49,081 --> 19:05:51,902
Và hãy để tôi tiếp tục,\trong cửa sổ terminal của tôi

19962
19:05:51,902 --> 19:05:54,301
Thực ra tôi đã mang theo một bức ảnh của Harvard.

19963
19:05:54,301 --> 19:05:57,751
Hãy để tôi lấy cái này trong một giây.

19964
19:05:57,751 --> 19:06:01,171
Để tôi lấy Harvard.jpeg và\ncho nó vào thư mục của tôi

19965
19:06:01,172 --> 19:06:03,822
giả vờ như tôi đã tải xuống\nthứ đó trước.

19966
19:06:03,822 --> 19:06:06,422
Và vì vậy\nbây giờ tôi đang đề cập đến một tệp có tên

19967
19:06:06,422 --> 19:06:12,032
Harvard.jpeg, hình như nó có trong\n

19968
19:06:12,032 --> 19:06:15,211
Nếu hình ảnh này có trên\ninternet, như máy chủ Harvard

19969
19:06:15,211 --> 19:06:21,402
Tôi cũng có thể nói như\nHTTPS://www.Harvard.edu/FolderName

19970
19:06:21,402 --> 19:06:25,562
bất kể nó là gì, /Harvard.jpeg, nhưng\n

19971
19:06:25,562 --> 19:06:28,772
vào môi trường Scode của riêng bạn,\nnhư tôi đã làm trước giờ học

19972
19:06:28,771 --> 19:06:32,072
bằng cách kéo và thả\ntoàn bộ tệp này, bức ảnh này của Harvard

19973
19:06:32,072 --> 19:06:35,402
bạn chỉ có thể tham khảo nó\nmột cách tương đối, có thể nói như vậy.

19974
19:06:35,402 --> 19:06:38,521
Điều này cũng giống như câu nói\nas nói ./Harvard.jpeg

19975
19:06:38,521 --> 19:06:41,941
đi tới thư mục hiện tại và\n

19976
19:06:41,941 --> 19:06:43,861
Nhưng điều đó là không cần thiết để gõ.

19977
19:06:43,861 --> 19:06:47,461
Tuy nhiên, vì mục đích tiếp cận,\n

19978
19:06:47,461 --> 19:06:51,122
thật lý tưởng nếu chúng ta cũng cung cấp văn bản thay thế\nan này, một cái gì đó

19979
19:06:51,122 --> 19:06:55,021
giống như Đại học Harvard,\nên cái gọi là thẻ Alt

19980
19:06:55,021 --> 19:06:57,331
và điều này là để\ntrình đọc màn hình sẽ đọc

19981
19:06:57,331 --> 19:06:59,581
bức ảnh đó là gì\ndành cho những người không thể nhìn thấy nó.

19982
19:06:59,581 --> 19:07:02,072
Và nếu bạn chỉ có kết nối chậm\n, đôi khi bạn sẽ

19983
19:07:02,072 --> 19:07:04,051
xem nội dung\nbạn sắp xem

19984
19:07:04,051 --> 19:07:07,601
trước khi hình ảnh được tải xuống,\n

19985
19:07:07,601 --> 19:07:12,241
Bây giờ chúng ta hãy quay lại trình duyệt đang mở của tôi\n

19986
19:07:12,241 --> 19:07:16,531
Bây giờ tôi có Harvard.jpeg, tôi\n

19987
19:07:16,532 --> 19:07:20,252
Hãy để tôi nhấp vào Image.html,\nand ở đây chúng tôi có

19988
19:07:20,251 --> 19:07:25,171
một bức tranh thực sự lớn về Đài tưởng niệm\n

19989
19:07:25,172 --> 19:07:29,762
Chỉ cần nói rằng có lẽ tôi nên sửa\n

19990
19:07:29,762 --> 19:07:33,271
Nhưng để làm được điều đó, có lẽ chúng ta sẽ\n

19991
19:07:33,271 --> 19:07:36,842
Có một số\nthuộc tính lịch sử mà bạn vẫn có thể

19992
19:07:36,842 --> 19:07:39,283
sử dụng để kiểm soát chiều rộng và\nchiều cao, v.v.

19993
19:07:39,283 --> 19:07:41,491
Nhưng có thể nói là chúng ta sẽ làm điều đó\ntheo cách tốt hơn

19994
19:07:41,491 --> 19:07:44,042
với một ngôn ngữ được thiết kế cho việc đó.

19995
19:07:45,482 --> 19:07:50,402
Tôi cũng đã chuẩn bị sẵn rồi,\nđể tôi lấy một tập tin khác ở đây

19996
19:07:50,402 --> 19:07:55,782
để tôi lấy một tập tin có tên\nHalloween.mp4, đây là một tập tin MPEG.

19997
19:07:55,782 --> 19:08:02,822
Và hãy để tôi tiếp tục và thay đổi điều này\n

19998
19:08:02,822 --> 19:08:04,592
Mình sẽ đổi tiêu đề của mình thành Video.

19999
19:08:04,592 --> 19:08:07,982
Và bây giờ chúng ta hãy tiếp tục\giới thiệu một thẻ khác, thẻ video

20000
19:08:07,982 --> 19:08:13,172
mở khung video rồi để tôi đi\n

20001
19:08:13,172 --> 19:08:17,461
Và sau đó bên trong thẻ video,\n

20002
19:08:17,461 --> 19:08:22,501
sẽ cụ thể\n

20003
19:08:22,501 --> 19:08:27,511
Tôi biết, là Video/mp4, vì tôi đã xem\n

20004
19:08:27,512 --> 19:08:29,702
Và thẻ video thực sự\nh có một vài thuộc tính.

20005
19:08:29,702 --> 19:08:31,711
Tôi có thể để thứ này tự động phát.

20006
19:08:33,392 --> 19:08:36,602
Tôi có thể tắt tiếng nó để không có\n

20007
19:08:36,601 --> 19:08:41,381
Hầu hết các trình duyệt, để chặn quảng cáo, không\n

20008
19:08:41,381 --> 19:08:44,581
Vì vậy, nếu bạn tắt tiếng video của mình, video\nsẽ tự động phát nhưng có lẽ là không

20009
19:08:45,601 --> 19:08:49,932
Và để tôi đặt chiều rộng của thứ này\n

20010
19:08:49,932 --> 19:08:51,581
Nhưng tôi có thể làm nó theo bất kỳ kích thước nào tôi muốn.

20011
19:08:51,581 --> 19:08:55,292
Vì vậy tôi biết điều này chỉ nhờ có\n

20012
19:08:57,122 --> 19:08:59,822
Đôi khi thuộc tính không có giá trị.

20013
19:09:01,051 --> 19:09:04,387
Chúng chỉ là những từ đơn lẻ,\nautoplay, loop, muted

20014
19:09:04,387 --> 19:09:06,512
và điều đó có ý nghĩa\nđối với bất kỳ thuộc tính nào

20015
19:09:08,342 --> 19:09:11,372
Giống như, thật vô nghĩa\nnói tắt tiếng nghĩa là gì đó.

20016
19:09:11,372 --> 19:09:12,722
Giống như nó có bị tắt tiếng hay không.

20017
19:09:12,721 --> 19:09:14,322
Thuộc tính có ở đó hay không.

20018
19:09:14,322 --> 19:09:16,361
Tương tự, đối với những người khác cũng vậy.

20019
19:09:16,361 --> 19:09:19,981
Vậy hãy để tôi quay lại trình duyệt khác của tôi\n

20020
19:09:19,982 --> 19:09:24,122
Có cả mp4\nand của tôi và cả Video.html

20021
19:09:24,122 --> 19:09:26,202
đó là trang web nhúng nó.

20022
19:09:26,202 --> 19:09:29,792
Và đây thực sự là một video\n

20023
19:09:30,941 --> 19:09:35,221
Vì vậy, chúng tôi đã đưa nó vào bản demo này ở đây.

20024
19:09:35,221 --> 19:09:41,792
Đây là video đã được bật\n

20025
19:09:41,792 --> 19:09:44,009
Nhưng ở đây bạn có thể thấy hình ảnh\nan đó thôi

20026
19:09:44,009 --> 19:09:45,301
sẽ không có tác dụng tương tự.

20027
19:09:45,301 --> 19:09:48,494
Đây thực chất là một bộ phim, một\ntệp video nhỏ hiện đang lặp lại.

20028
19:09:48,494 --> 19:09:51,661
Bây giờ có một số hiện vật ở đây, chẳng hạn như\n

20029
19:09:51,661 --> 19:09:53,494
Tôi cảm thấy sẽ rất vui khi lấp đầy màn hình.

20030
19:09:53,494 --> 19:09:58,031
Nhưng một lần nữa, chúng ta sẽ quay lại với một ngôn ngữ\n

20031
19:09:58,032 --> 19:10:00,272
Chà, không chỉ\nnhững video như thế này mà bạn

20032
19:10:00,271 --> 19:10:01,982
có thể muốn đưa vào một trang web.

20033
19:10:01,982 --> 19:10:06,283
Hãy để tôi tạo một\ntệp khác tên là iFrame.html.

20034
19:10:06,283 --> 19:10:09,241
Nếu bạn đã từng tìm hiểu xung quanh, nếu\n

20035
19:10:09,241 --> 19:10:12,565
hoặc nếu bạn có blog của riêng mình hoặc\n

20036
19:10:12,565 --> 19:10:14,732
bạn có thể đã có thói quen\nnhúng video

20037
19:10:14,732 --> 19:10:17,672
trong các trang web bằng cách sử dụng trình phát YouTube được nhúng tương tự.

20038
19:10:17,672 --> 19:10:21,362
Chà, điều này cũng có thể thực hiện được bằng cách sử dụng\n

20039
19:10:22,411 --> 19:10:25,531
Và iFrame chỉ là một thẻ\nnghĩa đen là iFrame.

20040
19:10:25,532 --> 19:10:28,960
Nó có nguồn bằng\nvà sau đó là URL, và nếu nó

20041
19:10:28,960 --> 19:10:32,252
tình cờ có một video trên YouTube, có\n

20042
19:10:32,251 --> 19:10:33,811
theo tài liệu của YouTube.

20043
19:10:33,812 --> 19:10:41,652
Vì vậy, bạn có thể thực hiện www.youtube.com, nhúng,\n

20044
19:10:41,652 --> 19:10:47,191
Vì vậy, đây thực chất là những gì chúng tôi làm, nếu\n

20045
19:10:47,191 --> 19:10:50,402
video, trên trang web của khóa học hoặc\n

20046
19:10:50,402 --> 19:10:53,911
Nếu tôi muốn cho phép toàn màn hình,\ntôi cũng có thể thêm thuộc tính này

20047
19:10:53,911 --> 19:10:56,661
mà tôi biết là có tồn tại, chỉ bằng cách\nđã kiểm tra tài liệu.

20048
19:10:56,661 --> 19:11:00,720
Và nếu bây giờ tôi quay lại trình duyệt của mình\n

20049
19:11:02,039 --> 19:11:03,872
Nó sẽ không lấp đầy\nmàn hình, bởi vì tôi

20050
19:11:03,872 --> 19:11:05,760
chưa tùy chỉnh thẩm mỹ.

20051
19:11:05,760 --> 19:11:10,111
Nhưng nó có vẻ nhúng một chút\n

20052
19:11:10,721 --> 19:11:13,801
Vì vậy chúng ta có thể thay đổi chiều rộng, thay đổi\n

20053
19:11:14,471 --> 19:11:19,171
Nhưng iFrame là một cách nhúng\n

20054
19:11:19,171 --> 19:11:21,961
trang, nếu họ cho phép\nit, để tạo tất cả

20055
19:11:21,961 --> 19:11:25,652
trải nghiệm tương tác càng nhiều\n

20056
19:11:25,652 --> 19:11:28,652
Được rồi, web là của\n

20057
19:11:28,652 --> 19:11:32,072
Hãy tiếp tục và tạo một tệp\na tên là Link.html.

20058
19:11:32,072 --> 19:11:35,581
Và nếu chúng ta muốn tạo một trang web\n

20059
19:11:35,581 --> 19:11:40,100
nếu không thì hãy tiếp tục và làm điều này,\n

20060
19:11:44,551 --> 19:11:48,182
Bây giờ, rất nhiều người thích Facebook, Instagram\n

20061
19:11:48,182 --> 19:11:50,851
trong một tên miền hoặc một tên miền\nđủ điều kiện

20062
19:11:50,851 --> 19:11:52,771
nó tự động trở thành một liên kết.

20063
19:11:52,771 --> 19:11:56,161
Đó là bởi vì những trang web đó có\n

20064
19:11:56,161 --> 19:12:00,550
phát hiện thứ gì đó trông giống như\n

20065
19:12:00,551 --> 19:12:02,452
Bản thân HTML không làm điều đó cho bạn.

20066
19:12:02,452 --> 19:12:06,822
Và vì vậy nếu tôi quay lại trang web\ncủa mình ở đây, hãy nhấp vào Link.html

20067
19:12:06,822 --> 19:12:09,851
nếu bạn gõ truy cập\nthời kỳ Harvard.edu, đó là

20068
19:12:09,851 --> 19:12:11,592
tất cả những gì bạn thực sự sẽ thấy.

20069
19:12:11,592 --> 19:12:15,192
Nhưng theo bản năng, ngay cả khi bạn\n

20070
19:12:15,191 --> 19:12:19,326
chúng ta có thể làm ở đây\nđể giải quyết vấn đề này?

20071
19:12:19,327 --> 19:12:20,952
Chúng ta có thể làm gì để giải quyết vấn đề này.

20072
19:12:20,952 --> 19:12:22,244
Tôi có thể muốn thêm gì.

20073
19:12:24,461 --> 19:12:27,702
GIỌNG 1: Ừ, vậy nên tôi muốn vây quanh\n

20074
19:12:27,702 --> 19:12:30,285
Và bạn không nhất thiết\nbiết điều này cho đến khi ai đó nói với bạn

20075
19:12:30,285 --> 19:12:33,342
hoặc bạn đã tra cứu nhưng thẻ cho\n

20076
19:12:33,342 --> 19:12:35,832
được gọi là thẻ A cho neo.

20077
19:12:35,831 --> 19:12:39,251
Nó có một thuộc tính tên là\nHREF dành cho siêu tham chiếu

20078
19:12:39,251 --> 19:12:42,791
giống như một liên kết trong\nthế giới ảo tới một URL.

20079
19:12:42,792 --> 19:12:45,881
Vì vậy, hãy để tôi nhập URL\nđầy đủ và chính xác của Harvard vào đây.

20080
19:12:45,881 --> 19:12:48,101
Sau đó tôi sẽ đóng thẻ.

20081
19:12:48,101 --> 19:12:53,411
Và sau đó tôi vẫn có thể nói Harvard.edu,\n

20082
19:12:53,411 --> 19:12:58,961
Nhưng nơi họ sẽ tới\n

20083
19:13:00,971 --> 19:13:03,281
Bây giờ nếu tôi quay lại đây\nvà tải lại trang

20084
19:13:03,282 --> 19:13:05,322
bây giờ nó tự động được gạch chân.

20085
19:13:05,322 --> 19:13:07,092
Nó sẽ có màu tím theo mặc định. Tại sao?

20086
19:13:07,092 --> 19:13:09,292
Bởi vì chúng tôi đã ghé thăm\nHarvard.edu cách đây vài phút.

20087
19:13:09,292 --> 19:13:12,642
Vì vậy, theo mặc định, trình duyệt của tôi đang hiển thị\n

20088
19:13:12,642 --> 19:13:14,592
Nhưng bây giờ tôi có một liên kết\nmà tôi có thể nhấp vào

20089
19:13:14,592 --> 19:13:18,881
và nếu tôi di chuột qua nó nhưng không nhấp vào,\n

20090
19:13:18,881 --> 19:13:22,842
có một chút manh mối về nơi\n

20091
19:13:24,012 --> 19:13:26,082
Và không cần phải đi quá xa\nxuống hang thỏ

20092
19:13:26,081 --> 19:13:29,471
nhưng để kết nối cuộc thảo luận\no về an ninh mạng của chúng ta gần đây

20093
19:13:29,471 --> 19:13:32,861
điều gì sẽ xảy ra nếu tôi làm\nđiều gì đó như thế này.

20094
19:13:32,861 --> 19:13:37,331
Ngay bây giờ bạn đã bắt đầu\nmột cuộc tấn công lừa đảo

20095
19:13:37,331 --> 19:13:42,281
P-H-I-S-H-I-N-G, nhờ đó bạn có thể\n

20096
19:13:42,282 --> 19:13:46,542
thậm chí cả một email sử dụng HTML, điều đó cho biết\n

20097
19:13:46,542 --> 19:13:49,612
nhưng họ thực sự sẽ đi\nđến một nơi khác hoàn toàn.

20098
19:13:49,611 --> 19:13:52,121
Và đó chính là bản chất của\ncác cuộc tấn công lừa đảo ngày nay.

20099
19:13:52,122 --> 19:13:55,452
Nếu bạn đã từng nhận được một\nemail giả vờ đến từ PayPal

20100
19:13:55,452 --> 19:13:57,912
hoặc ngân hàng của bạn hoặc một số\ntrang web khác, tỷ lệ cược là

20101
19:13:57,911 --> 19:14:00,432
họ vừa viết HTML\nnó nói bất cứ điều gì họ muốn

20102
19:14:00,432 --> 19:14:04,042
nhưng các thẻ cơ bản có thể\nlàm điều gì đó rất khác.

20103
19:14:04,042 --> 19:14:06,792
Và do đó có bản năng nhìn\n

20104
19:14:06,792 --> 19:14:10,211
hoặc có chút nghi ngờ khi bạn\n

20105
19:14:10,211 --> 19:14:13,601
điều này thật dễ dàng đối với những người\nkỹ sư xã hội, nghĩa là

20106
19:14:13,601 --> 19:14:18,342
đánh lừa họ bằng cách chỉ nói một\nđâu và liên kết với một điều khác.

20107
19:14:18,342 --> 19:14:22,572
Chà, nếu tôi muốn liên kết trang của mình thì sao\n

20108
19:14:22,572 --> 19:14:25,422
Chà, nếu tôi muốn liên kết\nvới bức ảnh đó của Harvard

20109
19:14:25,422 --> 19:14:28,722
Tôi chỉ có thể làm HREF = bằng trích dẫn\n

20110
19:14:28,721 --> 19:14:32,121
trong cùng tài khoản của tôi, đó chính là một trang web.

20111
19:14:32,122 --> 19:14:35,682
Vì vậy, đây là cách bạn có thể tạo\ncác liên kết tương đối, trang web nhiều trang

20112
19:14:35,682 --> 19:14:38,271
trang, trang web nhiều trang, chính bạn.

20113
19:14:38,271 --> 19:14:41,652
Vì vậy, nếu bây giờ tôi tải lại\ntrang này, hãy di chuột qua Harvard.edu

20114
19:14:41,652 --> 19:14:45,191
bạn sẽ thấy ở góc dưới bên trái\ntay một URL rất dài.

20115
19:14:45,191 --> 19:14:48,101
Nhưng đó là vì hiện tại tôi đang ở trong code\nspaces, VS Code

20116
19:14:48,101 --> 19:14:51,762
và nó tự động thêm\nvào cuối URL hiện tại của tôi

20117
19:14:54,822 --> 19:14:57,251
Khi tôi bấm vào cái này, tôi\nđi ngay tới cái đó

20118
19:14:57,251 --> 19:15:01,151
tệp mà chúng tôi đã tạo trước đó, với một phiên bản hình ảnh lớn,\nđiên rồ.

20119
19:15:01,152 --> 19:15:03,822
Nhưng đó chỉ là một cách\nmột trang trên trang web

20120
19:15:03,822 --> 19:15:07,721
có thể liên kết đến một trang khác trên một trang web.

20121
19:15:07,721 --> 19:15:11,711
Hãy làm một việc khác ở đây\nlàm cho mọi thứ phản ứng nhanh hơn

20122
19:15:11,711 --> 19:15:14,622
bởi vì, trên thực tế, đó không phải là một trang web\ncó khả năng phản hồi đặc biệt.

20123
19:15:14,622 --> 19:15:17,702
Phản hồi có nghĩa là phản hồi\n

20124
19:15:17,702 --> 19:15:20,202
rất quan trọng khi ai đó\ncó thể ở trên màn hình như thế này

20125
19:15:20,202 --> 19:15:22,032
hoặc trên một màn hình như thế này ngày nay.

20126
19:15:22,032 --> 19:15:26,892
Có những thẻ đặc biệt mà chúng ta có thể sử dụng để\n

20127
19:15:28,271 --> 19:15:32,381
Vì vậy, hãy để tôi tạo một tệp\ncó tên Responsive.html.

20128
19:15:32,381 --> 19:15:36,131
Tôi sẽ sao chép/dán một số phần bắt đầu\n

20129
19:15:36,131 --> 19:15:40,751
Và hãy để tôi tiếp tục và chộp lấy, hãy\n

20130
19:15:40,751 --> 19:15:46,341
từ trước đó, chỉ để chúng ta có một\n

20131
19:15:46,342 --> 19:15:50,172
Và hãy để tôi tiếp tục\nđưa văn bản này vào đây.

20132
19:15:50,172 --> 19:15:53,632
Và tôi sẽ dán\ncái này vào nội dung của trang này.

20133
19:15:54,411 --> 19:15:57,762
Vì vậy tôi chỉ có một đoạn văn lớn,\n

20134
19:15:57,762 --> 19:15:59,532
Hãy để tôi quay lại trình duyệt của tôi.

20135
19:15:59,532 --> 19:16:02,622
Hãy để tôi mở tập tin này,\ncó tên là Responsive.html

20136
19:16:02,622 --> 19:16:05,442
để nhấn mạnh rằng\nit vẫn chưa phản hồi.

20137
19:16:05,441 --> 19:16:07,781
Hãy để tôi tiếp tục và\nnhấp vào Responsive.html.

20138
19:16:08,961 --> 19:16:12,381
Nhưng đây là một thủ thuật khác mà bạn có thể thực hiện,\n

20139
19:16:12,881 --> 19:16:14,921
Bạn có thể giả vờ là một thiết bị khác.

20140
19:16:14,922 --> 19:16:19,332
Hãy để tôi truy cập lại vào phần Xem, nhà phát triển,\ncông cụ dành cho nhà phát triển.

20141
19:16:19,331 --> 19:16:21,779
Lần trước chúng tôi đã sử dụng tính năng này để\nsử dụng tab Mạng.

20142
19:16:21,779 --> 19:16:24,822
khá là thú vị, bởi vì chúng tôi\n

20143
19:16:25,822 --> 19:16:29,111
Nhưng lưu ý, ít nhất chúng ta cũng có thể nhấp vào\nbiểu tượng này trong Chrome

20144
19:16:29,111 --> 19:16:31,151
trông giống như một chiếc điện thoại di động.

20145
19:16:31,152 --> 19:16:36,199
Tôi có thể biến máy tính xách tay của mình thành thứ trông như thế\n

20146
19:16:36,198 --> 19:16:39,281
Tôi sẽ nhấp vào dấu chấm chấm chấm\n

20147
19:16:39,282 --> 19:16:41,502
Thay vì ở dưới cùng,\ntheo mặc định nó có thể ở đâu

20148
19:16:41,501 --> 19:16:43,281
Tôi sẽ di chuyển nó\nsang phía bên phải.

20149
19:16:43,282 --> 19:16:45,312
Vì vậy, bây giờ ở bên trái,\nbạn sẽ thấy những gì trông giống hơn

20150
19:16:45,312 --> 19:16:47,082
giống như hình dạng của một chiếc điện thoại dọc.

20151
19:16:47,081 --> 19:16:49,841
Và, trên thực tế, nếu tôi đi\nđến các kích thước của mình ở đây

20152
19:16:49,842 --> 19:16:53,741
Vài năm trước tôi sẽ chọn thứ gì đó như\niPhone X.

20153
19:16:53,741 --> 19:16:57,661
Đây là những gì trang web đó có thể\n

20154
19:16:57,661 --> 19:17:01,322
trông có vẻ khá nhỏ\nđể có thể đọc được.

20155
19:17:01,322 --> 19:17:03,842
Và đó là do\ntrang web chưa tự động

20156
19:17:03,842 --> 19:17:07,771
đáp ứng các kích thước\khá hẹp của iPhone

20157
19:17:07,771 --> 19:17:09,971
được đề cập hoặc thiết bị Android\nhoặc những thứ tương tự.

20158
19:17:09,971 --> 19:17:11,411
Vậy hãy để tôi tiếp tục và làm điều này.

20159
19:17:11,411 --> 19:17:13,391
Hãy để tôi quay lại mã của tôi.

20160
19:17:13,392 --> 19:17:16,382
Và hãy để tôi đi vào phần đầu\ncủa trang, và lần đầu tiên

20161
19:17:18,149 --> 19:17:20,191
Từ này hiện có khắp nơi\ntrên internet, nhưng ở đó

20162
19:17:20,191 --> 19:17:23,131
là một thẻ meta được\ngọi, cho phép bạn

20163
19:17:23,131 --> 19:17:27,009
để chỉ định tên của một số loại chi tiết cấu hình ở đây

20164
19:17:28,051 --> 19:17:31,081
Khung nhìn là thuật ngữ kỹ thuật\ncho vùng hình chữ nhật

20165
19:17:31,081 --> 19:17:32,741
mà con người nhìn thấy trong trình duyệt.

20166
19:17:32,741 --> 19:17:35,491
Về cơ bản nó là phần thân của\n

20167
19:17:37,051 --> 19:17:39,751
Và bạn có thể chỉ định\nnội dung của khung nhìn

20168
19:17:39,751 --> 19:17:41,761
nên có thang đo ban đầu là 1.

20169
19:17:41,762 --> 19:17:43,652
Vì vậy, nó không nên được phóng to hoặc thu nhỏ.

20170
19:17:43,652 --> 19:17:46,292
Và chiều rộng mà\ntrình duyệt phải đảm nhận

20171
19:17:46,292 --> 19:17:48,812
phải bằng chiều rộng của thiết bị.

20172
19:17:48,812 --> 19:17:51,722
Đây là những câu nói thần kỳ\nmà bạn cần phải biết

20173
19:17:51,721 --> 19:17:55,771
hoặc sao chép/dán hoặc chép lại,\nchỉ cần thể hiện, tới trình duyệt

20174
19:17:55,771 --> 19:17:59,611
giả định rằng chiều rộng của trang là\n

20175
19:17:59,611 --> 19:18:03,451
Đừng coi thường sự sang trọng của một\nmáy tính xách tay hoặc máy tính để bàn lớn.

20176
19:18:03,452 --> 19:18:08,432
Bây giờ, chỉ thực hiện thay đổi đó, hãy\n

20177
19:18:08,432 --> 19:18:10,682
tại đây, bằng cách sử dụng các công cụ dành cho nhà phát triển của Chrome.

20178
19:18:13,232 --> 19:18:18,722
Và bây giờ, nó không còn hiệu quả nữa\n

20179
19:18:23,501 --> 19:18:28,351
Vì vậy, nếu tôi phóng to lên 100% thì đây sẽ là\n

20180
19:18:28,351 --> 19:18:30,372
dễ đọc hơn so với cách đây một lúc

20181
19:18:30,372 --> 19:18:33,039
mặc dù tôi nhận ra rằng bản demo\n đó chưa hẳn đã thuyết phục.

20182
19:18:33,039 --> 19:18:34,832
Nhưng nó đơn giản như\nnói với trình duyệt

20183
19:18:34,831 --> 19:18:38,801
để thay đổi kích thước nội dung theo\nchiều rộng của trang.

20184
19:18:38,801 --> 19:18:41,971
Được rồi, hãy để tôi tạm dừng ở đây để xem\n

20185
19:18:41,971 --> 19:18:43,591
cảm thấy như có đủ thẻ HTML.

20186
19:18:43,592 --> 19:18:45,312
Chúng tôi sẽ thêm một vài chi tiết nữa vào.

20187
19:18:45,312 --> 19:18:47,402
Nhưng phần lớn,\ngiống như các thẻ HTML

20188
19:18:47,402 --> 19:18:51,241
những điều bạn Google và tìm ra\n

20189
19:18:51,241 --> 19:18:54,182
Các khối xây dựng cơ bản\là các thẻ, thuộc tính.

20190
19:18:54,182 --> 19:18:55,652
Một số thuộc tính có giá trị.

20191
19:18:56,461 --> 19:19:00,175
Và về bản chất đó là một loại cấu trúc của HTML.

20192
19:19:00,175 --> 19:19:01,592
Tuy nhiên, có những câu hỏi về bất kỳ câu hỏi nào trong số này.

20193
19:19:02,330 --> 19:19:03,961
ĐỐI TƯỢNG: Các thuộc tính có thứ tự không?

20194
19:19:03,961 --> 19:19:05,611
LOA 1: Các thuộc tính có thứ tự không?

20195
19:19:05,611 --> 19:19:08,701
Không, các thuộc tính có thể theo bất kỳ\nthứ tự nào, từ trái sang phải.

20196
19:19:08,702 --> 19:19:11,702
Tôi có xu hướng hơi kén chọn nên tôi sắp xếp chúng theo thứ tự bảng chữ cái

20197
19:19:11,702 --> 19:19:14,917
nếu chỉ vì lúc đó tôi có thể dễ dàng\nnhận ra nếu thiếu thứ gì đó

20198
19:19:14,917 --> 19:19:16,292
nếu nó không có ở đó theo thứ tự bảng chữ cái.

20199
19:19:16,292 --> 19:19:21,952
Hầu hết mọi người trên Internet\ndường như không làm điều đó.

20200
19:19:24,801 --> 19:19:26,811
Tôi đã đề cập rằng HTML\nis đang bắt đầu thay thế

20201
19:19:26,812 --> 19:19:28,851
các ngôn ngữ khác cho giao diện người dùng.

20202
19:19:28,851 --> 19:19:30,292
Và nó không chỉ riêng HTML.

20203
19:19:30,292 --> 19:19:34,101
Đó là HTML với CSS, với JavaScript,\n

20204
19:19:35,211 --> 19:19:37,911
Đó đúng hơn là\nxu hướng về tính di động

20205
19:19:37,911 --> 19:19:40,581
và khả năng của các công ty,\ncủa các lập trình viên cá nhân

20206
19:19:40,581 --> 19:19:42,951
để viết một phiên bản\ncủa một ứng dụng và có nó

20207
19:19:42,952 --> 19:19:47,092
hoạt động trên thiết bị Android và iPhone\n

20208
19:19:48,351 --> 19:19:51,411
Rất tốn thời gian\nhọc một ngôn ngữ như Java

20209
19:19:51,411 --> 19:19:54,322
và viết một ứng dụng Android, học\ngôn ngữ nano khác tên là Swift

20210
19:19:54,322 --> 19:19:56,991
và tạo một ứng dụng iOS, chưa kể\nđề cập đến việc làm cho chúng trông và hoạt động như thế nào

20211
19:19:56,991 --> 19:19:59,123
tương tự, chưa kể đến việc sửa một lỗi trong đó

20212
19:19:59,123 --> 19:20:00,831
rồi nhớ\nsửa nó vào cái kia.

20213
19:20:00,831 --> 19:20:05,061
Ý tôi là, việc này rất đau đớn\và tốn thời gian và tốn kém.

20214
19:20:05,062 --> 19:20:09,351
Vì vậy việc tiêu chuẩn hóa này trên\nHTML, CSS và JavaScript

20215
19:20:09,351 --> 19:20:13,432
ngay cả đối với ứng dụng dành cho thiết bị di động và ứng dụng web,\n

20216
19:20:13,432 --> 19:20:16,012
bởi vì nó giải quyết được những vấn đề như thế.

20217
19:20:16,012 --> 19:20:19,851
Được rồi, vậy hãy tiếp tục và bây giờ hãy làm\n

20218
19:20:19,851 --> 19:20:22,161
Tất cả các trang này\ncho đến nay thực sự chỉ là thị hiếu

20219
19:20:22,161 --> 19:20:25,042
của nội dung tĩnh, nội dung\nkhông thay đổi.

20220
19:20:25,042 --> 19:20:27,991
Nào, hãy tiếp tục và làm điều này.

20221
19:20:27,991 --> 19:20:31,012
Hãy để tôi giới thiệu một\nđịnh dạng URL khác, có vẻ như

20222
19:20:31,012 --> 19:20:33,051
một chút gì đó giống như nó đã làm trước đây.

20223
19:20:33,051 --> 19:20:36,451
Vì vậy, hãy gạch chéo đường đi, nhưng thực tế nó có thể giống như thế này

20224
19:20:36,452 --> 19:20:40,012
dấu gạch chéo đường dẫn câu hỏi\ndấu, khóa bằng giá trị.

20225
19:20:40,012 --> 19:20:42,021
Có thể bạn đã không chú ý,\cũng không quan tâm để ý

20226
19:20:42,021 --> 19:20:44,641
các URL trong thanh URL của bạn mỗi ngày.

20227
19:20:44,642 --> 19:20:46,282
Nhưng những thứ này có ở khắp mọi nơi.

20228
19:20:46,282 --> 19:20:49,222
Thông thường khi bạn nhập vào\ncông cụ tìm kiếm như Google

20229
19:20:49,221 --> 19:20:52,491
một truy vấn tìm kiếm, bất cứ điều gì bạn vừa nhập đều sẽ xuất hiện trong URL.

20230
19:20:52,491 --> 19:20:55,099
Khi bạn nhấp vào một liên kết\ncó chứa một số thông tin

20231
19:20:55,099 --> 19:20:57,682
có thể có một dấu hỏi,\nvà sau đó là một số khóa và giá trị.

20232
19:20:57,682 --> 19:21:00,471
Có thể có ký hiệu và\nvà nhiều khóa và giá trị hơn.

20233
19:21:00,471 --> 19:21:02,901
Một lần nữa, đây là mô hình lập trình rất\nphổ biến

20234
19:21:02,902 --> 19:21:05,062
chỉ liên kết các khóa với các giá trị.

20235
19:21:07,021 --> 19:21:11,391
Hãy để tôi thực sự truy cập\ngoogle.com, trong trình duyệt

20236
19:21:11,392 --> 19:21:16,042
ở đây và để tôi tìm kiếm thứ gì đó\n

20237
19:21:16,042 --> 19:21:20,482
Nhập, lưu ý rằng\nURL của tôi đã thay đổi từ google.com

20238
19:21:20,482 --> 19:21:23,991
vào google.com gạch chéo\ndấu chấm hỏi tìm kiếm

20239
19:21:23,991 --> 19:21:27,081
Q bằng mèo, ký hiệu\nvà sau đó là một loạt thứ

20240
19:21:27,081 --> 19:21:28,581
mà tôi không hiểu hoặc không biết.

20241
19:21:28,581 --> 19:21:33,501
Vì vậy bây giờ chúng ta hãy xóa nó đi và\n

20242
19:21:34,559 --> 19:21:37,101
Nếu tôi thu nhỏ ở đây, nhiều năm trước\nbạn sẽ thấy ảnh của những con mèo.

20243
19:21:37,101 --> 19:21:41,122
Bây giờ bạn có được video của bộ phim.

20244
19:21:41,122 --> 19:21:44,332
Và sau đó là truy vấn hàng đầu\nđó, Cats có phải là một bộ phim tệ không.

20245
19:21:44,331 --> 19:21:46,822
Nhưng tất nhiên chúng ta cũng có thể nhấp vào Hình ảnh.

20246
19:21:46,822 --> 19:21:49,521
Và còn có những chú mèo đáng yêu, những chú mèo đáng sợ.

20247
19:21:49,521 --> 19:21:52,342
Được rồi, điều này chưa từng xảy ra khi chúng ta tìm kiếm mèo.

20248
19:21:52,342 --> 19:21:57,922
Nhưng dù sao đi nữa, vấn đề là URL\n

20249
19:21:57,922 --> 19:22:00,562
Và đây quả là một điều đơn giản\nnhưng lại vô cùng mạnh mẽ.

20250
19:22:00,562 --> 19:22:04,822
Đây là cách con người\ncung cấp thông tin đầu vào cho máy chủ.

20251
19:22:04,822 --> 19:22:07,741
Họ không tạo\nURL theo cách thủ công như tôi vừa làm.

20252
19:22:07,741 --> 19:22:10,792
Nhưng khi bạn điền vào biểu mẫu\không phải trên web và nhấn Enter

20253
19:22:10,792 --> 19:22:13,672
thường thì URL đột ngột\nthay đổi để bao gồm

20254
19:22:13,672 --> 19:22:16,552
bất cứ điều gì bạn đã nhập vào,\nvào URL, giả sử

20255
19:22:16,551 --> 19:22:18,891
biểu mẫu đang sử dụng động từ GET.

20256
19:22:20,331 --> 19:22:22,123
Nếu bạn đang nhập\ntên người dùng, mật khẩu

20257
19:22:22,123 --> 19:22:25,331
thông tin thẻ tín dụng, bởi vì bạn\n

20258
19:22:25,331 --> 19:22:27,951
vào máy tính xách tay của bạn để xem theo nghĩa đen\mọi thứ bạn đã nhập

20259
19:22:29,331 --> 19:22:32,061
Vậy nên có một động từ khác, POST,\ncó thể che giấu tất cả những điều đó.

20260
19:22:32,062 --> 19:22:33,772
Và nó chỉ được gửi hơi khác một chút.

20261
19:22:33,771 --> 19:22:36,501
Nhưng những thứ như thế này\nthường được gửi qua GET

20262
19:22:36,501 --> 19:22:39,921
và điều đó có nghĩa là gì bên dưới\n

20263
19:22:39,922 --> 19:22:43,432
đưa ra một yêu cầu như thế này, Nhận/tìm kiếm?

20264
19:22:43,432 --> 19:22:47,752
Q bằng, bất kể bạn gõ gì,\n

20265
19:22:47,751 --> 19:22:52,822
Và hy vọng thứ quay lại là một trang\n

20266
19:22:52,822 --> 19:22:57,961
Và điều thú vị ở đây bây giờ là, nếu\n

20267
19:22:57,961 --> 19:23:04,792
và để tôi tiếp tục và tạo một\n

20268
19:23:04,792 --> 19:23:09,682
Trong Search.html, tôi sẽ bắt đầu\n

20269
19:23:11,032 --> 19:23:14,612
Và trong phần nội dung của trang này, tôi sẽ giới thiệu một thẻ biểu mẫu.

20270
19:23:14,611 --> 19:23:18,531
Và trong thẻ biểu mẫu này, tôi sẽ\ncó một vài thông tin đầu vào.

20271
19:23:18,532 --> 19:23:25,252
Và các loại đầu vào sẽ\n

20272
19:23:28,448 --> 19:23:30,531
Và điều này vẫn chưa thú vị lắm, nhưng hãy xem nào

20273
19:23:30,532 --> 19:23:32,422
những gì đang xảy ra trong chính trang đó.

20274
19:23:32,422 --> 19:23:34,762
Hãy để tôi quay lại danh sách thư mục của tôi.

20275
19:23:34,762 --> 19:23:36,922
Hãy để tôi nhấp vào Search.html.

20276
19:23:36,922 --> 19:23:39,442
Dường như tôi đã có sự khởi đầu\ncủa công cụ tìm kiếm của riêng mình.

20277
19:23:40,551 --> 19:23:43,201
Nó chỉ là một hộp văn bản\nvà một nút gửi.

20278
19:23:43,202 --> 19:23:45,002
Nhưng hãy kết thúc suy nghĩ của tôi ở đây.

20279
19:23:45,001 --> 19:23:49,911
Vì vậy hãy đặt cho\nhộp văn bản này một cái tên cụ thể là Q

20280
19:23:49,911 --> 19:23:53,751
mà, nếu bạn quay lại cuối thập niên 90\n

20281
19:23:53,751 --> 19:23:58,041
đã tạo Google.com, truy vấn đại diện Q,\n

20282
19:23:58,042 --> 19:24:01,822
Vì vậy, tên của hộp văn bản\nnày sẽ là văn bản

20283
19:24:01,822 --> 19:24:05,842
sẽ là Q. Biểu mẫu sẽ sử dụng phương pháp nào?

20284
19:24:05,842 --> 19:24:07,702
Về mặt kỹ thuật, nó sử dụng GET\ntheo mặc định, nhưng tôi sẽ

20285
19:24:07,702 --> 19:24:10,282
hãy nói rõ ràng và nói phương thức\nequals quote unquote "get.

20286
19:24:10,282 --> 19:24:14,632
Thật ngu ngốc, nó là chữ thường trong HTML, thậm chí\n

20287
19:24:16,851 --> 19:24:21,491
Hành động của biểu mẫu này, cụ thể là\n

20288
19:24:21,491 --> 19:24:24,351
Nhưng hiện tại chúng tôi thực sự không có thời gian\nđể triển khai chính Google.

20289
19:24:24,351 --> 19:24:28,941
Vì vậy chúng tôi sẽ gửi\n

20290
19:24:28,941 --> 19:24:31,152
Vì vậy, tôi đang tạo một biểu mẫu,\nhành động trong đó

20291
19:24:31,152 --> 19:24:35,711
là gửi dữ liệu tới dấu gạch chéo của Google\n

20292
19:24:35,711 --> 19:24:41,021
Nó sẽ gửi một đầu vào có tên là Q,\n

20293
19:24:41,021 --> 19:24:44,081
Hãy để tôi quay lại\ntrình duyệt, tải lại trang.

20294
19:24:44,081 --> 19:24:48,911
Có vẻ như vẫn chưa có gì thay đổi,\n

20295
19:24:50,351 --> 19:24:53,952
Hiện tại tôi đang ở Search.html.

20296
19:24:53,952 --> 19:24:57,282
Nếu tôi thu nhỏ và tìm kiếm\ncats ngay bây giờ và nhấp vào Gửi

20297
19:24:57,282 --> 19:24:59,262
Tôi được đưa tới google.com.

20298
19:24:59,262 --> 19:25:02,952
Nhưng hãy lưu ý rằng URL được\ntham số hóa, với các giá trị khóa đó

20299
19:25:04,572 --> 19:25:06,432
Và tôi nhận được cả\nmột loạt kết quả về mèo.

20300
19:25:06,432 --> 19:25:08,771
Và bây giờ tôi có thể rất dễ dàng\nlàm cho cái này đẹp hơn một chút.

20301
19:25:08,771 --> 19:25:11,801
Hiện tại, điều đó không lý tưởng chút nào\n

20302
19:25:13,116 --> 19:25:15,491
Và có một điều hơi khó chịu\nlà tính năng tự động hoàn tất được bật.

20303
19:25:15,491 --> 19:25:17,292
Nếu tôi không muốn\ntìm kiếm mèo nữa

20304
19:25:17,292 --> 19:25:21,282
à, theo tài liệu của HTML,\n

20305
19:25:21,282 --> 19:25:25,362
Tự động hoàn thành tắt, để tắt\ntắt tự động hoàn thành, tự động lấy nét

20306
19:25:25,361 --> 19:25:28,521
để tự động đặt\ncursor vào trong hộp văn bản đó.

20307
19:25:28,521 --> 19:25:32,292
Nếu tôi muốn một số văn bản giải thích, tôi có thể\n

20308
19:25:33,521 --> 19:25:35,652
Và bây giờ nếu tôi quay lại\ntrang này và tải lại

20309
19:25:35,652 --> 19:25:37,461
bây giờ nó thân thiện hơn một chút với người dùng.

20310
19:25:37,461 --> 19:25:39,641
Bạn thấy truy vấn ở dạng văn bản màu xám.

20311
19:25:39,642 --> 19:25:41,472
Con trỏ đã\nở đó và nhấp nháy.

20312
19:25:41,471 --> 19:25:43,001
Tôi thậm chí không cần phải di chuyển con trỏ của mình.

20313
19:25:43,001 --> 19:25:46,121
Bây giờ tôi có thể tìm kiếm chó, còn bạn\n

20314
19:25:46,122 --> 19:25:48,911
Nhấn enter để gửi và\nhiện tôi đang tìm kiếm

20315
19:25:48,911 --> 19:25:51,831
thay vào đó chúng ta đi đây, những chú chó đáng yêu.

20316
19:25:52,762 --> 19:25:56,851
Tôi đã triển khai giao diện người dùng của\n

20317
19:25:56,851 --> 19:25:58,601
Để triển khai phần back\nend, rõ ràng là chúng tôi

20318
19:25:58,601 --> 19:26:01,812
sẽ cần một thứ thực sự lớn\n

20319
19:26:01,812 --> 19:26:05,484
Chúng ta sẽ cần một số mã như\n

20320
19:26:06,191 --> 19:26:08,091
Chúng ta sẽ cần Python\ncho những việc như thế.

20321
19:26:08,092 --> 19:26:09,912
Và trên thực tế, đó là hướng\nchúng tôi sẽ định hướng vào tuần tới

20322
19:26:09,911 --> 19:26:11,262
khi chúng tôi triển khai phần phụ trợ đó.

20323
19:26:11,262 --> 19:26:14,592
Nhưng hôm nay tất cả đều là về giao diện người dùng này.

20324
19:26:14,592 --> 19:26:20,682
Hoặc bất kỳ câu hỏi nào về biểu mẫu,\n

20325
19:26:20,682 --> 19:26:24,680
chuyển sang làm cho mọi thứ trông đẹp hơn một chút bằng CSS?

20326
19:26:24,679 --> 19:26:27,221
Và sau đó chúng ta sẽ kết thúc bằng việc\nlàm cho mọi thứ hoạt động tốt hơn một chút

20327
19:26:31,941 --> 19:26:35,121
Được rồi, hãy bắt đầu trả lời\n

20328
19:26:35,122 --> 19:26:40,232
đã nghĩ ra bằng cách biến những trang này thành một\n

20329
19:26:40,232 --> 19:26:45,872
Bây giờ chúng ta hãy tiếp tục và giới thiệu với\n

20330
19:26:45,872 --> 19:26:48,562
Hãy để tôi tiếp tục và tạo\na tệp có tên Home.html

20331
19:26:48,562 --> 19:26:51,292
như thể tôi đang tạo một trang chủ\n lần đầu tiên.

20332
19:26:51,292 --> 19:26:53,961
Và trong trang này, tôi sẽ\nđặt tiêu đề là Nhà.

20333
19:26:53,961 --> 19:26:55,891
Và tôi sẽ\ncó ba thứ.

20334
19:26:55,892 --> 19:27:00,292
Đầu tiên tôi sẽ có\na đoạn văn bản ở đây

20335
19:27:00,292 --> 19:27:03,322
ở trên cùng, điều đó nói lên điều gì đó\nrất đáng mừng cho trang chủ của tôi

20336
19:27:03,322 --> 19:27:06,741
như tên tôi, John Harvard, cho\n

20337
19:27:06,741 --> 19:27:10,072
Sau đó ở giữa trang,\n

20338
19:27:10,072 --> 19:27:12,982
chào mừng bạn đến với trang chủ\ndấu chấm than của tôi!

20339
19:27:12,982 --> 19:27:16,042
Và ở cuối trang, tôi\n

20340
19:27:16,042 --> 19:27:19,672
nói điều gì đó như bản quyền,\nbiểu tượng bản quyền, John

20341
19:27:19,672 --> 19:27:21,172
Harvard, hay gì đó tương tự.

20342
19:27:21,172 --> 19:27:25,432
Được rồi, nó giống như một trang web\n

20343
19:27:26,721 --> 19:27:27,981
Điều này không thú vị chút nào.

20344
19:27:27,982 --> 19:27:32,422
Nếu tôi mở trang này có tên\nHome.html, hãy để tôi tiếp tục

20345
19:27:32,422 --> 19:27:35,932
và tạo ba đoạn văn nhanh,\n

20346
19:27:35,932 --> 19:27:39,292
Ở giữa, tôi định nói\n

20347
19:27:40,232 --> 19:27:42,472
Và ở phía dưới,\nôi, ở phía dưới

20348
19:27:42,471 --> 19:27:45,651
một chân trang nhỏ có nội dung\nthứ gì đó giống như bản quyền

20349
19:27:45,652 --> 19:27:50,331
một biểu tượng\nbản quyền đơn giản và tên John Harvard.

20350
19:27:50,331 --> 19:27:52,364
Được rồi, bây giờ hãy để tôi tải lại trang.

20351
19:27:53,032 --> 19:27:57,292
Nó rất đơn giản, rất ấn tượng\n

20352
19:27:57,292 --> 19:28:00,188
Bây giờ chúng ta hãy bắt đầu cách điệu\nđiều này một cách thú vị

20353
19:28:00,188 --> 19:28:02,271
để nó có vẻ đẹp\thẩm mỹ hơn một chút.

20354
19:28:02,271 --> 19:28:04,251
Đầu tiên, đây không thực sự là những đoạn văn.

20355
19:28:04,251 --> 19:28:08,104
Chúng giống như các khu vực của trang,\n

20356
19:28:08,104 --> 19:28:09,771
Giống như phần chính của màn hình của tôi.

20357
19:28:09,771 --> 19:28:11,521
Và sau đó là\nchân trang trên màn hình của tôi.

20358
19:28:11,521 --> 19:28:13,813
Vì vậy, các đoạn văn không hoàn toàn\nđúng, nếu những đoạn này không thực sự

20359
19:28:15,152 --> 19:28:17,722
Tôi có thể gọi\nchúng một cách chính xác hơn là div hoặc phép chia

20360
19:28:17,721 --> 19:28:21,831
của trang, điều này rất phổ biến\n

20361
19:28:21,831 --> 19:28:24,121
vùng hình chữ nhật chung này với nó.

20362
19:28:24,122 --> 19:28:28,192
Nó không có tác dụng gì về mặt thẩm mỹ,\n

20363
19:28:28,191 --> 19:28:32,601
Nó chỉ tạo ra một vùng\nhình chữ nhật vô hình, bên trong đó

20364
19:28:32,601 --> 19:28:34,342
bạn có thể bắt đầu tạo kiểu cho văn bản.

20365
19:28:34,342 --> 19:28:36,262
Hoặc tôi có thể tiến thêm một bước nữa.

20366
19:28:36,262 --> 19:28:40,461
Có một số thẻ khác trong HTML,\n

20367
19:28:40,461 --> 19:28:42,869
có tên mô tả\nloại trang của bạn, trong đó

20368
19:28:42,869 --> 19:28:45,411
ngày nay điều này càng trở nên hấp dẫn hơn đối với khả năng tiếp cận

20369
19:28:45,411 --> 19:28:49,881
cho trình đọc màn hình, cho công cụ tìm kiếm,\n

20370
19:28:49,881 --> 19:28:52,584
công cụ có thể nhận ra rằng chân trang\nis có thể hơi mờ.

20371
19:28:52,584 --> 19:28:54,292
Tiêu đề có thể\na thú vị một chút.

20372
19:28:54,292 --> 19:28:57,202
Phần chính của trang\có lẽ là phần thú vị nhất

20373
19:28:57,202 --> 19:29:01,762
mà tôi muốn người dùng có thể tìm kiếm\n

20374
19:29:01,762 --> 19:29:04,672
Vì vậy, hãy bắt đầu cách điệu\ntrang này bằng cách nào đó.

20375
19:29:04,672 --> 19:29:08,482
Hãy giới thiệu một thuộc tính style\nat trong HTML

20376
19:29:08,482 --> 19:29:13,101
bên trong sẽ có\nvăn bản như thế này, cỡ chữ dấu hai chấm

20377
19:29:13,101 --> 19:29:16,851
lớn, văn bản căn giữa trung tâm đại tràng.

20378
19:29:16,851 --> 19:29:20,182
Trên Main, tôi sẽ thêm thuộc tính\nstyle và nói kích thước phông chữ

20379
19:29:24,021 --> 19:29:27,741
Và ở phần chân trang, tôi sẽ\nnói kiểu dáng bằng cỡ chữ

20380
19:29:34,232 --> 19:29:36,592
Chà, màu xanh lam là\nngôn ngữ chúng ta đã hứa

20381
19:29:36,592 --> 19:29:39,112
được gọi là CSS, dành cho Cascading Style Sheets.

20382
19:29:39,111 --> 19:29:42,231
Chúng tôi chưa thực sự nhìn thấy\nBảng định kiểu xếp tầng của nó.

20383
19:29:42,232 --> 19:29:46,192
Nhưng trong màu xanh lam ở đây, thông báo là\nan mô hình rất phổ biến khác.

20384
19:29:46,191 --> 19:29:48,861
Cú pháp này khác\nbây giờ, nhưng bạn sẽ làm thế nào

20385
19:29:48,861 --> 19:29:52,461
mô tả những gì bạn đang nhìn thấy ở đây bằng màu xanh lam?

20386
19:29:52,461 --> 19:29:56,902
Đây là một ví dụ khác về\nloại quy ước lập trình nào?

20387
19:29:57,789 --> 19:30:00,081
GIỌNG 1: Vâng, chỉ là\nthêm các cặp giá trị khóa thôi, phải không?

20388
19:30:00,081 --> 19:30:03,031
Sẽ thật tuyệt nếu thế giới được chuẩn hóa\n

20389
19:30:03,032 --> 19:30:07,260
bởi vì bây giờ chúng ta đã thấy các dấu bằng\n

20390
19:30:07,801 --> 19:30:10,009
Nhưng đó chỉ là\nngôn ngữ khác nhau, sự lựa chọn khác nhau.

20391
19:30:10,009 --> 19:30:13,121
Chìa khóa ở đây là cỡ chữ,\ngiá trị lớn.

20392
19:30:13,122 --> 19:30:16,922
Khóa còn lại là căn chỉnh văn bản,\ndấu hai chấm, giá trị là giữa.

20393
19:30:16,922 --> 19:30:20,642
Dấu chấm phẩy chỉ phân tách cặp giá trị khóa\none với cặp giá trị khóa khác.

20394
19:30:20,642 --> 19:30:24,482
Giống như trong URL, ký hiệu\ndid, trong ngữ cảnh của HTTP.

20395
19:30:24,482 --> 19:30:27,392
Thay vào đó, các nhà thiết kế CSS\nđã sử dụng dấu chấm phẩy.

20396
19:30:27,392 --> 19:30:30,149
Nói đúng ra,\ndấu chấm phẩy này là không cần thiết.

20397
19:30:30,149 --> 19:30:32,732
Tôi có xu hướng đưa nó vào chỉ để\nkhông đối xứng, nhưng điều đó không thành vấn đề

20398
19:30:32,732 --> 19:30:34,322
vì không có gì sau đó cả.

20399
19:30:34,322 --> 19:30:36,301
Đây là một ví dụ hơi kỳ lạ.

20400
19:30:36,301 --> 19:30:41,341
Đây là sự kết hợp của\nCSS bên trong JavaScript.

20401
19:30:41,342 --> 19:30:46,682
Vì vậy, hiện tại, bạn có thể sử dụng CSS\n

20402
19:30:46,682 --> 19:30:49,441
trong giá trị của thuộc tính style.

20403
19:30:49,441 --> 19:30:52,542
Chúng tôi đã làm điều gì đó hơi giống\ntương tự như vậy vào hai tuần trước

20404
19:30:52,542 --> 19:30:57,032
hơn một tuần trước, khi chúng tôi đưa\nmột số SQL vào trong Python.

20405
19:30:57,032 --> 19:30:59,764
Vì vậy, một lần nữa, các ngôn ngữ có thể cùng nhau vượt qua các rào cản.

20406
19:30:59,764 --> 19:31:01,682
Nhưng chúng ta sẽ dọn dẹp\ncái này, bởi vì cái này

20407
19:31:01,682 --> 19:31:04,599
sẽ nhanh chóng trở nên lộn xộn,\n

20408
19:31:04,599 --> 19:31:07,211
của Harvard hay Yale, hay tương tự.

20409
19:31:07,211 --> 19:31:09,372
Vậy hãy xem nó trông như thế nào nhé.

20410
19:31:09,372 --> 19:31:13,142
Hãy để tôi quay lại trình duyệt của tôi\ncửa sổ ở đây, tải lại trang.

20411
19:31:13,142 --> 19:31:14,922
Và nó không khác lắm.

20412
19:31:14,922 --> 19:31:19,412
Nhưng nó thực sự nằm ở giữa, và nó\n

20413
19:31:19,411 --> 19:31:20,732
Và hãy để tôi thực hiện một sàng lọc.

20414
19:31:20,732 --> 19:31:22,771
Biểu tượng bản quyền\thực tế có thể được thể hiện

20415
19:31:22,771 --> 19:31:25,021
nhưng không có phím nào trên\nbàn phím Mỹ của tôi ở đây.

20416
19:31:25,021 --> 19:31:30,902
Tôi thực sự có thể nói một cách kỳ diệu\nampers và băm 169 dấu chấm phẩy

20417
19:31:30,902 --> 19:31:33,167
sử dụng cái được gọi là thực thể HTML.

20418
19:31:33,167 --> 19:31:36,991
Hóa ra có số\n

20419
19:31:36,991 --> 19:31:40,351
cho phép bạn chỉ định các ký hiệu\n

20420
19:31:40,351 --> 19:31:42,361
nhưng điều đó không tồn tại trên hầu hết các bàn phím.

20421
19:31:42,361 --> 19:31:46,051
Nếu bây giờ tôi tải lại trang thì\nit sẽ là biểu tượng bản quyền phù hợp.

20422
19:31:46,051 --> 19:31:50,221
Mang tính thẩm mỹ rất nhỏ nhưng nó\giới thiệu cho chúng ta về các thực thể HTML này.

20423
19:31:50,221 --> 19:31:53,671
Vì vậy, ngay cả khi bạn chưa từng\nbiết CSS trước đây, bạn

20424
19:31:53,672 --> 19:31:56,522
có lẽ có thể tìm thấy điều gì đó\nngớ ngẩn về điều gì

20425
19:31:56,521 --> 19:31:58,201
Tôi đã làm ở đây, giống như thiết kế kém.

20426
19:31:58,202 --> 19:32:02,582
Đúng vậy, nếu mục tiêu của tôi nhỏ,\n

20427
19:32:02,581 --> 19:32:07,081
có vẻ như là một thiết kế tồi\ncó lẽ, ngay cả khi bạn chưa bao giờ

20428
19:32:09,872 --> 19:32:12,122
GIỌNG 1: Vâng, tôi đã sử dụng\ncùng một phong cách ba lần

20429
19:32:12,122 --> 19:32:14,942
như sao chép/dán hoặc gõ đi gõ lại cùng một nội dung\chính xác.

20430
19:32:14,941 --> 19:32:17,221
Nó hiếm khi là một điều tốt.

20431
19:32:17,221 --> 19:32:21,691
Chà, đây là nơi chúng ta có thể tận dụng\n lợi thế của thiết kế CSS

20432
19:32:21,691 --> 19:32:24,121
bởi vì nó hỗ trợ cái\nchúng ta có thể gọi là sự kế thừa

20433
19:32:24,122 --> 19:32:29,461
nhờ đó con cái được thừa kế các tài sản,\n

20434
19:32:30,572 --> 19:32:32,471
Và điều đó có nghĩa là tôi có thể làm được điều này.

20435
19:32:32,471 --> 19:32:34,231
Hãy để tôi thoát khỏi căn chỉnh văn bản này.

20436
19:32:34,232 --> 19:32:36,032
Hãy để tôi thoát khỏi căn chỉnh văn bản này.

20437
19:32:37,232 --> 19:32:40,142
Tôi có thể bỏ dấu chấm phẩy,\n

20438
19:32:40,142 --> 19:32:46,502
Và hãy để tôi thêm tất cả phong cách đó\n

20439
19:32:46,501 --> 19:32:51,511
để nó sắp xếp theo tầng xuống\n

20440
19:32:52,331 --> 19:32:54,451
Và hãy để tôi kết thúc các trích dẫn của mình ở đó.

20441
19:32:54,452 --> 19:32:58,381
Bây giờ, nếu tôi quay lại trình duyệt của mình\nvà nhấn tải lại, không có gì thay đổi.

20442
19:32:58,381 --> 19:33:00,241
Nhưng nó được thiết kế tốt hơn một chút, phải không?

20443
19:33:00,241 --> 19:33:03,601
Bởi vì nếu tôi muốn thay đổi văn bản\n

20444
19:33:03,601 --> 19:33:06,491
Bây giờ tôi có thể tải lại trang, và\n thì đấy, bây giờ nó ở đằng kia.

20445
19:33:06,491 --> 19:33:08,952
Tôi thay đổi nó ở một nơi chứ không phải ở ba nơi khác nhau.

20446
19:33:08,952 --> 19:33:11,822
Vì vậy, đó có vẻ là một thiết kế tốt hơn\nmột chút.

20447
19:33:11,822 --> 19:33:14,441
Và liệu chúng ta có thể làm điều này\nkhác biệt hơn nữa không?

20448
19:33:14,441 --> 19:33:20,251
Chà, nó không thanh lịch đến thế\n

20449
19:33:20,251 --> 19:33:22,621
Điều này thường có xu hướng\nlà cách thực hành không tốt, trong đó

20450
19:33:22,622 --> 19:33:26,012
bạn kết hợp HTML của bạn và\n của bạn

20451
19:33:26,012 --> 19:33:28,622
có thể thực sự giỏi trong việc thiết lập cấu trúc của các trang web

20452
19:33:28,622 --> 19:33:31,411
và nội dung cũng như dữ liệu, còn bạn\n

20453
19:33:31,411 --> 19:33:32,822
hoặc chỉ là không quan tâm đến tính thẩm mỹ.

20454
19:33:32,822 --> 19:33:34,572
Bạn có thể làm việc với\nnhà thiết kế, nghệ sĩ

20455
19:33:34,572 --> 19:33:37,741
ai giỏi hơn nhiều về\nnhững tinh chỉnh này về mặt thẩm mỹ.

20456
19:33:37,741 --> 19:33:41,921
Sẽ thật tuyệt nếu bạn có thể làm việc\n

20457
19:33:41,922 --> 19:33:43,982
Và bạn không cần phải\nbằng cách nào đó thích theo nghĩa đen

20458
19:33:43,982 --> 19:33:46,112
chỉnh sửa các dòng\nom mã giống nhau.

20459
19:33:46,111 --> 19:33:50,131
Chà, giống như chúng ta có thể di chuyển\nstuff vào các tệp tiêu đề trong C

20460
19:33:50,131 --> 19:33:53,895
hoặc các gói bằng Python, chúng ta\ncó thể làm điều tương tự trong CSS.

20461
19:33:53,895 --> 19:33:55,812
Vì vậy tôi thực sự sẽ\ntiếp tục và làm điều này.

20462
19:33:55,812 --> 19:33:58,382
Hãy để tôi loại bỏ tất cả\nnhững thuộc tính kiểu dáng này

20463
19:33:58,381 --> 19:34:03,842
và bây giờ hãy để tôi bắt đầu thực hành\n

20464
19:34:05,221 --> 19:34:10,051
Thay vào đó hãy để tôi chuyển nó vào\n

20465
19:34:11,611 --> 19:34:14,011
Đây là một trong những\nví dụ hiếm hoi có

20466
19:34:14,012 --> 19:34:16,862
là các thuộc tính có\ntên thẻ giống nhau và ngược lại.

20467
19:34:16,861 --> 19:34:19,441
Nó không phổ biến lắm,\nnhưng cái này có tồn tại.

20468
19:34:19,441 --> 19:34:22,891
Đây là một cú pháp hơi khác cho\n

20469
19:34:22,892 --> 19:34:26,912
Nếu tôi muốn áp dụng các thuộc tính CSS,\ntức là các cặp giá trị khóa

20470
19:34:26,911 --> 19:34:31,201
vào đầu trang, tôi nói\n

20471
19:34:31,202 --> 19:34:38,101
và bên trong những cái đó tôi nói\ncỡ chữ lớn, căn giữa ở giữa.

20472
19:34:38,101 --> 19:34:42,131
Sau đó, nếu tôi muốn áp dụng một số thuộc tính\n

20473
19:34:42,131 --> 19:34:47,072
Tôi lại đặt cỡ chữ, chẳng hạn như cỡ chữ,\n

20474
19:34:47,072 --> 19:34:49,622
Sau đó, cuối cùng, ở\nchân trang của trang, tôi

20475
19:34:49,622 --> 19:34:55,021
có thể gán một số thuộc tính như\n

20476
19:34:57,532 --> 19:35:00,442
Và tôi không phải làm gì thêm\nbất cứ điều gì trong HTML của mình.

20477
19:35:00,441 --> 19:35:03,871
Tất cả chỉ thể hiện\ncấu trúc trang của tôi.

20478
19:35:03,872 --> 19:35:06,313
Tuy nhiên, vì phong cách này\ngắn thẻ vào đầu trang

20479
19:35:06,313 --> 19:35:08,271
trình duyệt biết trước rằng thời điểm nó

20480
19:35:08,271 --> 19:35:10,851
gặp thẻ tiêu đề, thẻ\nchính hoặc thẻ chân trang

20481
19:35:10,851 --> 19:35:14,062
nó sẽ áp dụng những\nthuộc tính đó, những kiểu dáng đó.

20482
19:35:14,062 --> 19:35:17,032
Nếu tôi tải lại trang,\nngoài việc trang đó đang được cập nhật gần đây

20483
19:35:18,111 --> 19:35:21,171
Tất cả những gì chúng tôi đang làm là\n

20484
19:35:21,172 --> 19:35:24,322
Nhưng bây giờ mọi thứ đều ở trên cùng của tệp.

20485
19:35:24,322 --> 19:35:26,241
Nhưng vẫn còn một thiết kế tồi ở đây.

20486
19:35:26,241 --> 19:35:30,202
Bây giờ tôi có thể làm gì\nđể thông minh hơn?

20487
19:35:33,952 --> 19:35:35,932
LOA 1: Được rồi, hãy tạo một\ntệp mới chỉ bằng CSS.

20488
19:35:36,411 --> 19:35:37,828
Chúng ta hãy đến đó chỉ trong một giây.

20489
19:35:37,828 --> 19:35:40,161
Nhưng ngay cả khi chúng ta ở đây\nvẫn còn dư thừa

20490
19:35:40,161 --> 19:35:41,902
chúng ta có lẽ có thể sứt mẻ.

20491
19:35:41,902 --> 19:35:45,232
Vâng, hãy loại bỏ phần giữa căn chỉnh văn bản\n

20492
19:35:45,232 --> 19:35:47,601
có vẻ không cần thiết,\nvà có lẽ ai đó

20493
19:35:47,601 --> 19:35:53,991
nếu không, nếu tôi loại bỏ phần giữa căn chỉnh văn bản,\n

20494
19:35:53,991 --> 19:35:56,991
để mang nó trở lại, nhưng\n

20495
19:35:56,991 --> 19:35:59,822
Và trang này, nếu tôi cuộn\nxuống, sẽ trông như thế này, ở dạng HTML.

20496
19:36:01,282 --> 19:36:02,792
GIỌNG 1: Vâng, vậy thì thẻ body.

20497
19:36:02,792 --> 19:36:04,711
Vì vậy, hãy để tôi tiếp tục và nói cơ thể.

20498
19:36:04,711 --> 19:36:07,282
Và sau đó ở đây, đặt văn bản căn giữa.

20499
19:36:07,282 --> 19:36:10,282
Và bây giờ, nếu tôi tải lại\ntrang, sẽ không có hiệu ứng hình ảnh

20500
19:36:10,282 --> 19:36:12,142
nhưng nó tốt hơn\nthiết kế, bởi vì bây giờ tôi

20501
19:36:12,142 --> 19:36:14,242
đã tìm ra điểm chung đó.

20502
19:36:14,241 --> 19:36:16,521
Vì vậy, chỉ để làm rõ\nnhững gì chúng tôi đang làm ở đây

20503
19:36:16,521 --> 19:36:19,491
một lần nữa, đây đều là các thuộc tính CSS\n, các cặp giá trị khóa này.

20504
19:36:19,491 --> 19:36:22,461
Và có nhiều cách khác nhau để sử dụng chúng.

20505
19:36:22,461 --> 19:36:24,797
Và có toàn bộ phân loại này.

20506
19:36:24,797 --> 19:36:27,922
Những gì chúng tôi đã và đang làm cho đến nay\n

20507
19:36:27,922 --> 19:36:30,172
trong đó loại là tên của thẻ.

20508
19:36:30,172 --> 19:36:33,172
Và hóa ra là có\ncách khác để thực hiện việc này.

20509
19:36:33,172 --> 19:36:35,211
Và hãy đi theo hướng này.

20510
19:36:35,211 --> 19:36:38,782
Hãy tiếp tục và có thể viết\nCSS hơi khác một chút

20511
19:36:38,782 --> 19:36:40,282
bởi vì bạn biết điều gì sẽ tốt đẹp.

20512
19:36:40,282 --> 19:36:44,512
Tôi cá là sau ngày hôm nay, khi tôi bắt đầu\n

20513
19:36:44,512 --> 19:36:46,222
hoặc trang chủ của John Harvard\n, tôi có thể muốn

20514
19:36:46,221 --> 19:36:48,741
để có văn bản trung tâm trên các trang khác.

20515
19:36:48,741 --> 19:36:52,012
Và tôi có thể muốn có lớn\n

20516
19:36:52,012 --> 19:36:55,012
Sẽ thật tuyệt nếu tôi có thể tái sử dụng\nnhững thuộc tính này nhiều lần

20517
19:36:55,012 --> 19:36:57,292
và tạo thư viện\nown của tôi, thậm chí có thể

20518
19:36:57,292 --> 19:36:59,812
cuối cùng đặt nó\n vào một tập tin riêng biệt.

20519
19:37:00,562 --> 19:37:04,042
Thay vì áp dụng rõ ràng\ntext-align center cho phần thân

20520
19:37:04,042 --> 19:37:07,101
để tôi tạo một\ndanh từ hoặc tính từ mới

20521
19:37:07,101 --> 19:37:09,441
đúng hơn, đối với tôi, được gọi là trung tâm.

20522
19:37:09,441 --> 19:37:12,021
Nó phải bắt đầu bằng\ndot, bởi vì việc tôi đang làm

20523
19:37:12,021 --> 19:37:14,781
có thể nói là đang phát minh ra lớp học của riêng tôi.

20524
19:37:14,782 --> 19:37:17,662
Điều này không liên quan gì đến\nclasses trong Java hoặc Python.

20525
19:37:17,661 --> 19:37:20,271
Đẳng cấp ở đây chính là nét thẩm mỹ này.

20526
19:37:20,271 --> 19:37:22,971
Và thực ra, hãy để tôi đổi tên\nchúng thành dấu chấm lớn

20527
19:37:26,001 --> 19:37:29,931
Điều này giúp ích gì cho tôi\nis nó là việc phát minh ra những từ mới

20528
19:37:29,932 --> 19:37:33,232
những từ được đặt tên phù hợp mà bây giờ tôi\ncó thể sử dụng trong tệp này

20529
19:37:33,232 --> 19:37:36,211
hoặc có thể là trên các trang web\n khác mà tôi tạo, như sau.

20530
19:37:36,211 --> 19:37:39,322
Bây giờ tôi có thể nói, nếu tôi muốn\nđặt toàn bộ cơ thể vào giữa

20531
19:37:39,322 --> 19:37:41,631
Tôi có thể nói lớp học lấy trung tâm làm trung tâm.

20532
19:37:41,631 --> 19:37:45,171
Trên thẻ tiêu đề,\ntôi có thể nói lớp bằng lớn.

20533
19:37:45,172 --> 19:37:48,222
Trên thẻ chính,\ncó thể nói đẳng cấp là trung bình.

20534
19:37:48,221 --> 19:37:50,631
Trên thẻ chân trang,\ntôi có thể nói lớp bằng nhỏ.

20535
19:37:50,631 --> 19:37:53,391
Nhưng hãy để tôi tiến thêm một bước nữa.

20536
19:37:53,392 --> 19:37:56,212
Như bạn đã gợi ý, tại sao\ntôi không tiếp tục ngay bây giờ

20537
19:37:56,211 --> 19:37:59,452
và để tôi thực sự loại bỏ\nof-- để tôi lấy tất cả CSS

20538
19:38:01,312 --> 19:38:08,362
Hãy để tôi bỏ thẻ kiểu ở đây,\n

20539
19:38:08,361 --> 19:38:13,432
và để tôi lưu tất cả những thứ đó\n

20540
19:38:13,432 --> 19:38:15,622
không có gì khác, không có HTML gì cả.

20541
19:38:15,622 --> 19:38:18,801
Nhưng hãy để tôi quay lại trang\nHome.html của tôi và đây

20542
19:38:18,801 --> 19:38:21,951
là một trong những cái tên khó chịu nhất\n

20543
19:38:21,952 --> 19:38:30,052
nghĩa là nó làm gì, Liên kết HREF\nHome.css rel bằng biểu định kiểu.

20544
19:38:30,051 --> 19:38:33,292
Vì vậy, lý tưởng nhất là chúng ta nên sử dụng\n

20545
19:38:33,292 --> 19:38:36,112
nhưng đây là liên kết theo\nloại ý nghĩa khái niệm.

20546
19:38:36,111 --> 19:38:39,981
Chúng tôi đang liên kết tệp này với tệp khác\n

20547
19:38:39,982 --> 19:38:43,612
bằng cách sử dụng siêu tham chiếu\nHome.css này, mối quan hệ

20548
19:38:43,611 --> 19:38:46,281
của tệp đó vào tệp này\là tệp định kiểu.

20549
19:38:46,282 --> 19:38:48,472
Biểu định kiểu là một tệp\nchứa cả một nhóm

20550
19:38:48,471 --> 19:38:52,581
về cách điệu, cả đống thuộc tính, như chúng ta vừa làm.

20551
19:38:52,581 --> 19:38:54,621
Vì vậy, ở đây,\nhiệu ứng đó cũng rất kém.

20552
19:38:54,622 --> 19:38:57,002
Nếu tôi tải lại trang, không có gì thay đổi.

20553
19:38:57,001 --> 19:39:01,881
Nhưng bây giờ, tôi không chỉ có\na thiết kế tốt hơn ở đây

20554
19:39:01,881 --> 19:39:06,921
bởi vì bây giờ tôi có thể sử dụng những lớp tương tự\n

20555
19:39:06,922 --> 19:39:11,211
trang thứ ba, trang thứ tư, tiểu sử của tôi,\n

20556
19:39:11,211 --> 19:39:15,021
thực hiện trên trang web của tôi ở đây, tôi\ncó thể sử dụng lại những phong cách đó chỉ bằng cách

20557
19:39:15,021 --> 19:39:19,251
bao gồm một dòng mã, thay vì\n

20558
19:39:19,251 --> 19:39:21,841
nhét hết tập tin này đến tập tin khác.

20559
19:39:21,842 --> 19:39:24,322
Và chết tiệt, nếu phần còn lại\ncủa thế giới thực sự

20560
19:39:24,322 --> 19:39:28,197
bị ấn tượng bởi lớp học trung tâm của tôi, và\n

20561
19:39:28,197 --> 19:39:31,072
Tôi có thể gói cái này lại, để cái khác\n

20562
19:39:31,072 --> 19:39:35,482
và tôi có thư viện riêng, CSS của riêng tôi\n

20563
19:39:35,482 --> 19:39:37,881
Tại sao bạn lại phải phát minh ra\na lớp trung tâm

20564
19:39:37,881 --> 19:39:41,331
nếu tôi đã làm điều đó cho bạn rồi,\nngu ngốc và nhỏ bé như thế này.

20565
19:39:41,331 --> 19:39:43,191
Nhưng sẽ tốt hơn\nngay bây giờ nếu gói cái này lại

20566
19:39:43,191 --> 19:39:47,911
theo cách mà\nngười khác cũng có thể sử dụng được.

20567
19:39:47,911 --> 19:39:51,351
Vì vậy, đây có lẽ là\nthiết kế tốt nhất khi nói đến CSS.

20568
19:39:51,351 --> 19:39:56,601
Sử dụng các lớp nếu có thể, sử dụng\n

20569
19:39:56,601 --> 19:40:00,971
nhưng không sử dụng thuộc tính style\n

20570
19:40:00,971 --> 19:40:06,531
bắt đầu trở nên lộn xộn một cách nhanh chóng,\nđặc biệt đối với các tệp lớn.

20571
19:40:06,532 --> 19:40:08,617
Được rồi, có bất kỳ câu hỏi nào về vấn đề này.

20572
19:40:11,361 --> 19:40:13,731
Không, được rồi,\nđó là bộ chọn lớp.

20573
19:40:13,732 --> 19:40:16,131
Khi bạn chỉ định dấu chấm\nthứ gì đó, điều đó có nghĩa là

20574
19:40:16,131 --> 19:40:20,211
bạn đang chọn tất cả các thẻ trong\n

20575
19:40:20,211 --> 19:40:21,661
và áp dụng các tính chất đó.

20576
19:40:21,661 --> 19:40:23,828
Vì vậy, có một vài\nkhác ở đây, chỉ để cung cấp cho bạn

20577
19:40:23,828 --> 19:40:25,432
bây giờ nếm thử những gì có thể.

20578
19:40:25,432 --> 19:40:29,072
Còn rất nhiều điều khác mà bạn có thể\n

20579
19:40:29,072 --> 19:40:33,501
Hãy để tôi tiếp tục và mở ra một vài\n

20580
19:40:33,501 --> 19:40:35,391
Hãy để tôi tiếp tục và mở VS Code.

20581
19:40:35,392 --> 19:40:43,502
Và hãy để tôi tiếp tục và sao chép\nthư mục nguồn tám của tôi.

20582
19:40:43,501 --> 19:40:47,041
Hãy cho tôi một giây để lấy nguồn\n

20583
19:40:47,042 --> 19:40:51,872
để bây giờ tôi có thể truy cập\ntrình duyệt của mình, truy cập một số

20584
19:40:51,872 --> 19:40:53,822
trong số các ví dụ được tạo sẵn\nin nguồn tám

20585
19:40:53,822 --> 19:40:57,461
và để tôi mở ra đoạn một ở đây.

20586
19:40:57,461 --> 19:41:00,691
Vì vậy, đây là điều gì đó\nit hơi tinh tế một chút.

20587
19:41:00,691 --> 19:41:04,292
Nhưng có ai để ý\ncái này được cách điệu như thế nào không?

20588
19:41:04,292 --> 19:41:07,142
Đây chỉ là một số văn bản ipsum\nlorem chung chung.

20589
19:41:07,142 --> 19:41:12,972
Nhưng điều đáng chú ý\nvề mặt phong cách, một cuốn sách có thể làm được điều này.

20590
19:41:14,432 --> 19:41:15,932
GIỌNG 1: Vâng, đoạn\nđầu tiên lớn hơn một chút.

20591
19:41:16,322 --> 19:41:18,691
Ai biết được, đó chỉ là một phong cách\n

20592
19:41:18,691 --> 19:41:19,981
Đoạn đầu tiên lớn hơn.

20593
19:41:21,072 --> 19:41:23,562
Chà, thực ra chúng ta có thể khám phá\nđiều này theo một số cách.

20594
19:41:23,562 --> 19:41:26,101
Thứ nhất, rõ ràng là tôi có thể vào\nVS Code và cho bạn xem mã.

20595
19:41:26,101 --> 19:41:29,281
Tuy nhiên, hiện tại, chúng tôi đang sử dụng Chrome và\n

20596
19:41:30,572 --> 19:41:33,661
Xem nhà phát triển, công cụ dành cho nhà phát triển và bây giờ hãy chú ý

20597
19:41:33,661 --> 19:41:37,201
để tôi tắt tính năng dành cho thiết bị di động\n

20598
19:41:37,202 --> 19:41:39,752
xuống phía dưới,\nđể nó hoàn toàn rộng.

20599
19:41:39,751 --> 19:41:41,641
Chúng tôi đã xem xét tab Mạng trước đây.

20600
19:41:41,642 --> 19:41:44,072
Chúng tôi đã xem xét nút di động trước đây.

20601
19:41:44,072 --> 19:41:45,971
Bây giờ hãy để tôi nhấp vào Elements.

20602
19:41:45,971 --> 19:41:49,651
Tab Thành phần có gì thú vị\n

20603
19:41:49,652 --> 19:41:54,752
phiên bản HTML của trang web,\n

20604
19:41:54,751 --> 19:41:58,831
cho bạn, để từ nay về sau bạn có thể

20605
19:41:58,831 --> 19:42:02,461
mã nguồn HTML của bất kỳ trang web nào trên internet.

20606
19:42:02,461 --> 19:42:05,221
Lưu ý rằng trang web của riêng tôi\nở đây, nó không thú vị lắm.

20607
19:42:05,221 --> 19:42:08,072
Có rất nhiều đoạn\ntag của văn bản lorem ipsum.

20608
19:42:09,482 --> 19:42:12,452
Người đầu tiên, tôi đã đưa ID cho.

20609
19:42:12,452 --> 19:42:14,851
Đây là điều mà bạn,\na là một nhà thiết kế web, có thể làm.

20610
19:42:14,851 --> 19:42:18,452
Bạn có thể cung cấp thuộc tính ID\n cho bất kỳ thẻ nào trong một trang

20611
19:42:18,452 --> 19:42:20,222
để cung cấp cho nó một mã định danh duy nhất.

20612
19:42:20,221 --> 19:42:22,951
Trách nhiệm của bạn là không được\nsử dụng lại từ này ở bất kỳ nơi nào khác.

20613
19:42:22,952 --> 19:42:24,932
Nếu bạn sử dụng lại nó, bạn đã làm hỏng việc.

20614
19:42:26,402 --> 19:42:30,362
Nhưng tôi đã chọn ID\ntrước tiên, chỉ để tôi

20615
19:42:30,361 --> 19:42:34,271
có cách nào đó để đề cập đến\n

20616
19:42:34,271 --> 19:42:37,572
Nếu tôi nhìn vào phần đầu của trang\n và thẻ kiểu ở đây

20617
19:42:37,572 --> 19:42:40,292
lưu ý rằng tôi có hàm băm đầu tiên.

20618
19:42:40,292 --> 19:42:43,411
Vì vậy, giống như tôi sử dụng dấu chấm cho\nclasses, thế giới CSS

20619
19:42:43,411 --> 19:42:46,741
sử dụng ký hiệu băm để\nđại diện cho ID, ID duy nhất.

20620
19:42:46,741 --> 19:42:51,721
Và điều này cho trình duyệt biết điều gì,\n

20621
19:42:51,721 --> 19:42:57,182
F-I-R-S-T, không có hàm băm,\náp dụng cỡ chữ lớn hơn cho nó.

20622
19:42:57,182 --> 19:43:00,542
Và đó là lý do đoạn đầu tiên,\n

20623
19:43:01,952 --> 19:43:04,502
Nếu bây giờ tôi thực sự đi vào\nVS Code và để

20624
19:43:04,501 --> 19:43:06,121
tôi đi vào thư mục nguồn tám của tôi.

20625
19:43:06,122 --> 19:43:09,002
Hãy để tôi mở Paragraphs1.html.

20626
19:43:10,622 --> 19:43:14,521
Nếu tôi muốn thay đổi màu của nó\n

20627
19:43:14,521 --> 19:43:16,351
Tôi có thể làm màu dấu hai chấm: màu xanh lá cây.

20628
19:43:16,351 --> 19:43:19,861
Hãy để tôi đóng công cụ dành cho nhà phát triển, tải lại trang.

20629
19:43:19,861 --> 19:43:22,572
Và bây giờ trang đó cũng có màu xanh.

20630
19:43:22,572 --> 19:43:24,152
Bạn không cần phải chỉ sử dụng từ ngữ.

20631
19:43:27,271 --> 19:43:31,081
Mã hex cho màu xanh lá cây trong RGB là gì?

20632
19:43:31,081 --> 19:43:34,691
Giống như không có màu đỏ, nhiều màu xanh lá cây, không có màu xanh lam.

20633
19:43:34,691 --> 19:43:38,881
Vì vậy, bạn có thể thực hiện 00 FF 00, sử dụng hàm băm\na, thật trùng hợp

20634
19:43:38,881 --> 19:43:41,131
là cùng một biểu tượng nhưng không liên quan gì đến ID.

20635
19:43:41,131 --> 19:43:44,792
Đây chỉ là cách Photoshop và\ncác trang web thể hiện màu sắc.

20636
19:43:44,792 --> 19:43:46,050
Hãy quay lại đây và tải lại.

20637
19:43:46,050 --> 19:43:48,842
Nó giống nhau, mặc dù nó là một\n

20638
19:43:50,251 --> 19:43:56,131
Nếu tôi muốn đổi nó thành màu đỏ thì\n

20639
19:43:56,131 --> 19:43:58,081
và ở đây tôi có thể đi và tải lại.

20640
19:43:58,081 --> 19:43:59,932
Bây giờ là đoạn đầu tiên màu đỏ.

20641
19:43:59,932 --> 19:44:01,682
Việc này thực sự nhanh chóng trở nên\nkhá tẻ nhạt.

20642
19:44:01,682 --> 19:44:04,622
Giống như, nếu bạn là một nhà thiết kế web đang cố gắng\n

20643
19:44:04,622 --> 19:44:06,961
thực ra việc mày mò trên trang web có thể rất thú vị\n

20644
19:44:06,961 --> 19:44:09,422
trước khi bạn mở trình soạn thảo\nvà bạn bắt đầu thực hiện các thay đổi

20645
19:44:11,771 --> 19:44:14,611
Vì vậy, hãy chú ý những gì bạn có thể\nlàm với các công cụ dành cho nhà phát triển

20646
19:44:14,611 --> 19:44:16,591
cũng vậy, trong Chrome và các trình duyệt khác.

20647
19:44:16,592 --> 19:44:19,982
Khi tôi đánh dấu đoạn\nnày, trong tab Thành phần

20648
19:44:19,982 --> 19:44:22,502
Hãy chú ý rằng, một, nó được đánh dấu màu xanh lam.

20649
19:44:22,501 --> 19:44:24,714
Nếu tôi di chuyển con trỏ, nó\nsẽ không được đánh dấu.

20650
19:44:24,714 --> 19:44:26,131
Nếu tôi di chuyển nó, nó sẽ được đánh dấu.

20651
19:44:26,131 --> 19:44:29,641
Vì vậy, nó đang hiển thị cho tôi\nthẻ đó đại diện cho điều gì.

20652
19:44:29,642 --> 19:44:32,342
Nhưng hãy chú ý ở đây\nbên phải, bạn cũng có thể

20653
19:44:32,342 --> 19:44:35,938
xem tất cả các cách điệu\ncủa phần tử cụ thể đó.

20654
19:44:37,021 --> 19:44:40,561
Những chữ in nghiêng ở đây tại\n

20655
19:44:40,562 --> 19:44:44,772
Điều đó có nghĩa đây là thứ Google tạo ra\n

20656
19:44:44,771 --> 19:44:48,432
Nhưng ở dạng không in nghiêng\nở đây, bạn sẽ thấy hàm băm đầu tiên

20657
19:44:48,432 --> 19:44:50,441
đó là mã của tôi, tôi vừa thay đổi.

20658
19:44:50,441 --> 19:44:55,981
Và nếu tôi muốn bắt đầu mày mò\n

20659
19:44:57,211 --> 19:45:02,101
Nhưng để ý, nếu tôi quay lại VS Code, tôi\n

20660
19:45:02,101 --> 19:45:04,141
Bây giờ đây hoàn toàn là phía khách hàng.

20661
19:45:05,221 --> 19:45:08,281
Khi tôi vẽ bức tranh đó\gần trình duyệt hơn

20662
19:45:08,282 --> 19:45:11,252
đưa ra yêu cầu tới đám mây,\n

20663
19:45:11,251 --> 19:45:14,491
sắp quay trở lại, trình duyệt,\nmáy Mac, PC, điện thoại của bạn

20664
19:45:14,491 --> 19:45:18,641
có một bản sao của tất cả HTML và\nCSS, vì vậy bạn có thể thay đổi nó tại đây

20665
19:45:20,664 --> 19:45:22,831
Và, chẳng hạn, bạn có thể\nthực hiện việc này với bất kỳ trang web nào.

20666
19:45:22,831 --> 19:45:29,011
Hãy cùng bắt đầu một chuyến đi thực địa\nở đây, đến Stanford.edu.

20667
19:45:29,012 --> 19:45:31,771
Đây là\ntrang web của Stanford tính đến ngày hôm nay.

20668
19:45:31,771 --> 19:45:34,141
Hãy tiếp tục ở đây\nvà xem nào, có

20669
19:45:34,142 --> 19:45:36,642
trang tuyển sinh của họ,\ncuộc sống trong khuôn viên trường, v.v.

20670
19:45:36,642 --> 19:45:41,282
Hãy để tôi tiếp tục và xem các công cụ dành cho nhà phát triển trên trang của Stanford

20671
19:45:41,282 --> 19:45:45,242
các công cụ, phần tử dành cho nhà phát triển\nbạn có thể xem tất cả HTML của họ.

20672
19:45:45,241 --> 19:45:48,221
Và lưu ý rằng nó đã bị thu gọn,\nvì vậy đây là tiêu đề của họ.

20673
19:45:48,221 --> 19:45:51,121
Đây là phần chính của chúng và\nTôi đang sử dụng phím tắt

20674
19:45:51,122 --> 19:45:54,203
chỉ cần mở và đóng các thẻ\nđể tìm hiểu sâu hơn.

20675
19:45:54,203 --> 19:45:56,161
Giả sử bạn muốn gây rối với Stanford

20676
19:45:56,161 --> 19:45:58,861
bạn thực sự có thể thích\nnhấp chuột phải vào bất kỳ thành phần nào của trang

20677
19:45:58,861 --> 19:46:03,121
hoặc nhấp chuột điều khiển, Kiểm tra và đó là\n

20678
19:46:03,122 --> 19:46:07,062
vào thẻ trong tab Thành phần\n hiển thị cho bạn liên kết đó.

20679
19:46:07,062 --> 19:46:11,882
Và để ý, nếu tôi di chuột qua đây\n

20680
19:46:11,881 --> 19:46:13,921
như một danh sách không có thứ tự từ trái sang phải.

20681
19:46:13,922 --> 19:46:16,255
Nhưng nó không nhất thiết phải là một\ndanh sách có dấu đầu dòng từ trên xuống dưới.

20682
19:46:16,255 --> 19:46:20,202
Họ đã sử dụng CSS để thay đổi nó thành\n

20683
19:46:20,202 --> 19:46:22,862
nghiên cứu, chăm sóc sức khỏe,\nnhập học tại trường, về.

20684
19:46:22,861 --> 19:46:25,691
Chà, có quá nhiều\nsự thừa nhận, thế là hết.

20685
19:46:25,691 --> 19:46:29,911
Vì vậy bây giờ, nếu tôi đóng công cụ dành cho nhà phát triển,\n

20686
19:46:29,911 --> 19:46:32,971
Nhưng, tất nhiên, tôi thực sự đã làm gì.

20687
19:46:32,971 --> 19:46:35,404
Tôi vừa mới biến đổi\nbản sao cục bộ của chính mình.

20688
19:46:35,404 --> 19:46:37,322
Vậy đây không phải là hack,\mặc dù điều này có thể

20689
19:46:37,322 --> 19:46:38,947
hãy xem cách họ làm điều đó trên TV và phim ảnh.

20690
19:46:38,947 --> 19:46:40,691
Nó vẫn ở đó nếu tôi tải lại trang.

20691
19:46:40,691 --> 19:46:44,601
Nhưng đó là một cách cực kỳ mạnh mẽ\n

20692
19:46:44,601 --> 19:46:46,351
những thứ khác nhau\nvề mặt phong cách, hãy tìm ra

20693
19:46:46,351 --> 19:46:48,902
bạn muốn thiết kế\nthứ gì đó như thế nào và thứ hai, chỉ cần tìm hiểu

20694
19:46:50,381 --> 19:46:53,339
Vì vậy, ví dụ, nếu tôi nhấp chuột phải\n

20695
19:46:53,339 --> 19:46:56,831
đi kiểm tra và để tôi vào thẻ LI.

20696
19:46:56,831 --> 19:47:00,211
Hãy để tôi tiếp tục đi lên, lên,\nlên, lên tới thẻ UL.

20697
19:47:00,211 --> 19:47:02,322
Sẽ có nhiều chuyện xảy ra ở đây.

20698
19:47:02,322 --> 19:47:06,271
Nhưng hãy chú ý, họ đã áp dụng\ntất cả các thuộc tính CSS này

20699
19:47:08,702 --> 19:47:11,912
Nhưng hãy chú ý, đây,\nthế nào, nó giống như thế này.

20700
19:47:11,911 --> 19:47:15,872
Và chúng ta sẽ phải đọc thêm để tìm hiểu\n

20701
19:47:15,872 --> 19:47:18,122
đây có lẽ là cách họ đã thoát khỏi đạn.

20702
19:47:18,122 --> 19:47:19,682
Và những gì bạn có thể làm chỉ là mày mò.

20703
19:47:19,682 --> 19:47:21,389
Giống như, được rồi,\ncái này có tác dụng gì?

20704
19:47:22,771 --> 19:47:26,101
Được rồi, thực sự không thay đổi\n

20705
19:47:26,922 --> 19:47:30,572
Vì vậy bây giờ lề đã được thay đổi,\nphần đệm xung quanh nó cũng đã thay đổi.

20706
19:47:31,801 --> 19:47:34,081
Chúng ta có thể bắt đầu bật và tắt mọi thứ, chỉ cần

20707
19:47:34,081 --> 19:47:35,792
để hiểu cách\ntrang web hoạt động.

20708
19:47:35,792 --> 19:47:37,831
Cho đến nay tôi chưa thực sự học được điều gì\nbất cứ điều gì ở đây.

20709
19:47:37,831 --> 19:47:43,801
Hãy để tôi đến LI ở đây, hãy\n

20710
19:47:47,432 --> 19:47:50,229
Vì vậy, khi có thuộc tính\ndisplay trong CSS

20711
19:47:50,229 --> 19:47:53,312
điều đó dường như đang thay đổi một cách hiệu quả\n

20712
19:47:53,312 --> 19:47:56,491
nếu tôi tắt nó đi thì bây giờ các liên kết\ncủa Stanford đều trông như thế này.

20713
19:47:56,491 --> 19:47:57,721
Và có những viên đạn đó.

20714
19:47:57,721 --> 19:48:00,841
Vì vậy, một lần nữa, chỉ là các kiểu mặc định,\nmà chúng đã bị ghi đè bằng cách nào đó

20715
19:48:00,842 --> 19:48:03,782
và một nhà thiết kế web giỏi\ncuối cùng cũng biết

20716
19:48:03,782 --> 19:48:06,500
làm thế nào để làm những việc này.

20717
19:48:06,500 --> 19:48:08,792
Được rồi, một vài\nkhối xây dựng cuối cùng thì sao

20718
19:48:08,792 --> 19:48:09,991
trước khi chúng ta nghỉ thêm một lát nữa.

20719
19:48:09,991 --> 19:48:12,616
Và sau đó chúng ta sẽ đi sâu vào\nJavaScript để thao tác với nội dung này

20720
19:48:13,771 --> 19:48:17,432
Hãy để tôi tiếp tục và mở ra,\ncòn Đoạn 2 ở đây thì sao.

20721
19:48:17,432 --> 19:48:21,631
Hãy để tôi đóng tab này, để tôi đi\n

20722
19:48:21,631 --> 19:48:25,051
Và cái này trông\ngiống nhau, ngoại trừ, khi

20723
19:48:25,051 --> 19:48:27,661
Tôi tiếp tục và kiểm tra\nđoạn đầu tiên này

20724
19:48:27,661 --> 19:48:29,822
nhận thấy rằng tôi đã có thể\nloại bỏ ID

20725
19:48:29,822 --> 19:48:32,202
bằng cách nào đó, có nghĩa là\ncó thể nói rằng, có rất nhiều

20726
19:48:32,202 --> 19:48:34,562
nhiều cách để giải quyết\nvấn đề trong HTML và CSS

20727
19:48:34,562 --> 19:48:36,422
giống như có trong C và Python.

20728
19:48:36,422 --> 19:48:39,422
Hãy để tôi xem phần đầu và\nphong cách của trang bây giờ.

20729
19:48:39,422 --> 19:48:45,812
Đây là cái mà chúng ta có thể gọi là\nanloại bộ chọn khác

20730
19:48:45,812 --> 19:48:49,382
cho phép chúng tôi chỉ định\nthẻ đoạn văn

20731
19:48:49,381 --> 19:48:52,111
điều đó chỉ xảy ra với\ncon đầu lòng.

20732
19:48:52,111 --> 19:48:56,001
Vì vậy bạn có thể áp dụng CSS cho rất\n

20733
19:48:56,001 --> 19:48:58,686
Ngoài ra còn có cú pháp cho\ncon cuối cùng, nếu chỉ là con đầu tiên

20734
19:48:58,687 --> 19:49:00,312
được cho là trông hơi khác một chút.

20735
19:49:00,312 --> 19:49:02,432
Vì vậy, ở đây, tôi vừa\ngưng việc kinh doanh

20736
19:49:02,432 --> 19:49:05,282
tạo ra\nđịnh danh duy nhất của riêng tôi và thay vào đó, tôi

20737
19:49:05,282 --> 19:49:08,142
cũng sử dụng loại bộ chọn này.

20738
19:49:09,282 --> 19:49:14,072
Hãy để tôi đi vào một ví dụ khác\ntại đây, tên là Link1.html

20739
19:49:14,072 --> 19:49:17,411
và ở đây chúng ta có một cách rất đơn giản\n

20740
19:49:17,411 --> 19:49:19,411
Nhưng hãy lưu ý rằng nó có màu tím\ntheo mặc định, vì chúng tôi đã

20741
19:49:21,271 --> 19:49:24,331
Hãy xem liệu chúng ta có thể\ncách điệu hóa các liên kết của Harvard không

20742
19:49:25,812 --> 19:49:30,702
Bây giờ hãy để tôi đi vào Phiên bản liên kết\n2 trông như thế này.

20743
19:49:30,702 --> 19:49:33,012
Và bây giờ Harvard rất đỏ.

20744
19:49:33,971 --> 19:49:36,451
Được rồi, để tôi nhấp chuột phải\không vào nó, nhấp vào Kiểm tra

20745
19:49:36,452 --> 19:49:37,952
và tôi có thể bắt đầu lục lọi xung quanh.

20746
19:49:37,952 --> 19:49:40,381
Có vẻ như HTML của tôi\nkhông đáng chú ý chút nào.

20747
19:49:40,381 --> 19:49:43,952
Đó chỉ là HTML rất đơn giản, thẻ\nanchor có HREF.

20748
19:49:46,629 --> 19:49:48,461
Và chúng ta có thể xem xét nó\n theo hai cách khác nhau.

20749
19:49:48,461 --> 19:49:51,422
Theo nghĩa đen, chúng ta có thể nhìn vào\nphong cách, nội dung ở đây

20750
19:49:51,422 --> 19:49:55,472
hoặc chúng ta có thể xem\nphiên bản đẹp mắt của Chrome ở đây.

20751
19:49:55,471 --> 19:49:59,521
Nó trông giống như biểu định kiểu\ncủa tôi, trong thẻ kiểu

20752
19:49:59,521 --> 19:50:04,001
đã thay đổi màu thành màu đỏ và\n

20753
19:50:04,001 --> 19:50:06,121
nhưng đó là một thuộc tính CSS khác, không có thuộc tính nào.

20754
19:50:06,122 --> 19:50:08,911
Lưu ý, nếu tôi tắt\ntắt các liên kết trên internet

20755
19:50:08,911 --> 19:50:10,831
được gạch chân theo mặc định\n, có xu hướng

20756
19:50:10,831 --> 19:50:13,591
tốt cho sự quen thuộc, cho\nkhả năng hiển thị, cho khả năng tiếp cận.

20757
19:50:13,592 --> 19:50:18,152
Tuy nhiên, nếu nó rất rõ ràng thì văn bản và liên kết là gì

20758
19:50:18,152 --> 19:50:21,062
có thể bạn thay đổi văn bản\ntrang trí thành không.

20759
19:50:21,062 --> 19:50:25,142
Nhưng có lẽ, hãy xem này, có thể\nliên kết đến, dòng quay lại

20760
19:50:26,611 --> 19:50:29,161
Nào, hãy xem\ntôi đã làm điều này một cách phong cách như thế nào.

20761
19:50:29,161 --> 19:50:34,111
Lưu ý rằng tôi có cách điệu, và tôi\n

20762
19:50:34,111 --> 19:50:36,572
ở đây, như có xu hướng quy ước trong CSS.

20763
19:50:36,572 --> 19:50:38,581
Màu sắc là màu đỏ, không có trang trí văn bản.

20764
19:50:38,581 --> 19:50:42,961
Tuy nhiên, bất cứ khi nào một thẻ neo\nđược di chuột qua

20765
19:50:42,961 --> 19:50:47,881
bạn có thể thay đổi cách trang trí văn bản\n

20766
19:50:47,881 --> 19:50:51,251
Vì vậy, một lần nữa, chỉ có những cách chơi nhỏ\n

20767
19:50:51,251 --> 19:50:52,831
một khi bạn hiểu\nđiều đó, thực sự, có

20768
19:50:52,831 --> 19:50:54,091
chỉ là các loại bộ chọn khác nhau.

20769
19:50:54,092 --> 19:50:56,131
Và bạn có thể phải nhắc nhở\n

20770
19:50:57,361 --> 19:51:02,551
Nhưng đó chỉ là một cách xác định phạm vi khác\n

20771
19:51:02,551 --> 19:51:06,451
Hãy xem phiên bản 3 của cái này\n

20772
19:51:06,452 --> 19:51:11,702
Nếu tôi vào Link3.html, có lẽ tôi\nmuốn có liên kết Harvard màu đỏ

20773
19:51:14,471 --> 19:51:17,011
Vâng, hãy nhấp chuột phải,\nvà nhấp vào Kiểm tra.

20774
19:51:17,012 --> 19:51:21,872
Và ở đây chúng ta có thể có hai liên kết,\nvới một vài kỹ thuật

20775
19:51:21,872 --> 19:51:24,631
chỉ để, một lần nữa, nhấn mạnh, bạn có thể\n

20776
19:51:24,631 --> 19:51:30,061
Tôi đã cung cấp cho liên kết Harvard của mình ID\n

20777
19:51:30,062 --> 19:51:34,802
Trong CSS của tôi, nếu chúng ta đi tới phần đầu\ncủa trang, thì tôi đã làm điều này.

20778
19:51:34,801 --> 19:51:37,441
Thẻ có ID Harvard, a.k.a.

20779
19:51:37,441 --> 19:51:41,671


20780
19:51:41,672 --> 19:51:45,572
và sau đó mọi thẻ neo\nkhông được trang trí văn bản

20781
19:51:45,572 --> 19:51:48,721
trừ khi bạn di chuột qua nó, lúc đó\n

20782
19:51:48,721 --> 19:51:52,231
Và vì vậy, nếu tôi di chuột qua Harvard,\nit sẽ được gạch chân màu đỏ, Yale

20783
19:51:53,262 --> 19:51:56,262
Nếu tôi muốn loại bỏ ID, tôi\n

20784
19:51:57,542 --> 19:52:00,601
Hiệu ứng tương tự, nhưng hãy lưu ý,\nBây giờ tôi đã loại bỏ ID.

20785
19:52:00,601 --> 19:52:02,281
Tôi có thể thể hiện bản thân bằng cách nào khác?

20786
19:52:02,282 --> 19:52:03,992
Chà, hãy nhìn vào CSS ở đây.

20787
19:52:03,991 --> 19:52:06,512
Thẻ neo không có văn bản\ntrang trí theo mặc định

20788
19:52:06,512 --> 19:52:08,051
trừ khi bạn đang di chuột qua nó.

20789
19:52:09,461 --> 19:52:11,881
Đây là tên chúng tôi\ngọi, trong danh sách của chúng tôi ở đây

20790
19:52:11,881 --> 19:52:16,801
một bộ chọn thuộc tính, trong đó bạn\nchọn các thẻ bằng cách sử dụng ký hiệu CSS

20791
19:52:18,372 --> 19:52:21,692
Vì vậy, điều này có nghĩa là hãy tiếp tục\nvà tìm bất kỳ thẻ liên kết nào

20792
19:52:21,691 --> 19:52:26,341
Giá trị HREF của ai sẽ\nbằng URL này và làm cho nó có màu đỏ.

20793
19:52:26,342 --> 19:52:28,327
Làm tương tự với Yale và làm cho nó có màu xanh lam.

20794
19:52:28,327 --> 19:52:31,452
Bây giờ, điều này có thể không lý tưởng, bởi vì\n

20795
19:52:31,452 --> 19:52:33,601
những dấu bằng này không có tác dụng\nvì nếu nó

20796
19:52:33,601 --> 19:52:37,202
một Harvard khác hoặc một Yale khác\n

20797
19:52:37,202 --> 19:52:40,412
Vì vậy, hãy để tôi xem phiên bản\n5 ở đây của Link.html.

20798
19:52:40,411 --> 19:52:43,951
Hãy nhìn vào phong cách này và tôi đã làm nó thông minh hơn một chút.

20799
19:52:44,941 --> 19:52:46,951
Và, một lần nữa, chỉ là thứ\nthứ mà bạn tra cứu.

20800
19:52:46,952 --> 19:52:54,542
Ngôi sao bằng phương tiện, hãy thay đổi bất kỳ điểm neo nào\n

20801
19:52:54,542 --> 19:52:59,551
Harvard.edu sang màu đỏ và thực hiện tương tự\n

20802
19:52:59,551 --> 19:53:01,141
Vì vậy, dấu sao ở đây có nghĩa là ký tự đại diện.

20803
19:53:01,142 --> 19:53:04,652
Vì vậy hãy tìm kiếm Harvard.edu hoặc\nYale.edu ở bất kỳ đâu trong HREF

20804
19:53:04,652 --> 19:53:07,652
và nếu nó ở đó, hãy tô màu cho liên kết.

20805
19:53:07,652 --> 19:53:11,732
Và một lần nữa, chúng ta có thể làm tất cả những điều này\n

20806
19:53:11,732 --> 19:53:15,012
để thực sự đạt được điều tương tự\n

20807
19:53:15,012 --> 19:53:17,115
Và khi các dự án\ngngày càng lớn hơn

20808
19:53:17,115 --> 19:53:19,032
bạn chỉ có ngày càng nhiều quyết định hơn để đưa ra.

20809
19:53:19,032 --> 19:53:21,752
Và do đó, bạn có\nnhững quy ước nhất định mà bạn bắt đầu áp dụng.

20810
19:53:21,751 --> 19:53:25,171
Và, thực sự, nếu tôi có thể,\nbạn có phần giới thiệu

20811
19:53:25,172 --> 19:53:28,142
cuối cùng của cái được gọi là\nframeworks.

20812
19:53:28,142 --> 19:53:30,512
Nếu bạn là nhà phát triển\nweb toàn thời gian hoặc bạn

20813
19:53:30,512 --> 19:53:33,889
làm việc cho một công ty làm công việc tương tự,\n

20814
19:53:34,682 --> 19:53:38,372
Ví dụ: công ty có thể nói,\n

20815
19:53:38,372 --> 19:53:41,222
Hoặc luôn sử dụng thuộc tính\nselectors hoặc không sử dụng thuộc tính này.

20816
19:53:41,221 --> 19:53:44,221
Và nó không nhất thiết phải hà khắc như thế.

20817
19:53:44,221 --> 19:53:46,471
Nhưng họ có thể có một số loại hướng dẫn về phong cách.

20818
19:53:46,471 --> 19:53:49,441
Tuy nhiên, điều mà nhiều người và\nnhiều công ty ngày nay làm

20819
19:53:49,441 --> 19:53:53,402
là họ không nghĩ ra được tất cả\nthuộc tính CSS của riêng mình.

20820
19:53:53,402 --> 19:53:57,241
Họ bắt đầu với thứ gì đó có sẵn,\n

20821
19:53:57,241 --> 19:54:00,781
khung nguồn, điều đó chỉ mang lại\n

20822
19:54:00,782 --> 19:54:04,172
miễn phí chỉ bằng cách sử dụng\na thư viện của bên thứ ba.

20823
19:54:04,172 --> 19:54:05,912
Và một trong những cái\nphổ biến nhất hiện nay

20824
19:54:05,911 --> 19:54:07,861
là thứ được gọi là\nBootstrap, mà CS50 sử dụng

20825
19:54:07,861 --> 19:54:11,161
trên tất cả các trang web của nó,\ncũng cực kỳ phổ biến trong ngành.

20826
19:54:11,161 --> 19:54:17,161
Nó ở getbootstrap.com và cái này\n

20827
19:54:17,161 --> 19:54:20,611
một trang web cung cấp tài liệu\nthư viện mà họ cung cấp.

20828
19:54:20,611 --> 19:54:24,751
Và có rất nhiều tài liệu ở đây,\n

20829
19:54:26,521 --> 19:54:30,122
Nó chỉ cung cấp cho bạn, sẵn\n, CSS mà bạn sử dụng

20830
19:54:31,322 --> 19:54:33,392
Nếu bạn đã từng để ý đến trang web của CS50

20831
19:54:33,392 --> 19:54:36,002
những cảnh báo nhỏ đầy màu sắc ở\nđầu trang hoặc gọi

20832
19:54:36,001 --> 19:54:37,861
bên ngoài, để thu hút sự chú ý của bạn đến mọi thứ.

20833
19:54:38,851 --> 19:54:41,491
Đó có thể là một thẻ đoạn\ntag hoặc thẻ div

20834
19:54:41,491 --> 19:54:43,111
và có lẽ chúng tôi đã thay đổi màu phông chữ.

20835
19:54:43,111 --> 19:54:44,731
Chúng tôi đã thay đổi màu nền.

20836
19:54:44,732 --> 19:54:47,282
Hoặc có rất nhiều thứ chúng ta\nhoàn toàn có thể làm từ đầu

20837
19:54:47,282 --> 19:54:49,747
nhưng, bạn biết không,\ntại sao chúng ta lại phát minh lại

20838
19:54:49,747 --> 19:54:51,372
bánh xe nếu chúng ta có thể sử dụng Bootstrap.

20839
19:54:51,372 --> 19:54:53,252
Vì vậy, chẳng hạn, hãy để\ntôi cuộn xuống.

20840
19:54:53,251 --> 19:54:57,851
Nếu bạn đã từng xem trên trang web của CS50\n

20841
19:54:57,851 --> 19:55:00,542
hãy để tôi phóng to cái này.

20842
19:55:00,542 --> 19:55:03,271
Chúng tôi chỉ đang sử dụng HTML như thế này.

20843
19:55:03,271 --> 19:55:06,241
Chúng tôi đang sử dụng thẻ div,\nmột lần nữa, thẻ này là một bộ phận vô hình

20844
19:55:06,241 --> 19:55:07,812
một vùng hình chữ nhật của trang.

20845
19:55:07,812 --> 19:55:12,812
Nhưng chúng tôi đang sử dụng các lớp có tên là cảnh báo\n

20846
19:55:12,812 --> 19:55:17,461
Đó là những lớp do\nngười ở Bootstrap phát minh ra.

20847
19:55:17,461 --> 19:55:19,982
Họ liên kết một số màu văn bản và nền nhất định

20848
19:55:19,982 --> 19:55:23,042
màu sắc, phần đệm và lề\nand giống như các tính thẩm mỹ khác với

20849
19:55:23,042 --> 19:55:25,411
vì vậy tất cả những gì chúng ta phải làm\là sử dụng các lớp đó.

20850
19:55:25,411 --> 19:55:28,441
Vai trò tương đương với cảnh giác, chỉ cần làm rõ\n

20851
19:55:28,441 --> 19:55:30,512
là một cảnh báo,\ncó lẽ nên đọc

20852
19:55:30,512 --> 19:55:33,601
và bất cứ thứ gì ở giữa\nthẻ mở và thẻ đóng

20853
19:55:33,601 --> 19:55:35,312
là những gì con người sẽ nhìn thấy.

20854
19:55:35,312 --> 19:55:37,262
Làm thế nào để bạn sử dụng một cái gì đó như Bootstrap?

20855
19:55:37,262 --> 19:55:39,032
Vâng, bạn chỉ cần đọc tài liệu.

20856
19:55:39,032 --> 19:55:44,272
Trong phần Bắt đầu, có\n

20857
19:55:45,232 --> 19:55:49,312
Vì vậy, trong Table.html, chúng tôi có mã như thế này.

20858
19:55:49,312 --> 19:55:52,182
Hãy để tôi thực sự đọc tài liệu\ncủa Bootstrap thật nhanh.

20859
19:55:55,542 --> 19:55:57,551
Tôi sẽ đặt cái này\nvào đầu trang của tôi.

20860
19:55:57,551 --> 19:55:59,981
Và nó khá dài, nhưng\nđể ý, đó là một thẻ liên kết

20861
19:55:59,982 --> 19:56:03,851
mà tôi đã sử dụng trước đó cho tệp CSS\nown của mình, trong đó có HREF

20862
19:56:03,851 --> 19:56:06,491
đây có phải là liên kết CDN, mạng phân phối nội dung\n, đó là

20863
19:56:06,491 --> 19:56:09,732
đề cập đến một phiên bản cụ thể của\n

20864
19:56:09,732 --> 19:56:13,752
Và tệp mà tôi đang đưa vào\nis có tên là Bootstrap.min.css.

20865
19:56:13,751 --> 19:56:17,291
Đây là một tập tin thực sự mà tôi\ncó thể truy cập bằng trình duyệt của mình.

20866
19:56:17,292 --> 19:56:20,622
Nếu tôi mở cái này trong một\ntab riêng thì đây là CSS

20867
19:56:20,622 --> 19:56:23,532
Bootstrap đã cung cấp\nmiễn phí cho chúng tôi.

20868
19:56:25,221 --> 19:56:27,221
Đó là vì nó đã được\ntối giản hóa, chỉ để không

20869
19:56:27,221 --> 19:56:29,771
lãng phí không gian bằng cách thêm nhiều\nkhoảng trắng và nhận xét.

20870
19:56:29,771 --> 19:56:33,221
Nhưng cái này chứa rất nhiều\nhăm thuộc tính CSS

20871
19:56:33,221 --> 19:56:36,851
mà chúng ta có thể tái sử dụng nhờ\ncác lớp mà họ đã phát minh ra.

20872
19:56:36,851 --> 19:56:40,285
Nếu tôi muốn sử dụng một ít JavaScript\n

20873
19:56:40,285 --> 19:56:41,952
Nhưng chúng ta sẽ quay lại vấn đề đó sớm thôi.

20874
19:56:41,952 --> 19:56:45,522
Bây giờ hãy để tôi thực hiện một vài điều chỉnh cho bảng này.

20875
19:56:45,521 --> 19:56:48,551
Nếu tôi truy cập vào trình duyệt của mình\ntừ trước, điều này

20876
19:56:48,551 --> 19:56:51,461
trông giống như trước đây,\nnơi có tên và số

20877
19:56:51,461 --> 19:56:54,086
đậm nhưng ở giữa, sau đó\nCarter và David ở bên trái

20878
19:56:54,086 --> 19:56:55,504
và những con số ở bên phải.

20879
19:56:56,202 --> 19:56:59,662
Nó không đẹp lắm nhưng sẽ rất tuyệt\n

20880
19:56:59,661 --> 19:57:03,101
Vì vậy, nếu chúng ta thêm Bootstrap vào nó,\nhãy chú ý một điều sẽ xảy ra trước tiên

20881
19:57:04,872 --> 19:57:08,262
Các kiểu\nmặc định của Chrome không còn được sử dụng nữa.

20882
19:57:08,262 --> 19:57:10,482
Bây giờ các kiểu\nmặc định của Bootstrap đã được sử dụng,

20883
19:57:10,482 --> 19:57:14,112
là một cách để thực thi sự tương đồng\trên Chrome, Edge, Firefox

20884
19:57:15,461 --> 19:57:18,042
Lưu ý rằng nó đã chuyển từ phông chữ\nserif sang sans serif

20885
19:57:18,042 --> 19:57:19,792
phông chữ và thứ gì đó sạch sẽ hơn như thế này.

20886
19:57:19,792 --> 19:57:24,221
Nó trông vẫn khá xấu, nhưng hãy\n

20887
19:57:24,221 --> 19:57:30,311
Hãy để tôi đi vào tab\nnội dung của họ để tìm bảng.

20888
19:57:30,312 --> 19:57:32,532
Và nếu tôi\nbắt đầu đọc lướt cái này

20889
19:57:32,532 --> 19:57:34,392
đây là một số bàn\nđẹp, phải không?

20890
19:57:34,392 --> 19:57:38,442
Giống như có một số gạch chân\nở đây, một số phông chữ đậm hơn.

20891
19:57:39,672 --> 19:57:41,790
Nếu tôi tiếp tục, ồ,\nđiều đó cũng sẽ trở nên đẹp đẽ hơn

20892
19:57:41,789 --> 19:57:44,831
nếu tôi muốn có một cái bàn đầy màu sắc,\n

20893
19:57:44,831 --> 19:57:47,981
tự mình ra ngoài nếu tôi muốn\nmột chế độ tối nào đó ở đây

20894
19:57:47,982 --> 19:57:51,472
nếu tôi muốn xen kẽ các điểm nổi bật, v.v.

20895
19:57:51,471 --> 19:57:54,491
Có rất nhiều cách điệu khác nhau\n

20896
19:57:54,491 --> 19:57:58,211
Nhưng tôi quan tâm đến việc tạo một danh bạ điện thoại,\n

20897
19:57:58,211 --> 19:58:02,982
Vì vậy, nếu tôi đọc kỹ tài liệu,\n

20898
19:58:02,982 --> 19:58:06,881
là thêm bảng\nclass của Bootstrap vào thẻ bảng của tôi

20899
19:58:06,881 --> 19:58:11,592
và xem bằng cách tải lại đơn giản, cái gì\n

20900
19:58:13,331 --> 19:58:16,391
Có thể đó không phải là điều bạn muốn, nhưng,\n của tôi

20901
19:58:16,392 --> 19:58:18,262
Tôi chỉ thực sự làm đẹp mọi thứ lên.

20902
19:58:18,262 --> 19:58:21,112
Và đây là giá trị của\n

20903
19:58:21,111 --> 19:58:27,311
Nó cho phép bạn thực sự\ntạo ra những thứ đẹp hơn, nhiều hơn nữa

20904
19:58:27,312 --> 19:58:32,232
trang web thân thiện với người dùng hơn bạn có thể\n

20905
19:58:34,211 --> 19:58:37,842
Trên thực tế, hãy lặp lại một\nthêm một ví dụ khác

20906
19:58:37,842 --> 19:58:39,862
trước khi chúng tôi giới thiệu một chút về mã đó.

20907
19:58:39,861 --> 19:58:44,691
Hãy để tôi tiếp tục và mở\nup Search.html từ trước

20908
19:58:44,691 --> 19:58:49,331
mà, nhớ lại, trông như thế này,\nand Search.html trên trình duyệt của tôi

20909
19:58:49,331 --> 19:58:52,511
đây là tìm kiếm Google rất đơn giản.

20910
19:58:52,512 --> 19:58:56,801
Và giả sử tôi muốn phát minh lại\ngiao diện người dùng của Google.com thêm một chút nữa.

20911
19:58:56,801 --> 19:58:59,711
Đây là ảnh chụp màn hình\nGoogle.com vào một ngày thông thường.

20912
19:58:59,711 --> 19:59:03,581
Nó có một liên kết giới thiệu, một cửa hàng\n

20913
19:59:05,360 --> 19:59:07,152
Nó hiển thị không ổn\trên màn hình ở đây

20914
19:59:07,152 --> 19:59:09,851
nhưng có một hộp văn bản lớn ở\nở giữa và sau đó là hai nút

20915
19:59:09,851 --> 19:59:12,131
Tìm kiếm trên Google và tôi cảm thấy may mắn.

20916
19:59:12,131 --> 19:59:15,851
Chà, tôi có thể tự mình tiến hành\thực hiện giao diện người dùng này được không

20917
19:59:15,851 --> 19:59:19,872
sử dụng một số HTML, một số CSS,\nand có thể nhờ sự trợ giúp của Bootstrap

20918
19:59:19,872 --> 19:59:23,110
chỉ để tôi không phải tìm hiểu\n

20919
19:59:23,110 --> 19:59:24,402
Vâng, đây là điểm khởi đầu của tôi.

20920
19:59:24,402 --> 19:59:29,631
Trong Search.html, hãy bắt đầu và thêm\n

20921
19:59:29,631 --> 19:59:34,342
để chúng tôi có quyền truy cập vào tất cả\n

20922
19:59:34,342 --> 19:59:37,732
Và hãy để tôi tiếp tục\ntìm ra cách thực hiện việc này.

20923
19:59:37,732 --> 19:59:43,392
Chà, giống như trang web của Stanford đã có\n

20924
19:59:43,392 --> 19:59:46,362
nhưng họ đã thay đổi nó từ một\n

20925
19:59:46,361 --> 19:59:48,322
Tôi cá là tôi có thể tự mình làm được điều gì đó\nnhư thế này.

20926
19:59:48,322 --> 19:59:50,562
Vì vậy, hãy để tôi đi vào nội dung\ntrang của tôi và trước tiên

20927
19:59:50,562 --> 19:59:54,851
dựa trên tài liệu của Bootstrap,\nhãy để tôi thêm một div tên là

20928
19:59:54,851 --> 19:59:57,641
một div với một lớp chất lỏng chứa.

20929
19:59:57,642 --> 19:59:59,832
Chất lỏng chứa\nchỉ là một lớp đi kèm

20930
19:59:59,831 --> 20:00:03,491
với Bootstrap có nội dung: làm cho\ntrang web của bạn trở nên trôi chảy, nghĩa là

20931
20:00:04,961 --> 20:00:07,032
Vì vậy, theo cách đó nó sẽ thay đổi kích thước một cách độc đáo.

20932
20:00:07,032 --> 20:00:09,392
Tôi sẽ tiếp tục\nsửa vết lõm ở đây.

20933
20:00:09,392 --> 20:00:11,142
Nếu bạn chưa khám phá\nđiều này, nếu bạn

20934
20:00:11,142 --> 20:00:13,032
đánh dấu nhiều dòng\nin Mã VS, bạn có thể

20935
20:00:13,032 --> 20:00:15,082
nhấn Tab và thụt lề tất cả chúng cùng một lúc.

20936
20:00:15,081 --> 20:00:17,451
Bây giờ, tôi có tất cả\nthứ đó bên trong div này.

20937
20:00:17,452 --> 20:00:23,052
Bây giờ, giống như trong trang web của Stanford, hãy\n

20938
20:00:23,051 --> 20:00:32,561
một LI, được gọi với một lớp mục NAV,\n

20939
20:00:32,562 --> 20:00:42,702
hãy để tôi tiếp tục và nói, A\nHREF=https://about.google

20940
20:00:42,702 --> 20:00:44,972
đó là URL thực\ncủa trang giới thiệu của Google.

20941
20:00:44,971 --> 20:00:46,771
Và tôi sẽ đặt văn bản giới thiệu vào đó.

20942
20:00:46,771 --> 20:00:50,911
Sau đó tôi sẽ đóng thẻ LI của mình\n

20943
20:00:50,911 --> 20:00:52,381
vì tôi đang sử dụng Bootstrap.

20944
20:00:52,381 --> 20:00:54,391
Tài liệu của Bootstrap,\nnếu tôi đọc kỹ

20945
20:00:54,392 --> 20:00:59,642
nói thêm một lớp vào các liên kết của bạn,\n

20946
20:00:59,642 --> 20:01:04,712
làm cho nó tối đi, như đen hoặc tối\n

20947
20:01:04,711 --> 20:01:08,551
Được rồi, tôi nghĩ bây giờ tôi\ncó một liên kết giới thiệu

20948
20:01:08,551 --> 20:01:10,661
trong phần điều hướng trên màn hình của tôi.

20949
20:01:10,661 --> 20:01:14,161
Hãy để tôi tiếp tục\nlưu cái này và tải lại.

20950
20:01:14,161 --> 20:01:16,351
Được rồi, không chính xác những gì tôi muốn.

20951
20:01:16,351 --> 20:01:19,741
Đây vẫn là một danh sách có dấu đầu dòng nên\ntôi cần phải ghi đè lên danh sách này bằng cách nào đó.

20952
20:01:19,741 --> 20:01:22,831
Hãy để tôi đọc tài liệu\ncủa Bootstrap rõ ràng hơn một chút.

20953
20:01:22,831 --> 20:01:25,021
Và hãy để tôi giả vờ làm\nđiều đó, vì thời gian.

20954
20:01:25,021 --> 20:01:28,682
Nếu tôi xem phần nội dung, rất tiếc,\nnếu tôi xem phần thành phần

20955
20:01:28,682 --> 20:01:32,801
và tôi đi đến Điều hướng và\nTab, nói ngắn gọn

20956
20:01:32,801 --> 20:01:35,701
nếu bạn muốn tạo một menu đẹp\n

20957
20:01:35,702 --> 20:01:37,802
từ trái sang\nphải, giống như Stanford

20958
20:01:37,801 --> 20:01:40,001
Về cơ bản tôi cần HTML như thế này.

20959
20:01:40,001 --> 20:01:42,271
Và điều này thật tế nhị, nhưng\ntôi đã bỏ qua lớp học này.

20960
20:01:42,271 --> 20:01:45,902
Lẽ ra tôi nên thêm một\nlớp có tên NAV vào UL của mình.

20961
20:01:46,831 --> 20:01:49,322
Hãy để tôi vào đây và\nnói cộng lớp bằng

20962
20:01:49,322 --> 20:01:53,702
NAV, và một lần nữa, mục class\nNAV này, Bootstrap đã bảo tôi

20963
20:01:53,702 --> 20:01:56,461
Văn bản liên kết NAV tối,\nBootstrap bảo tôi làm như vậy.

20964
20:01:56,461 --> 20:02:02,521
Hãy để tôi quay lại trang của tôi ở đây,\n

20965
20:02:02,521 --> 20:02:05,161
Nhưng ít nhất liên kết Giới thiệu\nằm ở góc trên cùng bên trái

20966
20:02:05,161 --> 20:02:07,891
giống như nó phải là\nin Google.com thực sự.

20967
20:02:07,892 --> 20:02:10,142
Bây giờ hãy để tôi nhanh chóng tạo ra một vài\nliên kết nữa.

20968
20:02:10,142 --> 20:02:13,472
Hãy để tôi đi và thực hiện một chút\nsao chép/dán, mặc dù tôi cá là vào tuần tới

20969
20:02:13,471 --> 20:02:15,811
chúng ta có thể tránh kiểu sao chép/dán này.

20970
20:02:15,812 --> 20:02:20,252
Hãy để tôi thay đổi liên kết này\nthành Store.google.com.

20971
20:02:22,471 --> 20:02:26,941
Hãy để tôi tiếp tục và tạo\nanmột cái khác ở đây cho Gmail.

20972
20:02:26,941 --> 20:02:31,682
Vậy thì cái này sẽ chính thức được\nthôi, thế còn

20973
20:02:31,682 --> 20:02:35,642
về mặt kỹ thuật thì đó là www.google.com/gmail.

20974
20:02:37,172 --> 20:02:39,332
Và hãy để tôi lấy thêm một trong số này.

20975
20:02:39,331 --> 20:02:42,691
Và đối với Google Hình ảnh, tôi\nsẽ dán cái này, rất tiếc

20976
20:02:44,042 --> 20:02:45,631
Tôi cũng định đặt cái này ở đây.

20977
20:02:45,631 --> 20:02:53,251
Đây sẽ là hình ảnh và\nURL đó là IMG.hp, là URL.

20978
20:02:53,251 --> 20:02:56,281
Được rồi, để tôi tiếp tục\nvà tải lại trang trình duyệt.

20979
20:02:56,282 --> 20:02:57,842
Bây giờ nó đang đến, phải không?

20980
20:02:57,842 --> 20:02:59,491
Giới thiệu, lưu trữ, Gmail, hình ảnh.

20981
20:02:59,491 --> 20:03:01,057
Nó không hẳn là điều tôi muốn.

20982
20:03:01,057 --> 20:03:03,182
Vì vậy tôi phải đọc\ntài liệu để tìm hiểu

20983
20:03:03,182 --> 20:03:07,395
làm thế nào để có thể thúc đẩy một trong những thứ này\n

20984
20:03:07,395 --> 20:03:09,062
Và có một số cách để làm điều này.

20985
20:03:09,062 --> 20:03:13,351
Nhưng có một cách là nếu tôi muốn Gmail di chuyển\n

20986
20:03:13,351 --> 20:03:23,161
nếu không, tôi có thể nói rằng hãy thêm chút lợi nhuận vào\n

20987
20:03:23,161 --> 20:03:27,721
Đây là trong tài liệu của Bootstrap, a\n

20988
20:03:27,721 --> 20:03:29,941
chỉ tự động\nxóa mọi thứ ra xa nhau.

20989
20:03:29,941 --> 20:03:34,441
Và bây giờ, nếu tôi tải lại trang\n

20990
20:03:35,461 --> 20:03:37,336
Được rồi, bây giờ chúng ta\nsẽ tiếp tục tiến lên.

20991
20:03:37,336 --> 20:03:40,422
Hãy để tôi tiếp tục và thêm\nnút lớn màu xanh lam để đăng nhập.

20992
20:03:40,422 --> 20:03:45,422
Vì vậy, ở đây với việc đăng nhập, hãy để tôi đi\n

20993
20:03:45,422 --> 20:03:49,202
vậy hãy tiếp tục và thực hiện thêm một\nLI nữa, lớp bằng mục NAV.

20994
20:03:49,202 --> 20:03:52,442
Và sau đó, bên trong LI\ntag này, tôi sẽ làm gì?

20995
20:03:52,441 --> 20:03:58,111
Hóa ra có một lớp có thể biến\n

20996
20:03:58,111 --> 20:04:01,411
cho nút, rồi đến nút\nchính, làm cho nút này có màu xanh

20997
20:04:01,411 --> 20:04:04,554
HREF cho cái này sẽ\nlà https://accounts.goo

20998
20:04:04,554 --> 20:04:08,491
gle.com/service/login, tức là\n

20999
20:04:09,631 --> 20:04:11,941
Vai trò của liên kết này là của nút.

21000
20:04:11,941 --> 20:04:15,241
Sau đó đăng nhập,\nsẽ có văn bản trên đó.

21001
20:04:15,241 --> 20:04:18,744
Nếu bây giờ tôi tải lại trang thì\nchúng ta sẽ tiến gần hơn nữa

21002
20:04:18,744 --> 20:04:20,161
mặc dù trông có vẻ hơi ngu ngốc.

21003
20:04:20,161 --> 20:04:22,921
Lưu ý rằng đăng nhập nằm ở góc trên cùng bên phải

21004
20:04:22,922 --> 20:04:26,492
trong khi google.com thực sự có\n

21005
20:04:26,491 --> 20:04:28,021
Được rồi, đó cũng là một cách khắc phục dễ dàng.

21006
20:04:28,021 --> 20:04:30,061
Hãy để tôi quay lại HTML của tôi ở đây.

21007
20:04:31,849 --> 20:04:33,182
Đây cũng là một thứ Bootstrap.

21008
20:04:33,182 --> 20:04:35,702
Họ có một lớp tên là m-something.

21009
20:04:35,702 --> 20:04:38,461
Cái gì đó là một\nsố từ 1 đến 5

21010
20:04:38,461 --> 20:04:41,982
Tôi tin rằng điều đó chỉ bổ sung thêm một chút khoảng trắng.

21011
20:04:41,982 --> 20:04:45,672
Vì vậy, nếu tôi tải lại bây giờ, OK,\nit sẽ đẹp hơn một chút.

21012
20:04:47,191 --> 20:04:50,671
Chỉ để minh họa cách tôi có thể\nmang cái này về nhà, hãy để tôi tiếp tục

21013
20:04:50,672 --> 20:04:55,232
và mở phiên bản\nlàm sẵn của tôi về cái này, nhờ đó

21014
20:04:55,232 --> 20:04:58,862
Tôi đã thêm vào đây một số khởi sắc cuối cùng.

21015
20:04:58,861 --> 20:05:02,281
Nếu tôi truy cập Search2.html, tôi\nquyết định thay thế logo của họ

21016
20:05:02,282 --> 20:05:05,582
chỉ với điều này từ một\ncat, và nhận thấy rằng tôi

21017
20:05:05,581 --> 20:05:07,664
về cơ bản được triển khai lại google.com.

21018
20:05:07,664 --> 20:05:10,081
Đây là một hộp văn bản, đây là hai\nnút, mặc dù chúng là

21019
20:05:10,081 --> 20:05:11,641
hơi mờ trên màn hình.

21020
20:05:11,642 --> 20:05:14,882
Tôi thậm chí còn tìm ra cách lấy dấu chấm\n

21021
20:05:14,881 --> 20:05:18,421
Và nếu chúng tôi xem nguồn, bạn có thể thấy\n

21022
20:05:18,422 --> 20:05:25,322
Nếu tôi đi xem công cụ dành cho nhà phát triển và tôi\n

21023
20:05:25,322 --> 20:05:31,081
và tôi đi vào div này, bạn sẽ thấy\n

21024
20:05:31,081 --> 20:05:35,531
Và tôi đã thêm một số lớp vào đó để thực hiện\n

21025
20:05:35,532 --> 20:05:38,652
Nếu tôi đi vào thẻ biểu mẫu, đây\là thẻ biểu mẫu giống như trước đây.

21026
20:05:38,652 --> 20:05:40,952
Nhưng, hãy lưu ý, lần này tôi đã sử dụng thẻ\nnút

21027
20:05:40,952 --> 20:05:43,672
với các lớp nút và đèn nút.

21028
20:05:43,672 --> 20:05:45,961
Và sau đó tôi đã cách điệu\nchúng theo một cách nhất định.

21029
20:05:45,961 --> 20:05:49,221
Và cuối cùng, nếu tôi muốn\n

21030
20:05:49,221 --> 20:05:51,981
và nhấp vào tìm kiếm của Google,\nthì đấy, tôi đã triển khai

21031
20:05:51,982 --> 20:05:54,982
thứ gì đó khá\ngần giống với Google.com

21032
20:05:54,982 --> 20:05:57,952
thậm chí không cần chạm vào CSS thô.

21033
20:05:57,952 --> 20:06:00,502
Và bây giờ đây là giá trị\ncủa một khung.

21034
20:06:00,501 --> 20:06:02,811
Bạn chỉ có thể bắt đầu sử dụng\nchức năng sẵn có

21035
20:06:02,812 --> 20:06:04,622
mà người khác đã tạo cho bạn.

21036
20:06:04,622 --> 20:06:07,101
Nhưng nếu bạn muốn thực hiện\ncác cải tiến, bạn thực sự không

21037
20:06:07,101 --> 20:06:09,831
như màu xanh lam\nBootstrap đã chọn hoặc nút màu xám

21038
20:06:09,831 --> 20:06:11,748
hoặc bạn muốn cong\nmọi thứ hơn một chút, đó là

21039
20:06:11,748 --> 20:06:14,122
nơi bạn có thể tạo\ntệp CSS của riêng mình và thực hiện

21040
20:06:14,122 --> 20:06:16,372
dặm cuối cùng, sắp sửa tinh chỉnh mọi thứ.

21041
20:06:16,372 --> 20:06:17,961
Và đó có xu hướng là cách thực hành tốt nhất.

21042
20:06:17,961 --> 20:06:21,051
Đứng trên vai người khác với tư cách\n

21043
20:06:21,051 --> 20:06:23,551
Và sau đó nếu bạn thực sự không thích những gì thư viện đang làm

21044
20:06:23,551 --> 20:06:26,301
sau đó sử dụng các kỹ năng của riêng bạn và\nsự hiểu biết về HTML và CSS

21045
20:06:26,301 --> 20:06:29,551
để tinh chỉnh mọi thứ xa hơn một chút.

21046
20:06:29,551 --> 20:06:33,262
Nhưng sau tất cả những điều đó, tất cả\n

21047
20:06:33,262 --> 20:06:35,752
vẫn ở trạng thái tĩnh, khác\nngoài Google

21048
20:06:35,751 --> 20:06:37,671
tìm kiếm trên Google.com thực sự.

21049
20:06:37,672 --> 20:06:39,532
Hãy nghỉ giải lao 5\ncuối cùng và chúng ta sẽ

21050
20:06:39,532 --> 20:06:43,282
cho bạn biết những gì chúng tôi có thể làm tiếp theo\n

21051
20:06:44,822 --> 20:06:48,381
Được rồi, tôi nghĩ\công bằng mà nói thì chúng ta

21052
20:06:48,381 --> 20:06:50,819
sắp được nhìn thấy ngôn ngữ cuối cùng của chúng ta.

21053
20:06:50,820 --> 20:06:52,612
Tuần tới và các dự án\ncuối cùng cuối cùng cũng được hoàn thành

21054
20:06:52,611 --> 20:06:55,101
chúng ta sẽ\ntổng hợp rất nhiều thứ trong số này.

21055
20:06:55,101 --> 20:06:58,042
May mắn thay, ngôn ngữ có tên\nJavaScript này khá giống nhau

21056
20:06:58,042 --> 20:07:00,229
cú pháp cho cả C và Python.

21057
20:07:00,229 --> 20:07:03,021
Và thực sự, nếu bạn có thể tưởng tượng\n

21058
20:07:03,021 --> 20:07:05,391
bạn có thể làm điều đó dưới\nmột dạng nào đó trong JavaScript.

21059
20:07:05,392 --> 20:07:07,742
Tuy nhiên, điểm khác biệt cơ bản nhất hiện nay

21060
20:07:07,741 --> 20:07:11,122
đó là khi bạn đã viết mã C\ncode và Python cho đến nay

21061
20:07:11,122 --> 20:07:12,379
bạn đã thực hiện nó trên máy chủ.

21062
20:07:12,379 --> 20:07:14,461
Bạn đã thực hiện việc đó trong môi trường cửa sổ\nterminal.

21063
20:07:14,461 --> 20:07:17,812
Và khi bạn chạy mã, nó\n

21064
20:07:17,812 --> 20:07:20,122
Sự khác biệt ngày nay\nvới JavaScript là

21065
20:07:20,122 --> 20:07:23,362
mặc dù bạn định viết\nit lên đám mây bằng Mã VS

21066
20:07:23,361 --> 20:07:27,981
hãy nhớ lại rằng, khi một trình duyệt nhận được\ntrang chứa mã này

21067
20:07:27,982 --> 20:07:32,012
nó sẽ nhận được một bản sao của HTML,\n

21068
20:07:32,012 --> 20:07:37,012
Vậy JavaScript mà chúng ta thấy ngày nay là\n

21069
20:07:37,012 --> 20:07:40,732
trên máy Mac, PC và\nđiện thoại của chính người dùng chứ không phải trên máy chủ.

21070
20:07:40,732 --> 20:07:44,062
JavaScript có thể được sử dụng trên máy chủ,\n

21071
20:07:44,062 --> 20:07:47,752
Đó là một giải pháp thay thế cho Python hoặc\n

21072
20:07:47,751 --> 20:07:51,361
Hiện nay chúng tôi đang sử dụng ứng dụng này cho khách hàng\nside, đây là điểm khác biệt chính.

21073
20:07:51,361 --> 20:07:53,932
Vì vậy, trong Scratch, chúng ta hãy\nlàm điều này lần cuối cùng.

21074
20:07:53,932 --> 20:07:56,991
Nếu bạn muốn tạo một biến\n

21075
20:07:56,991 --> 20:07:59,331
Trong JavaScript, nó\nsẽ trông như thế này.

21076
20:07:59,331 --> 20:08:02,241
Bạn không chỉ định loại,\nnhưng bạn sử dụng từ khóa let

21077
20:08:02,241 --> 20:08:07,581
và còn có một vài người khác nữa, đó\n

21078
20:08:07,581 --> 20:08:11,631
Nếu bạn muốn tăng\nbiến đó lên một, bạn sử dụng JavaScript

21079
20:08:11,631 --> 20:08:14,932
có thể nói điều gì đó như,\nbộ đếm bằng bộ đếm cộng 1

21080
20:08:14,932 --> 20:08:17,512
hoặc bạn có thể làm điều đó\n ngắn gọn hơn, với dấu cộng bằng

21081
20:08:17,512 --> 20:08:20,092
hoặc dấu cộng đã trở lại trong JavaScript.

21082
20:08:20,092 --> 20:08:23,122
Bây giờ bạn có thể nói lại counter\nplus cộng dấu chấm phẩy.

21083
20:08:23,122 --> 20:08:26,122
Trong Scratch, nếu bạn muốn\nthực hiện một điều kiện như thế này

21084
20:08:26,122 --> 20:08:30,741
hỏi x có nhỏ hơn y không thì có vẻ\n

21085
20:08:32,361 --> 20:08:35,691
Các dấu ngoặc nhọn ở đây đã quay trở lại, nếu bạn\n

21086
20:08:35,691 --> 20:08:39,951
Nhưng về mặt cú pháp thì khá nhiều\n

21087
20:08:39,952 --> 20:08:42,502
và thậm chí đối với nó là else if else.

21088
20:08:42,501 --> 20:08:45,621
Không giống như Python, nó lại là hai\ntừ, nếu không thì.

21089
20:08:45,622 --> 20:08:49,347
Khá giống C,\nkhông có gì mới ngoài điều đó.

21090
20:08:49,346 --> 20:08:52,221
Nếu bạn muốn làm điều gì đó mãi mãi\n

21091
20:08:52,221 --> 20:08:55,731
Trong JavaScript, bạn có thể làm điều đó một chút\n

21092
20:08:57,172 --> 20:09:00,652
Trong JavaScript, Boolean lại là chữ thường, giống như trong C.

21093
20:09:02,073 --> 20:09:04,281
Nếu bạn muốn làm điều gì đó\na với số lần hữu hạn

21094
20:09:04,282 --> 20:09:08,042
giống như lặp lại ba lần,\ntrông cũng gần giống C.

21095
20:09:08,042 --> 20:09:12,452
Thực sự, sự khác biệt duy nhất là việc sử dụng\n

21096
20:09:12,452 --> 20:09:15,142
Và một lần nữa, bạn sẽ sử dụng let để\ntạo một chuỗi hoặc INT

21097
20:09:15,142 --> 20:09:17,362
hoặc bất kỳ loại\nbiến nào khác trong JavaScript.

21098
20:09:17,361 --> 20:09:21,021
Trình duyệt sẽ tìm ra\nloại bạn muốn nói từ ngữ cảnh.

21099
20:09:21,021 --> 20:09:24,232
Trong C chúng ta sẽ nói INT thay thế.

21100
20:09:24,232 --> 20:09:27,952
Cuối cùng, ngôn ngữ này và ngôn ngữ kia\n

21101
20:09:27,952 --> 20:09:30,502
Có rất nhiều\ntính năng khác, nhưng về mặt cú pháp thì nó

21102
20:09:30,501 --> 20:09:32,841
sẽ có thể truy cập được,\nnói một cách tương đối.

21103
20:09:32,842 --> 20:09:35,572
Sức mạnh của JavaScript\nchạy trong trình duyệt của người dùng

21104
20:09:35,572 --> 20:09:39,232
nghĩa là bạn có thể\nthay đổi thứ này trong bộ nhớ.

21105
20:09:39,232 --> 20:09:43,432
Hãy nghĩ về hầu hết mọi trang web, đó là\n

21106
20:09:43,432 --> 20:09:45,771
Nó thường rất\ntương tác và năng động.

21107
20:09:45,771 --> 20:09:49,581
Nếu bạn đang ngồi trước Gmail trên\n

21108
20:09:49,581 --> 20:09:52,141
mở ra và đột nhiên ai đó gửi cho bạn\nan email

21109
20:09:52,142 --> 20:09:55,402
một hàng khác xuất hiện trong\ninbox của bạn, một hàng khác, một hàng khác.

21110
20:09:56,721 --> 20:09:58,711
Thành thật mà nói, nó có thể là một bảng HTML.

21111
20:09:58,711 --> 20:10:00,741
Có lẽ đó là một loạt\ndiv từ trên xuống dưới.

21112
20:10:00,741 --> 20:10:04,072
Tuy nhiên, vấn đề là bạn không\n

21113
20:10:04,072 --> 20:10:06,532
R để tải lại trang để xem thêm email.

21114
20:10:06,532 --> 20:10:10,072
Nó tự động xuất hiện\n cứ sau vài giây hoặc vài phút.

21115
20:10:11,751 --> 20:10:14,811
Khi bạn truy cập Gmail.com,\nbạn không chỉ tải xuống

21116
20:10:14,812 --> 20:10:18,322
Có lẽ là HTML và CSS với hộp thư đến ban đầu của bạn.

21117
20:10:18,322 --> 20:10:20,392
Bạn đang tải xuống một số\nmã JavaScript,

21118
20:10:20,392 --> 20:10:24,592
được thiết kế để tiếp tục nói chuyện\n

21119
20:10:24,592 --> 20:10:28,282
tới máy chủ Gmail và\nsau đó, họ đang sử dụng mã của mình

21120
20:10:28,282 --> 20:10:31,492
để thêm phần tử khác, phần tử khác, phần tử khác

21121
20:10:31,491 --> 20:10:36,771
tới đối tượng tài liệu, DOM hiện có\n

21122
20:10:36,771 --> 20:10:40,851
trong bộ nhớ đại diện cho HTML,\n

21123
20:10:43,232 --> 20:10:46,101
Nếu bạn bấm và kéo và kéo\nvà kéo, trình duyệt của bạn không

21124
20:10:46,101 --> 20:10:49,351
theo mặc định tải toàn bộ thế giới xuống\nmáy Mac hoặc PC của bạn.

21125
20:10:49,351 --> 20:10:52,491
Nó chỉ tải xuống những gì có trong\n của bạn

21126
20:10:52,491 --> 20:10:55,491
Nhưng khi bạn nhấp và kéo, nó\n

21127
20:10:55,491 --> 20:10:58,702
thêm một số hình ảnh, một số\nhình ảnh khác khi bạn tiếp tục kéo bằng cách sử dụng

21128
20:10:58,702 --> 20:11:01,312
JavaScript, một lần nữa, đằng sau hậu trường.

21129
20:11:01,312 --> 20:11:04,672
Vậy hãy thực sự sử dụng JavaScript\n

21130
20:11:05,979 --> 20:11:08,271
Chúng ta có thể đặt đoạn mã JavaScript\ncode vào đầu trang

21131
20:11:08,271 --> 20:11:12,182
trong nội dung của trang, hoặc thậm chí\n

21132
20:11:13,131 --> 20:11:17,601
Đây là phiên bản mới của\nHello.html, trong thời gian nghỉ giải lao

21133
20:11:17,601 --> 20:11:20,781
Tôi vừa thêm một biểu mẫu vào, bởi vì nó\n

21134
20:11:20,782 --> 20:11:24,472
nói Xin chào, tiêu đề, Xin chào, nội dung, nó nói,\n

21135
20:11:25,672 --> 20:11:28,672
Tôi có một biểu mẫu mà tôi đã mượn\ntừ một số mã trước đây của chúng tôi

21136
20:11:28,672 --> 20:11:34,882
và biểu mẫu đó có đầu vào có ID là\n

21137
20:11:34,881 --> 20:11:36,572
Nhưng chưa có mã nào trong này.

21138
20:11:36,572 --> 20:11:39,601
Vì vậy, hãy thêm một chút\nmã JavaScript như sau.

21139
20:11:39,601 --> 20:11:43,101
Giả sử rằng, khi biểu mẫu này\n

21140
20:11:44,282 --> 20:11:47,302
Chà, trước tiên hãy thực hiện theo\ncách hơi lộn xộn.

21141
20:11:47,301 --> 20:11:51,351
Tôi có thể thêm một thuộc tính có tên\non submit vào phần tử biểu mẫu

21142
20:11:51,351 --> 20:11:56,452
và tôi có thể nói khi gửi, hãy gọi\n

21143
20:11:56,452 --> 20:11:58,552
Rất tiếc, chức năng\n này chưa tồn tại.

21144
20:11:59,769 --> 20:12:01,101
Nhưng có một chi tiết khác ở đây.

21145
20:12:01,101 --> 20:12:04,851
Khi người dùng nhấp vào gửi, thông thường\n

21146
20:12:04,851 --> 20:12:06,381
Tôi không muốn làm điều đó ngày hôm nay.

21147
20:12:06,381 --> 20:12:10,372
Tôi chỉ muốn gửi biểu mẫu tới\n

21148
20:12:10,372 --> 20:12:13,142
và chỉ cần in ra màn hình,\nXin chào, David, v.v.

21149
20:12:13,142 --> 20:12:15,862
Vì vậy, tôi cũng sẽ tiếp tục và nói, trả về sai.

21150
20:12:15,861 --> 20:12:20,301
Và đây là một cách nói bằng JavaScript\n

21151
20:12:20,301 --> 20:12:21,831
để gửi biểu mẫu, trả về sai.

21152
20:12:21,831 --> 20:12:24,171
Giống như, không, đừng để họ thực sự gửi biểu mẫu.

21153
20:12:24,172 --> 20:12:26,362
Nhưng hãy gọi chức năng này là chào hỏi.

21154
20:12:26,361 --> 20:12:30,951
Ở đầu trang của tôi, tôi sẽ thêm\n

21155
20:12:30,952 --> 20:12:33,682
hoàn toàn là JavaScript,\nand không có mối quan hệ nào

21156
20:12:33,682 --> 20:12:37,402
dành cho những người đã tham gia APCS với\n

21157
20:12:37,402 --> 20:12:41,542
nhưng không liên quan, tôi sẽ\nđặt tên cho một hàm tên là Greet.

21158
20:12:41,542 --> 20:12:44,631
Rõ ràng là trong JavaScript,\ncách bạn tạo một hàm là bạn

21159
20:12:44,631 --> 20:12:47,361
nghĩa đen là nói từ\nfunction thay vì Def.

21160
20:12:47,361 --> 20:12:49,701
Bạn không chỉ định kiểu trả về.

21161
20:12:49,702 --> 20:12:54,381
Và trong chức năng này, tôi có thể làm\n

21162
20:12:54,381 --> 20:12:57,801
bỏ trích dẫn, thế còn, Xin chào, đó.

21163
20:12:57,801 --> 20:13:01,501
Ban đầu tôi sẽ nói đơn giản,\n

21164
20:13:01,501 --> 20:13:03,031
đó không phải là một giao diện người dùng tốt.

21165
20:13:03,032 --> 20:13:04,407
Có nhiều cách tốt hơn để làm điều này.

21166
20:13:04,407 --> 20:13:06,382
Nhưng trước tiên chúng tôi đang làm điều gì đó đơn giản.

21167
20:13:06,381 --> 20:13:09,232
Bây giờ hãy để tôi tiếp tục và\ntải lại trang này.

21168
20:13:09,232 --> 20:13:12,562
Nó vẫn trông đơn giản như trước,\nchỉ với một hộp văn bản đơn giản.

21169
20:13:12,562 --> 20:13:13,942
Tôi sẽ phóng to để làm cho nó lớn hơn.

21170
20:13:13,941 --> 20:13:15,471
Tôi định gõ tên mình,\nnhưng tôi nghĩ nó sẽ sai

21171
20:13:15,471 --> 20:13:17,241
bị bỏ qua khi tôi nhấp vào Gửi.

21172
20:13:18,831 --> 20:13:21,111
Và một lần nữa, đây là một giao diện người dùng xấu.

21173
20:13:21,111 --> 20:13:24,381
Theo nghĩa đen, nó cho biết toàn bộ URL không gian\ncode của trang web

21174
20:13:25,581 --> 20:13:29,456
Nó thực sự chỉ nhằm mục đích đơn giản\n

21175
20:13:29,456 --> 20:13:31,581
Được rồi, bắt đầu thôi\nnói Xin chào, David, bằng cách nào đó.

21176
20:13:33,032 --> 20:13:37,222
Chà, nếu phần tử này trên trang\n được tôi cấp một ID duy nhất

21177
20:13:37,221 --> 20:13:41,331
Sẽ thật tuyệt nếu, giống như trong CSS, tôi\n

21178
20:13:45,572 --> 20:13:49,461
Hãy để tôi lưu trữ kết quả trong một tên biến\nđược gọi

21179
20:13:49,461 --> 20:13:54,381
gọi một hàm đặc biệt\nđược gọi là document.queryselector.

21180
20:13:54,381 --> 20:13:57,682
Chức năng chọn truy vấn này\nis phiên bản của JavaScript

21181
20:13:57,682 --> 20:14:00,142
về những gì chúng tôi đang làm\nin CSS, để chọn các nút

21182
20:14:00,142 --> 20:14:02,962
sử dụng hàm băm hoặc dấu chấm hoặc cú pháp khác.

21183
20:14:04,441 --> 20:14:09,391
Vì vậy, nếu tôi muốn chọn\element có ID duy nhất là tên

21184
20:14:09,392 --> 20:14:12,712
Theo nghĩa đen, tôi có thể vượt qua, trong\n

21185
20:14:14,211 --> 20:14:17,032
Điều đó mang lại cho tôi nút\nthực tế từ cây.

21186
20:14:17,032 --> 20:14:21,202
Nó cho tôi một trong những hình chữ nhật này\n

21187
20:14:21,202 --> 20:14:24,351
Nếu tôi thực sự muốn nhận được\ngiá trị cụ thể trong đó

21188
20:14:24,351 --> 20:14:27,301
Tôi cần tiến thêm một bước\nvà nói .value.

21189
20:14:27,301 --> 20:14:29,301
Vì vậy, về mặt tinh thần\ntương tự như Python, nơi chúng tôi

21190
20:14:29,301 --> 20:14:32,211
thấy rất nhiều ký hiệu dấu chấm, nơi\nbạn có thể đi vào bên trong một vật thể

21191
20:14:32,211 --> 20:14:34,191
bên trong một vật thể,\nđó là những gì đang diễn ra.

21192
20:14:34,191 --> 20:14:38,091
Tóm lại, bằng JavaScript,\n

21193
20:14:38,092 --> 20:14:41,392
được gọi là tài liệu, cho phép bạn thực hiện\n

21194
20:14:42,021 --> 20:14:44,361
Một trong những chức năng đó\nis được gọi là bộ chọn truy vấn.

21195
20:14:44,361 --> 20:14:47,781
Hàm đó trả về cho bạn\nbất cứ thứ gì bạn đang chọn.

21196
20:14:47,782 --> 20:14:51,032
Và giá trị dấu chấm có nghĩa là đi\bên trong hình chữ nhật đó

21197
20:14:51,032 --> 20:14:54,272
và lấy văn bản thực tế\nmà con người đã nhập vào.

21198
20:14:54,271 --> 20:14:58,251
Vì vậy, nếu bây giờ tôi muốn nói,\nXin chào, với người đó

21199
20:14:58,251 --> 20:15:01,011
cú pháp hơi khác so với C và Python.

21200
20:15:01,012 --> 20:15:03,741
Tôi có thể sử dụng phép nối, vốn thực sự tồn tại trong Python

21201
20:15:04,941 --> 20:15:10,371
Tôi có thể tiếp tục và nói xin chào,\ntrích dẫn "Xin chào" cùng với tên.

21202
20:15:10,372 --> 20:15:13,131
Được rồi, bây giờ, nếu tôi\nquay lại cửa sổ trình duyệt

21203
20:15:13,131 --> 20:15:16,911
tải lại trang để nhận thông tin mới nhất\n

21204
20:15:16,911 --> 20:15:20,031
và nhấp vào Gửi, bây giờ\nTôi hiểu rồi, Xin chào, David.

21205
20:15:20,032 --> 20:15:23,422
Không phải là trang web tốt nhất, nhưng\nit chứng minh cách

21206
20:15:23,422 --> 20:15:25,832
Tôi có thể bắt đầu tương tác với trang.

21207
20:15:25,831 --> 20:15:29,211
Nhưng hãy để tôi quy định rằng\nsự kết hợp giữa các ngôn ngữ này

21208
20:15:30,661 --> 20:15:33,171
Sử dụng\nlớp cũng được nhưng sử dụng kiểu

21209
20:15:33,172 --> 20:15:35,345
bằng với trích dẫn không trích dẫn và\na toàn bộ CSS

21210
20:15:35,345 --> 20:15:38,512
điều đó sẽ không thể mở rộng quy mô một cách tốt\n

21211
20:15:38,512 --> 20:15:40,672
Tương tự ở đây, khi bạn\ncó ngày càng nhiều mã

21212
20:15:40,672 --> 20:15:44,461
bạn không muốn chỉ đặt mã của mình\n

21213
20:15:45,751 --> 20:15:48,301
Hãy loại bỏ thuộc tính\non đỉnh đó

21214
20:15:48,301 --> 20:15:50,131
và theo nghĩa đen là không bao giờ sử dụng nó nữa.

21215
20:15:50,131 --> 20:15:52,411
Đó chỉ là mục đích biểu diễn thôi.

21216
20:15:53,801 --> 20:15:57,661
Hãy để tôi di chuyển thẻ script\thực ra, ngay bên dưới biểu mẫu

21217
20:15:57,661 --> 20:16:01,591
nhưng vẫn ở bên trong phần thân, nên\nthẻ script chỉ tồn tại

21218
20:16:01,592 --> 20:16:04,482
sau khi thẻ biểu mẫu tồn tại một cách hợp lý.

21219
20:16:04,482 --> 20:16:08,411
Giống như trong Python, mã của bạn là\n

21220
20:16:10,751 --> 20:16:13,591
Hãy để tôi định nghĩa hàm này\nđược gọi là Greet, và sau đó

21221
20:16:13,592 --> 20:16:18,902
hãy để tôi làm điều này, document.queryselector,\n

21222
20:16:18,902 --> 20:16:20,232
Nó không có ID duy nhất.

21223
20:16:21,062 --> 20:16:24,302
Tôi chỉ có thể tham khảo nó theo tên, hình thức,\n

21224
20:16:24,301 --> 20:16:28,411
Và để tôi gọi hàm\nđặc biệt này, thêm trình xử lý sự kiện.

21225
20:16:28,411 --> 20:16:31,471
Đây là chức năng\nlắng nghe các sự kiện.

21226
20:16:31,471 --> 20:16:34,201
Đây thực sự là một thuật ngữ\nnghệ thuật trong lập trình.

21227
20:16:34,202 --> 20:16:37,172
Nhiều ngôn ngữ khác nhau\được điều chỉnh bởi các sự kiện.

21228
20:16:37,172 --> 20:16:40,652
Và gần như mọi giao diện người dùng đều có\n

21229
20:16:40,652 --> 20:16:45,264
Trên điện thoại, bạn có thể chạm và bạn\n

21230
20:16:45,264 --> 20:16:47,432
và bạn phải chụm ngón tay cũng như tất cả\nnhững cử chỉ khác.

21231
20:16:47,432 --> 20:16:49,711
Trên máy Mac hoặc PC, bạn\nhấn chuột, bạn phải kéo

21232
20:16:49,711 --> 20:16:52,982
bạn có phím xuống, phím lên, như\n

21233
20:16:53,861 --> 20:16:57,121
Đây là danh sách\nkhông đầy đủ tất cả các sự kiện

21234
20:16:57,122 --> 20:16:59,919
mà bạn có thể nghe trong\nbối cảnh lập trình web.

21235
20:16:59,918 --> 20:17:02,251
Và đây có thể là sự quay lại\nScratch, ở đâu, hãy nhớ lại

21236
20:17:02,251 --> 20:17:04,411
Scratch cho phép bạn phát sóng các sự kiện.

21237
20:17:04,411 --> 20:17:07,741
Và chúng tôi có hai con rối\n

21238
20:17:07,741 --> 20:17:11,611
Trong thế giới lập trình web, trò chơi\n

21239
20:17:11,611 --> 20:17:14,131
ngày nay, chúng\nbị chi phối bởi các sự kiện.

21240
20:17:14,131 --> 20:17:16,961
Và bạn viết mã để lắng nghe\nnhững sự kiện này đang diễn ra.

21241
20:17:16,961 --> 20:17:18,301
Vậy tôi muốn nghe điều gì?

21242
20:17:18,301 --> 20:17:21,461
Chà, tôi muốn thêm một\nngười nghe sự kiện cho sự kiện Gửi.

21243
20:17:21,461 --> 20:17:26,771
Và khi điều đó xảy ra, tôi muốn\n

21244
20:17:26,771 --> 20:17:28,801
Vì vậy, đây là loại thú vị.

21245
20:17:28,801 --> 20:17:32,432
Cảm ơn bạn, tôi vẫn có chức năng Greet\n như trước, không có thay đổi gì.

21246
20:17:32,432 --> 20:17:34,952
Nhưng tôi đang thêm một\ndòng mã xuống đây.

21247
20:17:34,952 --> 20:17:38,072
Tôi đang yêu cầu trình duyệt\nuse document.queryselector

21248
20:17:39,331 --> 20:17:42,551
Sau đó, tôi đang thêm một trình xử lý sự kiện,\n

21249
20:17:42,551 --> 20:17:44,671
Và khi điều đó xảy ra, tôi gọi cho Greet.

21250
20:17:44,672 --> 20:17:47,461
Lưu ý rằng tôi không sử dụng\ndấu ngoặc đơn sau Greet.

21251
20:17:47,461 --> 20:17:49,381
Tôi không muốn gọi cho Greet ngay lập tức.

21252
20:17:49,381 --> 20:17:55,891
Tôi muốn yêu cầu trình duyệt gọi\n

21253
20:17:55,892 --> 20:18:03,992
Bây giờ hãy để tôi tiếp tục và cố tình,\n

21254
20:18:03,991 --> 20:18:08,012
đây, để tôi nhập tên mình,\nDavid, gửi và chúng ta bắt đầu.

21255
20:18:09,361 --> 20:18:13,231
Được rồi, nhưng bây giờ chúng ta hãy làm cho\ncái này được thiết kế tốt hơn một chút.

21256
20:18:13,232 --> 20:18:16,572
Hiện tại, tôi đang xác định một\nchức năng Chào, điều này ổn.

21257
20:18:16,572 --> 20:18:18,551
Nhưng tôi chỉ sử dụng nó ở một nơi.

21258
20:18:18,551 --> 20:18:21,122
Và bạn có thể nhớ lại, chúng ta\nđã tìm thấy điều này trong Python

21259
20:18:21,122 --> 20:18:24,211
tôi đã ở đâu, tại sao chúng ta lại tạo ra\n

21260
20:18:24,211 --> 20:18:26,461
khi chúng ta chỉ sử dụng\nit như một dòng sau?

21261
20:18:26,461 --> 20:18:29,842
Và hôm trước chúng tôi đã giới thiệu loại\nhàm nào trong Python?

21262
20:18:30,601 --> 20:18:33,221
GIỌNG 1: Vâng, vậy là hàm lambda\n, hàm ẩn danh.

21263
20:18:33,221 --> 20:18:35,611
Thực ra bạn cũng có thể làm điều này\nin bằng JavaScript.

21264
20:18:35,611 --> 20:18:40,001
Nếu tôi muốn định nghĩa một hàm tất cả\n

21265
20:18:40,001 --> 20:18:43,661
Hãy để tôi cắt cái này vào\nclipboard của tôi, dán nó vào đây.

21266
20:18:43,661 --> 20:18:45,451
Hãy để tôi sửa tất cả sự liên kết.

21267
20:18:46,982 --> 20:18:50,672
Và bây giờ tôi thực sự có thể làm được điều này.

21268
20:18:50,672 --> 20:18:52,351
Cú pháp hơi kỳ lạ.

21269
20:18:52,351 --> 20:18:56,021
Nhưng bây giờ chỉ cần sử dụng bốn\ndòng mã này, tôi có thể làm được điều này.

21270
20:18:56,021 --> 20:18:59,531
Tôi có thể yêu cầu trình duyệt thêm\n

21271
20:18:59,532 --> 20:19:03,331
Và khi nó nghe thấy điều đó, hãy gọi\n

21272
20:19:03,331 --> 20:19:06,151
Và không giống như Python, hàm này\ncó thể có nhiều dòng

21273
20:19:06,150 --> 20:19:07,650
đó thực sự là một điều tốt đẹp.

21274
20:19:08,714 --> 20:19:11,131
Hiện tại có rất nhiều vết lõm\nin dấu ngoặc nhọn đang diễn ra.

21275
20:19:11,131 --> 20:19:15,452
Nhưng bạn có thể coi đây chỉ là\n

21276
20:19:15,452 --> 20:19:18,149
khi mẫu đơn được gửi.

21277
20:19:18,149 --> 20:19:20,732
Nhưng nếu tôi muốn chặn biểu mẫu\nthực sự được gửi

21278
20:19:20,732 --> 20:19:21,722
Tôi phải làm một việc khác.

21279
20:19:21,721 --> 20:19:24,929
Và bạn sẽ chỉ biết điều này khi\n

21280
20:19:24,929 --> 20:19:28,291
Tôi cần thực hiện chức năng này\n, ngăn chặn mặc định

21281
20:19:28,292 --> 20:19:32,122
truyền vào đối số E này,\nis là một biến đại diện cho

21282
20:19:32,122 --> 20:19:33,872
sự kiện này, thông tin thêm vào\nvào lúc khác, rằng

21283
20:19:33,872 --> 20:19:36,482
chỉ cho phép chúng tôi ngăn chặn\nbất cứ điều gì mặc định

21284
20:19:36,482 --> 20:19:39,512
việc xử lý sự kiện cụ thể đó là

21285
20:19:39,512 --> 20:19:42,782
Tóm lại, đây là\nđại diện cho loại mã

21286
20:19:42,782 --> 20:19:45,961
bạn có thể viết bằng JavaScript,\nnhờ đó bạn có thể thực sự tương tác

21287
20:19:45,961 --> 20:19:48,422
với mã của bạn, biểu mẫu thực tế của người dùng.

21288
20:19:48,422 --> 20:19:50,192
Và chúng ta cũng có thể làm những điều thú vị.

21289
20:19:50,191 --> 20:19:53,531
Được tích hợp vào các trình duyệt ngày nay\có chức năng như thế này.

21290
20:19:53,532 --> 20:19:57,251
Vì vậy đây là một ví dụ rất đơn giản, đó\n

21291
20:19:58,381 --> 20:20:00,751
Chà, hóa ra bằng cách sử dụng\nJavaScript, bạn có thể kiểm soát

21292
20:20:00,751 --> 20:20:02,881
CSS của một trang theo chương trình.

21293
20:20:02,881 --> 20:20:05,281
Tôi có thể thay đổi nền\nphần nội dung của trang

21294
20:20:05,282 --> 20:20:10,382
sang màu đỏ, sang màu xanh lá cây, sang màu xanh lam, chỉ bằng\n

21295
20:20:10,381 --> 20:20:12,482
và sau đó thay đổi thuộc tính CSS.

21296
20:20:12,482 --> 20:20:15,271
Chỉ để cho bạn nếm thử điều này,\nnếu tôi xem nguồn của trang

21297
20:20:15,271 --> 20:20:19,711
mã tương tự ở đây, tôi có thể\nchọn nút màu đỏ theo ID

21298
20:20:19,711 --> 20:20:22,441
mà rõ ràng tôi đã xác định\không phải nó, ngay tại đây.

21299
20:20:22,441 --> 20:20:25,871
Tôi có thể thêm một trình xử lý sự kiện, cái này\n

21300
20:20:25,872 --> 20:20:28,199
Và khi nó được nhấp vào, tôi\thực thi một dòng mã này.

21301
20:20:28,198 --> 20:20:30,240
Và một dòng mã này\nchúng tôi chưa từng thấy trước đây

21302
20:20:30,240 --> 20:20:33,871
nhưng bạn có thể đi vào phần nội dung của trang\n, thuộc tính kiểu của nó

21303
20:20:33,872 --> 20:20:36,331
và bạn có thể thay đổi\nmàu nền của nó thành màu đỏ.

21304
20:20:36,331 --> 20:20:38,851
Đây là một ví dụ về\nhai nhóm khác nhau

21305
20:20:38,851 --> 20:20:40,562
không nói chuyện trước với nhau

21306
20:20:40,562 --> 20:20:43,911
Trong CSS, các thuộc tính có hai\ntừ thường được gạch nối

21307
20:20:45,592 --> 20:20:48,501
Thật không may, trong JavaScript, nếu\n

21308
20:20:48,501 --> 20:20:52,142
đó là phép trừ, điều này\nvô nghĩa về mặt logic ở đây.

21309
20:20:52,142 --> 20:20:56,932
Vì vậy, trong CSS, bạn có thể chuyển đổi\nbackground-color thành, bằng JavaScript

21310
20:20:56,932 --> 20:20:59,601
Màu nền, trong đó\nbạn viết hoa chữ C

21311
20:20:59,601 --> 20:21:01,851
và bạn bỏ dấu trừ đi.

21312
20:21:03,182 --> 20:21:05,900
À, ngày xưa\n từng có thẻ chớp mắt.

21313
20:21:05,900 --> 20:21:07,971
Và đó là một trong\nví dụ lịch sử

21314
20:21:07,971 --> 20:21:12,682
của một thẻ đã bị xóa khỏi HTML,\n

21315
20:21:12,682 --> 20:21:14,122
trang web trông như thế này.

21316
20:21:14,122 --> 20:21:16,176
Có rất nhiều thứ kiểu này.

21317
20:21:16,176 --> 20:21:18,051
Thậm chí còn có một vùng chọn\nđể di chuyển văn bản

21318
20:21:18,051 --> 20:21:19,509
từ trái qua phải trên màn hình.

21319
20:21:19,509 --> 20:21:21,781
Và mạng là một nơi rất xấu xí.

21320
20:21:21,782 --> 20:21:25,071
Tôi phải thừa nhận rằng, trang web đầu tiên của tôi\n

21321
20:21:25,070 --> 20:21:26,542
Nhưng làm thế nào chúng ta có thể mang nó trở lại?

21322
20:21:26,542 --> 20:21:29,691
Chà, đây là phiên bản của\n

21323
20:21:30,202 --> 20:21:35,722
Tôi đã viết một số mã trong ví dụ này, đó\n

21324
20:21:35,721 --> 20:21:39,471
CSS của trang ở chế độ\nhiển thị, vô hình, hiển thị

21325
20:21:39,471 --> 20:21:42,891
vô hình, bởi vì\nJavaScript được tích hợp sẵn để hỗ trợ đồng hồ.

21326
20:21:42,892 --> 20:21:45,452
Vì vậy, bạn chỉ có thể làm điều gì đó\không phải một loại lịch trình nào đó.

21327
20:21:45,452 --> 20:21:47,782
Hãy để tôi tiếp tục và mở\nví dụ này, tự động hoàn thành.

21328
20:21:49,251 --> 20:21:53,751
Trong Autocomplete.html, tôi đã đánh dấu là\n

21329
20:21:53,751 --> 20:21:56,482
nhưng tôi cũng đã lấy\ndiction từ vấn đề

21330
20:21:56,482 --> 20:22:00,711
đặt 5 chính tả, để nếu tôi muốn\n

21331
20:22:00,711 --> 20:22:04,491
thao tác này tìm kiếm 140.000\ntừ đó bằng cách sử dụng JavaScript

21332
20:22:04,491 --> 20:22:07,380
để tạo ra những gì chúng ta biết trong\nthế giới web dưới dạng tự động hoàn thành.

21333
20:22:07,380 --> 20:22:09,172
Khi bạn bắt đầu tìm kiếm\nthứ gì đó, bạn

21334
20:22:09,172 --> 20:22:11,632
sẽ bắt đầu thấy những từ\nbắt đầu bằng cụm từ đó.

21335
20:22:11,631 --> 20:22:14,164
Và chắc chắn rồi, nếu tôi tìm kiếm\nthứ gì đó như chuối

21336
20:22:14,164 --> 20:22:17,331
đây là ba biến thể của chuối\n

21337
20:22:18,381 --> 20:22:21,811
Chỉ cần JavaScript, khi\nit tìm thấy các từ phù hợp

21338
20:22:21,812 --> 20:22:24,862
nó chỉ đang cập nhật DOM, cây\n trong bộ nhớ của máy tính

21339
20:22:24,861 --> 20:22:27,921
để hiển thị ngày càng nhiều văn bản hoặc ít hơn.

21340
20:22:27,922 --> 20:22:34,162
Và đối với một ví dụ cuối cùng, đây là cách\n

21341
20:22:35,872 --> 20:22:40,042
Hôm nay bạn đã tích hợp vào trình duyệt một số\n

21342
20:22:40,042 --> 20:22:44,152
giao diện, nhờ đó bạn có thể yêu cầu\n

21343
20:22:44,152 --> 20:22:47,601
Ví dụ, ở đây, tôi đã viết một\n

21344
20:22:47,601 --> 20:22:49,448
hình như đang muốn biết vị trí của tôi.

21345
20:22:49,448 --> 20:22:51,531
Được rồi, hãy để tôi tiếp tục\nvà cho phép lần này

21346
20:22:51,532 --> 20:22:54,202
nếu đó là điều bạn\nthoải mái trên thiết bị của mình.

21347
20:22:54,202 --> 20:22:57,202
Sẽ mất một chút thời gian vì đôi khi\n

21348
20:22:58,081 --> 20:23:02,601
Nhưng, hy vọng, chỉ trong chốc lát, có\n

21349
20:23:02,601 --> 20:23:06,232
và như một sự khởi sắc cuối cùng ngày hôm nay, để làm gì\n

21350
20:23:06,232 --> 20:23:08,601
cho cấu trúc của bạn, CSS\ncho phong cách của bạn và bây giờ

21351
20:23:08,601 --> 20:23:13,372
JavaScript cho logic của bạn, chúng tôi sẽ\n

21352
20:23:13,372 --> 20:23:15,982
và tìm kiếm trên Google\ncác tọa độ GPS đó.

21353
20:23:15,982 --> 20:23:21,472
Phóng to ở đây trên Google Maps,\nvà nếu chúng ta phóng to, thu nhỏ, thu nhỏ

21354
20:23:22,461 --> 20:23:26,122
Chúng tôi không ở trên con phố đó, nhưng\nở đó, ồ, thực ra là nó ở đó.

21355
20:23:26,122 --> 20:23:27,832
Có một điểm đánh dấu nó đã đặt cho chúng tôi.

21356
20:23:27,831 --> 20:23:30,118
Chúng tôi thực sự đang ở đây tại Memorial Hall.

21357
20:23:30,119 --> 20:23:32,452
Vì vậy, tất cả những điều đó đều xảy ra với JavaScript,\nnhưng sự hiểu biết cơ bản

21358
20:23:32,452 --> 20:23:34,252
của DOM và mô hình đối tượng\ndocument

21359
20:23:34,251 --> 20:23:36,481
chúng ta sẽ tiếp tục nơi\nchúng ta đã dừng lại vào tuần tới.

21360
20:24:57,172 --> 20:25:01,222
Đây là CS50 và đây là\ntuần thứ chín, và thế là xong

21361
20:25:01,221 --> 20:25:03,471
về mặt cơ bản của lập trình.

21362
20:25:03,471 --> 20:25:06,250
Ngày nay, chúng ta đã đến khá đầy đủ\nvới rất nhiều ngôn ngữ

21363
20:25:06,250 --> 20:25:08,542
mà chúng tôi đã xem xét\ntrong nhiều tuần qua.

21364
20:25:08,542 --> 20:25:11,512
Và với HTML và CSS\nand JavaScript vào tuần trước

21365
20:25:11,512 --> 20:25:14,782
chúng ta sẽ thêm lại vào\nhỗn hợp Python và SQL.

21366
20:25:14,782 --> 20:25:18,182
Và cùng với đó, liệu chúng ta có\nkhả năng lập trình cho web hay không.

21367
20:25:18,182 --> 20:25:20,601
Và mặc dù đây không phải\ngiao diện người dùng duy nhất

21368
20:25:20,601 --> 20:25:23,691
ở đó, ngày càng-- hoặc mọi người\n

21369
20:25:23,691 --> 20:25:26,721
và một trình duyệt để truy cập các ứng dụng\nmà mọi người đã viết

21370
20:25:26,721 --> 20:25:31,311
nhưng nó cũng ngày càng trở thành cách\n

21371
20:25:31,312 --> 20:25:33,532
Có những ngôn ngữ\nđược gọi là Swift dành cho iOS

21372
20:25:33,532 --> 20:25:35,692
có những ngôn ngữ\ngọi là Java dành cho Android

21373
20:25:35,691 --> 20:25:38,512
nhưng các ứng dụng mã hóa\ncả hai ngôn ngữ đó

21374
20:25:38,512 --> 20:25:42,292
có nghĩa là biết nhiều ngôn ngữ gấp đôi,\n

21375
20:25:42,952 --> 20:25:45,502
Vì vậy, chúng ta ngày càng nhận thấy\ntốt hơn hay tồi tệ hơn

21376
20:25:45,501 --> 20:25:47,601
rằng thế giới đang bắt đầu\nthực sự chuẩn hóa

21377
20:25:47,601 --> 20:25:51,501
ít nhất là trong số tiếp theo\n

21378
20:25:51,501 --> 20:25:55,491
kết hợp với các ngôn ngữ khác như\n

21379
20:25:55,491 --> 20:25:57,929
Và hôm nay, chúng ta sẽ kết hợp\na tất cả những thứ đó lại với nhau

21380
20:25:57,929 --> 20:26:00,471
và cung cấp cho bạn\ncông cụ cuối cùng trong bộ công cụ của bạn

21381
20:26:00,471 --> 20:26:03,051
giải quyết các dự án cuối cùng để\nbước vào thế giới thực

21382
20:26:03,051 --> 20:26:05,961
cuối cùng và bằng cách nào đó giải quyết được các vấn đề về lập trình.

21383
20:26:05,961 --> 20:26:11,072
Nhưng hôm nay chúng ta cần một công cụ bổ sung,\n

21384
20:26:11,072 --> 20:26:14,239
Đây chỉ là một chương trình\ncó trên một số máy tính nhất định

21385
20:26:14,239 --> 20:26:16,072
mà bạn có thể cài đặt\nmiễn phí, tình cờ là

21386
20:26:16,072 --> 20:26:18,741
được viết bằng ngôn ngữ có tên\nJavaScript, nhưng đó là một chương trình

21387
20:26:18,741 --> 20:26:22,101
mà chúng tôi đang sử dụng để\nchạy máy chủ web trong VSCO.

21388
20:26:22,101 --> 20:26:24,932
Nhưng bạn có thể chạy nó trên\nMac hoặc PC của riêng bạn hoặc bất kỳ nơi nào khác.

21389
20:26:24,932 --> 20:26:28,702
Nhưng tất cả những gì máy chủ\nHTTP cụ thể này làm là

21390
20:26:28,702 --> 20:26:32,512
cung cấp nội dung tĩnh\nnhư tệp HTML, tệp CSS

21391
20:26:32,512 --> 20:26:36,982
Tệp JavaScript, có thể là hình ảnh, có thể\n

21392
20:26:36,982 --> 20:26:41,362
Nó không có khả năng tương tác thực sự\n

21393
20:26:41,361 --> 20:26:46,561
Bạn có thể tạo một biểu mẫu web và phục vụ\n

21394
20:26:46,562 --> 20:26:50,392
nhưng nếu con người nhập dữ liệu vào\n

21395
20:26:50,392 --> 20:26:53,842
gửi nó đi nơi khác như\n

21396
20:26:53,842 --> 20:26:56,961
nó thực sự sẽ không đi đâu cả\n

21397
20:26:56,961 --> 20:26:59,221
xử lý các yêu cầu đến.

21398
20:26:59,221 --> 20:27:02,151
Vì vậy hôm nay chúng tôi sẽ giới thiệu\nan loại máy chủ khác

21399
20:27:02,152 --> 20:27:06,112
đi kèm với Python cho phép\nus không chỉ phục vụ các trang web

21400
20:27:06,111 --> 20:27:07,731
mà còn xử lý đầu vào của người dùng.

21401
20:27:07,732 --> 20:27:11,482
Và nhớ lại rằng tất cả thông tin đầu vào đó là\n

21402
20:27:11,482 --> 20:27:14,062
hoặc sâu hơn là bên trong\nnhững phong bì ảo đó.

21403
20:27:14,062 --> 20:27:17,902
Đây là URL chuẩn mà chúng ta đã nói chuyện\n

21404
20:27:20,042 --> 20:27:23,782
Và tôi đã đánh dấu dấu gạch chéo thành\n

21405
20:27:23,782 --> 20:27:26,302
giống như thư mục mặc định\nở đâu đó, có lẽ là có

21406
20:27:26,301 --> 20:27:29,911
một tệp có tên là index.html\cũng như một tệp khác trong đó.

21407
20:27:29,911 --> 20:27:32,122
Nếu không, bạn có thể có\na đề cập rõ ràng hơn

21408
20:27:32,122 --> 20:27:34,551
của tệp thực tế có tên file.html.

21409
20:27:34,551 --> 20:27:37,634
Bạn có thể có các thư mục, như bạn có thể\n

21410
20:27:38,134 --> 20:27:40,221
Bạn có thể có các tệp trong\nthư mục như thế này và những

21411
20:27:40,221 --> 20:27:44,091
đều là những ví dụ về những gì một lập trình viên\n

21412
20:27:44,092 --> 20:27:45,922
Vì vậy, nó có thể không chỉ\nlà một từ duy nhất, nó

21413
20:27:45,922 --> 20:27:49,832
có thể có nhiều dấu gạch chéo và nhiều\n

21414
20:27:49,831 --> 20:27:51,831
Nhưng đây chỉ là\nthường được gọi là đường dẫn.

21415
20:27:51,831 --> 20:27:54,470
Nhưng có một thuật ngữ khác của chúng tôi,\nvề cơ bản là tương đương

21416
20:27:54,471 --> 20:27:55,652
mà chúng tôi sẽ giới thiệu hôm nay.

21417
20:27:55,652 --> 20:27:59,062
Đây cũng đồng nghĩa\nđược gọi là một tuyến đường, có thể

21418
20:27:59,062 --> 20:28:03,022
một mô tả chung chung hơn về cái gì\n

21419
20:28:03,021 --> 20:28:05,512
họ không cần phải\nánh xạ tới, nghĩa là tham khảo

21420
20:28:05,512 --> 20:28:08,572
vào một thư mục cụ thể\hay một tập tin cụ thể, bạn

21421
20:28:08,572 --> 20:28:11,095
có thể tìm ra các tuyến đường\hiện tại của bạn trong một trang web.

21422
20:28:11,095 --> 20:28:13,762
Và chỉ cần đảm bảo rằng khi\nngười dùng truy cập vào đó, bạn đưa cho họ

21423
20:28:14,661 --> 20:28:17,369
Nếu họ ghé thăm nơi khác, bạn\n

21424
20:28:17,369 --> 20:28:20,241
Nó không nhất thiết phải ánh xạ tới một\n

21425
20:28:20,241 --> 20:28:23,421
Và nếu bạn muốn nhận thông tin đầu vào từ\n

21426
20:28:23,422 --> 20:28:28,222
như q=cats, bạn có thể thêm câu hỏi\n

21427
20:28:28,221 --> 20:28:32,061
Khóa hoặc tên tham số HTTP\n

21428
20:28:32,062 --> 20:28:35,025
và sau đó là giá trị tổng bằng\ncó lẽ là do con người đã nhập vào.

21429
20:28:35,024 --> 20:28:37,191
Nếu bạn có nhiều hơn những thứ này,\nbạn có thể đặt dấu và

21430
20:28:37,191 --> 20:28:41,902
và sau đó nhiều khóa hơn sẽ bằng các cặp giá trị\n

21431
20:28:41,902 --> 20:28:46,532
Tuy nhiên, điều đáng chú ý là việc sử dụng\n

21432
20:28:46,532 --> 20:28:51,682
chúng tôi thực sự không có khả năng\n

21433
20:28:53,601 --> 20:28:56,661
Bạn có thể đã thêm câu hỏi\n

21434
20:28:56,661 --> 20:29:00,561
tới bất kỳ URL nào trong trang chủ\ncủa bạn để giải quyết vấn đề thứ tám

21435
20:29:00,562 --> 20:29:04,222
nhưng nó không thực sự làm được điều gì hữu ích, nhất thiết

21436
20:29:04,221 --> 20:29:06,111
trừ khi bạn sử dụng một số JavaScript ưa thích.

21437
20:29:06,111 --> 20:29:09,241
Máy chủ sẽ không làm phiền\thậm chí không tìm kiếm điều đó cho bạn.

21438
20:29:09,241 --> 20:29:12,141
Nhưng hôm nay chúng ta sẽ\giới thiệu một chút về Python.

21439
20:29:12,142 --> 20:29:15,982
Và trên thực tế, chúng ta sẽ sử dụng một trang web\n

21440
20:29:15,982 --> 20:29:19,312
chỉ sử dụng máy chủ HTTP,\nmột cách tự động, cho bạn

21441
20:29:19,312 --> 20:29:22,192
tìm kiếm bất kỳ cặp giá trị khóa nào\nsau dấu chấm hỏi

21442
20:29:22,191 --> 20:29:25,881
rồi đưa chúng cho bạn dưới dạng\nmột cuốn từ điển Python.

21443
20:29:25,881 --> 20:29:29,781
Hãy nhớ lại rằng một từ điển trong Python, a\n

21444
20:29:29,782 --> 20:29:33,917
Điều đó có vẻ hoàn toàn phù hợp\nvới những loại thông số này.

21445
20:29:33,917 --> 20:29:36,292
Và bạn sẽ không phải\ntự viết mã đó.

21446
20:29:36,292 --> 20:29:39,902
Nó sẽ được trao cho bạn bởi\n

21447
20:29:39,902 --> 20:29:41,782
Vì vậy, đây sẽ là\nthứ hai trong hai khung

21448
20:29:41,782 --> 20:29:43,324
thực sự, mà chúng tôi nhìn thấy trong lớp.

21449
20:29:43,323 --> 20:29:46,011
Và một khung công tác về cơ bản là\na một loạt các thư viện

21450
20:29:46,012 --> 20:29:48,502
mà người khác đã viết\nvà một tập hợp các quy ước

21451
20:29:48,501 --> 20:29:49,951
do đó, để làm việc.

21452
20:29:49,952 --> 20:29:52,762
Vì vậy, những ai thực sự bắt đầu tìm hiểu về Bootstrap

21453
20:29:52,762 --> 20:29:56,441
tuần vừa qua để làm nhà cho bạn\n

21454
20:29:58,211 --> 20:30:01,872
Chà, bạn đang sử dụng thư viện, hãy viết mã\n

21455
20:30:01,872 --> 20:30:04,961
có thể một số JavaScript\n

21456
20:30:04,961 --> 20:30:08,741
Nhưng nó cũng là một khuôn khổ trong\n

21457
20:30:08,741 --> 20:30:11,262
Bạn phải sử dụng Bootstraps\nclasses và bạn

21458
20:30:11,262 --> 20:30:15,582
phải bố trí các div hoặc\ncác nhịp của bạn hoặc các thẻ bảng của bạn

21459
20:30:15,581 --> 20:30:17,424
theo cách thân thiện với Bootstrap.

21460
20:30:17,425 --> 20:30:19,842
Và nó không quá rắc rối, nhưng\nbạn đang tuân theo các quy ước

21461
20:30:19,842 --> 20:30:21,682
mà một nhóm người đã tiêu chuẩn hóa.

21462
20:30:21,682 --> 20:30:25,422
Tương tự như vậy, trong thế giới\nPython, có một framework nào khác

21463
20:30:25,422 --> 20:30:26,802
chúng ta sẽ bắt đầu sử dụng ngay hôm nay.

21464
20:30:26,801 --> 20:30:30,191
Và trong khi Bootstrap\nđược sử dụng cho CSS và JavaScript

21465
20:30:30,191 --> 20:30:32,231
Flask sẽ được sử dụng cho Python.

21466
20:30:32,232 --> 20:30:34,932
Và nó chỉ giải quyết được rất nhiều\nvấn đề phổ biến cho chúng ta.

21467
20:30:34,932 --> 20:30:38,142
Điều này sẽ giúp chúng tôi\nphân tích các URL dễ dàng hơn

21468
20:30:38,142 --> 20:30:40,782
và nhận các cặp giá trị khóa,\nit sẽ khiến việc này trở nên dễ dàng hơn

21469
20:30:40,782 --> 20:30:43,872
để chúng tôi tìm thấy các tệp hoặc\nhình ảnh mà con người muốn

21470
20:30:43,872 --> 20:30:45,312
để xem khi truy cập trang web của chúng tôi.

21471
20:30:45,312 --> 20:30:48,204
Nó thậm chí còn giúp việc gửi email tự động trở nên dễ dàng hơn\n

21472
20:30:48,203 --> 20:30:49,661
giống như khi ai đó điền vào một mẫu đơn.

21473
20:30:49,661 --> 20:30:52,971
Bạn cũng có thể tự động sử dụng mã\nsgửi email cho họ.

21474
20:30:52,971 --> 20:30:55,271
Vì vậy, Flask và cùng với nó\nmột số thư viện liên quan

21475
20:30:55,271 --> 20:30:58,512
nó sẽ khiến những việc\nnhư thế trở nên dễ dàng hơn đối với chúng tôi.

21476
20:30:58,512 --> 20:31:03,101
Và để làm được điều này, tất cả những gì chúng ta phải làm\n

21477
20:31:03,101 --> 20:31:05,211
yêu cầu của khuôn khổ này.

21478
20:31:05,211 --> 20:31:08,411
Chúng ta sẽ phải tạo một\n

21479
20:31:08,411 --> 20:31:11,411
đây là nơi ứng dụng web hoặc\nứng dụng của chúng tôi sẽ hoạt động.

21480
20:31:11,411 --> 20:31:15,881
Nếu chúng tôi có bất kỳ thư viện nào mà chúng tôi muốn\n

21481
20:31:15,881 --> 20:31:19,512
là có một tệp văn bản\nrất đơn giản có tên là require.txt

21482
20:31:19,512 --> 20:31:21,851
nơi bạn liệt kê tên\ncủa các thư viện đó

21483
20:31:21,851 --> 20:31:26,652
từ trên xuống dưới, trong tệp văn bản đó,\n

21484
20:31:26,652 --> 20:31:30,411
hoặc các câu lệnh nhập khẩu mà chúng tôi\n

21485
20:31:30,411 --> 20:31:33,461
Chúng ta sẽ có một thư mục tĩnh\n hoặc thư mục tĩnh,

21486
20:31:33,461 --> 20:31:36,611
có nghĩa là bất kỳ tệp nào bạn tạo\nare sẽ không bao giờ thay đổi

21487
20:31:36,611 --> 20:31:39,203
như hình ảnh, tệp CSS,\ntệp JavaScript

21488
20:31:39,203 --> 20:31:40,661
họ sẽ đi vào thư mục này.

21489
20:31:40,661 --> 20:31:43,512
Và cuối cùng, bất kỳ\nHTML nào bạn viết

21490
20:31:43,512 --> 20:31:45,911
các trang web mà bạn muốn\nhuman xem, đang diễn ra

21491
20:31:45,911 --> 20:31:47,751
để vào một thư mục có tên là mẫu.

21492
20:31:47,751 --> 20:31:50,711
Vì vậy, một lần nữa, đây là bằng chứng về\ný nghĩa của chúng tôi khi gọi một khuôn khổ.

21493
20:31:50,711 --> 20:31:52,512
Bạn có phải làm một ứng dụng web như thế này không?

21494
20:31:52,512 --> 20:31:54,702
Không, nhưng nếu bạn đang sử dụng\nkhuôn khổ cụ thể này

21495
20:31:54,702 --> 20:31:58,752
đây là điều mọi người quyết định\nsẽ là quy ước của con người.

21496
20:31:58,751 --> 20:32:02,961
Nếu bạn đã nghe nói về các framework khác như\n

21497
20:32:02,961 --> 20:32:06,131
chỉ có những quy ước khác nhau\n

21498
20:32:06,131 --> 20:32:10,152
Flask là một\nmicroframework rất hay chỉ vậy thôi.

21499
20:32:10,152 --> 20:32:13,631
Tất cả những gì bạn phải làm là tuân thủ\n

21500
20:32:13,631 --> 20:32:16,601
để thiết lập và chạy một số mã.

21501
20:32:16,601 --> 20:32:19,381
Được rồi, hãy tiếp tục và tạo một ứng dụng web.

21502
20:32:19,381 --> 20:32:21,131
Hãy để tôi tiếp tục và\nchuyển sang Mã VS

21503
20:32:21,131 --> 20:32:23,173
đây, và hãy để tôi thực hành\nnhững gì tôi đang giảng ở đây

21504
20:32:25,482 --> 20:32:29,172
Và hãy tiếp tục tạo\nan ứng dụng rất đơn giản

21505
20:32:29,172 --> 20:32:31,461
có thể, nói xin chào với người dùng.

21506
20:32:31,461 --> 20:32:35,922
Vì vậy, điều gì đó ban đầu không phải là tất cả\n

21507
20:32:35,922 --> 20:32:37,882
Nhưng chúng tôi sẽ phát triển dựa trên điều đó\na mà chúng tôi vẫn luôn làm.

21508
20:32:37,881 --> 20:32:41,861
Vậy trong app.py, điều tôi sẽ làm\n

21509
20:32:41,861 --> 20:32:43,182
Tôi đã có trên màn hình trước đó.

21510
20:32:43,182 --> 20:32:49,601
Từ Flask, nhập Flask, có chữ hoa\n

21511
20:32:49,601 --> 20:32:52,152
Và tôi cũng sẽ\nnhập trước

21512
20:32:52,152 --> 20:32:56,202
một vài chức năng,\nkết xuất mẫu và yêu cầu.

21513
20:32:56,202 --> 20:32:58,122
Thông tin thêm về những điều đó chỉ sau một chút.

21514
20:32:58,122 --> 20:33:00,762
Và dưới mức đó, tôi sẽ\nnói, hãy tiếp tục và làm điều này.

21515
20:33:00,762 --> 20:33:03,491
Hãy cho tôi một trang web-- một\nứng dụng được gọi là biến

21516
20:33:03,491 --> 20:33:07,691
sẽ là kết quả của việc gọi\n

21517
20:33:07,691 --> 20:33:10,161
câu thần chú kỳ lạ này đây, tên.

21518
20:33:10,161 --> 20:33:13,572
Vậy là chúng ta đã thấy điều này vài tuần trước\n

21519
20:33:13,572 --> 20:33:16,301
và chúng tôi đã có nội dung chính đó\na ở cuối màn hình.

21520
20:33:16,301 --> 20:33:21,851
Hiện tại, chỉ cần biết rằng __name__\n

21521
20:33:21,851 --> 20:33:26,322
Và dòng này ở đây, đơn giản như\n

21522
20:33:26,322 --> 20:33:30,072
biến tập tin này thành một ứng dụng Flask.

21523
20:33:30,072 --> 20:33:33,792
Bình là một hàm chỉ tính toán\n

21524
20:33:33,792 --> 20:33:37,392
Điều cuối cùng tôi sẽ làm cho việc này\n

21525
20:33:37,392 --> 20:33:41,052
Tôi sắp nói rằng tôi\nsẽ có một hàm tên là

21526
20:33:41,051 --> 20:33:42,971
chỉ mục không có đối số.

21527
20:33:42,971 --> 20:33:44,891
Và bất cứ khi nào hàm\n này được gọi, tôi muốn

21528
20:33:44,892 --> 20:33:50,322
để trả về kết quả hiển thị\na mẫu có tên là index.html.

21529
20:33:51,277 --> 20:33:53,652
Vì vậy, giả sử có một tệp\nở đâu đó, chưa được tạo

21530
20:33:55,482 --> 20:33:57,702
Nhưng render template\ncó nghĩa là render file này

21531
20:33:57,702 --> 20:34:01,162
có thể nói như vậy được in ra màn hình của người dùng.

21532
20:34:01,161 --> 20:34:03,971
Điều cuối cùng tôi sắp làm\nlàm là tôi phải nói với Flask

21533
20:34:03,971 --> 20:34:06,261
khi nào nên gọi hàm chỉ mục này.

21534
20:34:06,262 --> 20:34:11,927
Và vì vậy tôi sẽ bảo nó xác định\n

21535
20:34:13,029 --> 20:34:15,072
Vì vậy, hãy xem\nnhững gì tôi vừa tạo ở đây.

21536
20:34:15,072 --> 20:34:18,042
Đây là cú pháp hơi mới, và\nit thực sự là điều kỳ lạ duy nhất

21537
20:34:18,042 --> 20:34:19,812
mà chúng ta sẽ có hôm nay bằng Python.

21538
20:34:19,812 --> 20:34:22,512
Đây là những gì được biết đến trong Python\nis, cái được gọi là trang trí.

21539
20:34:22,512 --> 20:34:24,521
Trình trang trí là một\nloại hàm đặc biệt

21540
20:34:24,521 --> 20:34:27,072
về cơ bản nó sửa đổi\nanother chức năng.

21541
20:34:27,072 --> 20:34:30,111
Vì mục đích của chúng ta, chỉ cần biết\nrằng ở dòng sáu có ghi

21542
20:34:30,111 --> 20:34:33,461
này Python, hãy xác định lộ trình\ncho dấu gạch chéo, mặc định

21543
20:34:33,461 --> 20:34:35,262
trang trên ứng dụng trang web của tôi.

21544
20:34:35,262 --> 20:34:37,661
Hai dòng tiếp theo, bảy\nvà tám, nói, này Python

21545
20:34:37,661 --> 20:34:40,391
định nghĩa một hàm có tên\nindex, không có đối số.

21546
20:34:40,392 --> 20:34:45,282
Và điều duy nhất bạn nên làm là\n

21547
20:34:48,411 --> 20:34:51,461
Vì vậy, thực sự, câu hỏi tiếp theo,\n

21548
20:34:55,251 --> 20:34:56,991
Được rồi, hãy để tôi tiếp tục và làm điều đó tiếp theo.

21549
20:34:56,991 --> 20:35:00,262
Hãy để tôi tạo một thư mục có tên\ntemplates, thực hành lại

21550
20:35:01,521 --> 20:35:04,281
Vì vậy, tôi sẽ tạo một thư mục\nempty mới có tên là templates

21551
20:35:04,282 --> 20:35:08,002
Tôi sẽ đi tới\nCD vào thư mục đó

21552
20:35:08,001 --> 20:35:11,661
và sau đó thực hiện mã của index.html.

21553
20:35:11,661 --> 20:35:13,281
Vì vậy, đây sẽ là trang chỉ mục của tôi.

21554
20:35:13,282 --> 20:35:16,227
Và tôi sẽ tạo một trang web rất\nđơn giản, loại tài liệu HTML.

21555
20:35:16,226 --> 20:35:18,351
Tôi chỉ định mượn\nmột số thứ từ tuần trước.

21556
20:35:18,351 --> 20:35:20,601
Ngôn ngữ HTML tương đương với tiếng Anh.

21557
20:35:21,771 --> 20:35:25,491
Sau đó tôi sẽ tạo thẻ đầu, tôi sẽ tạo meta\n

21558
20:35:25,491 --> 20:35:28,012
Điều này làm cho trang web của tôi được phản hồi nhanh chóng.

21559
20:35:28,012 --> 20:35:30,741
Tức là nó chỉ lớn lên và thu nhỏ\nđể phù hợp với kích thước của thiết bị.

21560
20:35:30,741 --> 20:35:34,221
Thang đo ban đầu sẽ diễn ra\n

21561
20:35:34,221 --> 20:35:36,261
sẽ là chiều rộng của thiết bị.

21562
20:35:36,262 --> 20:35:38,301
Vì vậy tôi đang đánh máy cái này\nTôi đã in nó ra đây.

21563
20:35:38,301 --> 20:35:40,251
Đây là thứ tôi thường sao chép và dán.

21564
20:35:40,251 --> 20:35:42,951
Nhưng cuối cùng, tôi sẽ\nthêm tiêu đề của mình vào, nó sẽ chỉ

21565
20:35:42,952 --> 20:35:44,512
Xin chào tên của ứng dụng này.

21566
20:35:46,402 --> 20:35:50,271
Nội dung của thẻ này sẽ--

21567
20:35:51,232 --> 20:35:54,902
Thay vào đó, phần nội dung của trang này\nsẽ chỉ là thế giới dấu phẩy xin chào.

21568
20:35:54,902 --> 20:35:58,441
Rất không thú vị và thực sự là\n

21569
20:35:58,441 --> 20:36:01,792
Nhưng bây giờ chúng ta hãy thử nghiệm\nvới hai tệp này.

21570
20:36:01,792 --> 20:36:03,652
Tôi sẽ không bận tâm\nvới một thư mục tĩnh

21571
20:36:03,652 --> 20:36:06,652
ngay bây giờ, vì tôi không có\n

21572
20:36:06,652 --> 20:36:08,752
Không có hình ảnh, không có CSS, không có gì như thế.

21573
20:36:08,751 --> 20:36:11,761
Và thành thật mà nói, require.txt\nis sẽ khá đơn giản.

21574
20:36:11,762 --> 20:36:15,562
Tôi sẽ truy cập vào trang require.txt và\n

21575
20:36:15,562 --> 20:36:18,952
truy cập vào chính thư viện Flask.

21576
20:36:18,952 --> 20:36:21,952
Được rồi, nhưng đó là điều duy nhất\n

21577
20:36:21,952 --> 20:36:27,232
Được rồi, bây giờ tôi có hai tệp,\n

21578
20:36:27,232 --> 20:36:30,711
Nhưng cảm ơn bạn, index.html nằm\nằm trong thư mục mẫu của tôi

21579
20:36:30,711 --> 20:36:33,211
vậy làm cách nào để tôi thực sự khởi động\na máy chủ web vào tuần trước

21580
20:36:33,211 --> 20:36:34,491
Tôi đã có thể nói máy chủ HTTP.

21581
20:36:34,491 --> 20:36:36,831
Nhưng máy chủ HTTP không phải là thứ Python.

21582
20:36:36,831 --> 20:36:41,152
Nó không biết gì về Flask hay\nPython hay bất cứ thứ gì tôi vừa viết.

21583
20:36:41,152 --> 20:36:43,982
Máy chủ HTTP sẽ chỉ xuất ra các tệp tĩnh.

21584
20:36:43,982 --> 20:36:47,286
Vì vậy, nếu tôi chạy máy chủ HTTP và\nsau đó tôi nhấp vào app.py

21585
20:36:47,286 --> 20:36:49,251
Tôi thực sự sẽ thấy mã Python của mình.

21586
20:36:49,251 --> 20:36:53,421
Nó sẽ không được thực thi vì HTTP\n

21587
20:36:53,422 --> 20:36:57,502
Nhưng hôm nay, tôi sẽ chạy\n

21588
20:36:57,501 --> 20:37:01,251
Vì vậy, framework Flask này mà thực tế tôi đã cài đặt trước

21589
20:37:01,251 --> 20:37:04,941
nên việc tôi\n thực sự không cần thiết

21590
20:37:04,941 --> 20:37:08,902
chưa, đi kèm với một chương trình tên là Flask,\n

21591
20:37:08,902 --> 20:37:12,472
từ chạy và khi tôi làm điều đó, bạn sẽ\n

21592
20:37:12,471 --> 20:37:14,661
tuần mà bạn sẽ thấy tên--

21593
20:37:14,661 --> 20:37:17,629
URL của bạn để có bản xem trước duy nhất của bạn về điều đó.

21594
20:37:17,629 --> 20:37:20,211
Bạn có thể thấy một cửa sổ bật lên cho biết\nứng dụng của bạn đang chạy

21595
20:37:20,211 --> 20:37:22,161
trên cổng TCP, cái gì đó hoặc cái khác.

21596
20:37:22,161 --> 20:37:24,591
Theo mặc định, tuần trước\nchúng tôi đã sử dụng cổng 8080.

21597
20:37:24,592 --> 20:37:27,622
Flask, chỉ vì, thích cổng 5.000 hơn.

21598
20:37:28,702 --> 20:37:31,432
Tôi sẽ tiếp tục\nvà mở URL này ngay bây giờ.

21599
20:37:31,432 --> 20:37:33,652
Và một khi nó xác thực\nvà chuyển hướng tôi

21600
20:37:33,652 --> 20:37:37,222
chỉ để đảm bảo rằng tôi được phép truy cập\n

21601
20:37:37,221 --> 20:37:40,221
Thì đấy, có phạm vi\ncủa ứng dụng này.

21602
20:37:40,221 --> 20:37:43,911
Nếu tôi xem nguồn bằng cách nhấp chuột phải\cũng không nhấp chuột điều khiển

21603
20:37:43,911 --> 20:37:45,891
có HTML của tôi đã bị loại bỏ.

21604
20:37:45,892 --> 20:37:48,832
Thực ra, tôi vừa phát minh lại\nbánh xe từ tuần trước

21605
20:37:48,831 --> 20:37:51,271
bởi vì không có sự năng động\nbây giờ, không có gì cả.

21606
20:37:52,968 --> 20:37:54,801
Hãy để tôi đóng nguồn\nvà để tôi thu nhỏ.

21607
20:37:56,422 --> 20:37:59,601
Hãy để tôi phóng to ngay bây giờ và tôi có\na một URL khó hiểu rất độc đáo.

21608
20:37:59,601 --> 20:38:01,581
Nhưng vấn đề là\nit kết thúc mà không có kết quả gì.

21609
20:38:01,581 --> 20:38:03,801
Hoặc ngầm nó kết thúc bằng dấu gạch chéo.

21610
20:38:03,801 --> 20:38:05,691
Đây chỉ là Chrome\ncó ích một chút thôi.

21611
20:38:05,691 --> 20:38:08,762
Nó không cần hiển thị cho bạn một dấu gạch chéo,\n

21612
20:38:08,762 --> 20:38:14,872
Nhưng hãy để tôi làm điều gì đó rõ ràng như\n

21613
20:38:14,872 --> 20:38:17,241
Vậy là có một giá trị khóa\npair mà tôi đã tự tay tạo

21614
20:38:17,241 --> 20:38:20,661
gõ vào thanh URL của tôi và nhấn Enter.

21615
20:38:20,661 --> 20:38:22,161
Không có gì xảy ra, không có gì thay đổi.

21616
20:38:23,661 --> 20:38:27,982
Nhưng cơ hội hôm nay là\n

21617
20:38:27,982 --> 20:38:31,172
từ URL đó và bắt đầu\nhiển thị nó cho người dùng.

21618
20:38:31,172 --> 20:38:35,372
Vì vậy, hãy để tôi quay lại đây\ncửa sổ terminal và mã của tôi.

21619
20:38:35,372 --> 20:38:37,822
Hãy để tôi di chuyển nó xuống\ndưới cùng ở đó.

21620
20:38:37,822 --> 20:38:41,042
Và nếu tôi muốn\nnói, huh, xin chào, tên.

21621
20:38:41,042 --> 20:38:42,771
Lý tưởng nhất là tôi muốn nói điều gì đó như--

21622
20:38:42,771 --> 20:38:44,391
Tôi không muốn viết mã cứng\nDavid vì thế thì không bao giờ

21623
20:38:44,392 --> 20:38:46,282
sẽ chào người khác.

21624
20:38:46,282 --> 20:38:51,772
Tôi muốn đặt như một tên biến\n

21625
20:38:51,771 --> 20:38:55,311
Nhưng đó không phải là thẻ HTML nên tôi\ncần một loại phần giữ chỗ nào đó.

21626
20:38:57,441 --> 20:39:02,572
Nếu tôi quay lại mã Python của mình, tôi có thể\n

21627
20:39:02,572 --> 20:39:06,562
Và tôi có thể yêu cầu Flask thực hiện\nyêu cầu hiện tại

21628
20:39:06,562 --> 20:39:10,432
vào các đối số của nó, đó là\nURL, như chúng được gọi

21629
20:39:10,432 --> 20:39:14,721
và nhận bất kỳ giá trị nào của\ntham số được gọi là tên.

21630
20:39:14,721 --> 20:39:16,792
Điều đó đặt nó vào một biến cho tôi.

21631
20:39:16,792 --> 20:39:19,702
Và sau đó, trong mẫu kết xuất--\nđây là một trong những chức năng đó

21632
20:39:19,702 --> 20:39:21,562
điều đó có thể có nhiều hơn một đối số.

21633
20:39:21,562 --> 20:39:23,542
Nếu cần một\lý lẽ khác, bạn có thể vượt qua

21634
20:39:23,542 --> 20:39:25,502
trong tên của bất kỳ biến nào bạn muốn.

21635
20:39:25,501 --> 20:39:29,971
Vì vậy nếu tôi muốn chuyển tên của mình, tôi\n

21636
20:39:29,971 --> 20:39:34,731
Vậy đây là tên của một biến\n

21637
20:39:34,732 --> 20:39:39,682
Đây là biến thực tế\ntôi muốn lấy giá trị từ đó.

21638
20:39:39,682 --> 20:39:45,682
Và cuối cùng, trong index.html của tôi,\n

21639
20:39:45,682 --> 20:39:49,792
là thực hiện hai dấu ngoặc nhọn và\nsau đó đặt tên của biến

21640
20:39:51,354 --> 20:39:53,622
Vì vậy, đây là ý nghĩa của mẫu.

21641
20:39:53,622 --> 20:39:56,711
Mẫu giống như một bản thiết kế\trong thế giới thực, nơi

21642
20:39:56,711 --> 20:39:58,842
đó là kế hoạch để làm một cái gì đó

21643
20:39:58,842 --> 20:40:02,711
Đây là kế hoạch tạo một trang web\n

21644
20:40:02,711 --> 20:40:06,221
nhưng có phần giữ chỗ này với\nhai dấu ngoặc nhọn ở đây và ở đây

21645
20:40:06,221 --> 20:40:10,641
có nghĩa là hãy tiếp tục và cắm\n

21646
20:40:10,642 --> 20:40:13,212
Vì vậy, theo nghĩa này, nó tương tự\nin tinh thần với chuỗi f của chúng ta

21647
20:40:13,211 --> 20:40:14,741
hoặc định dạng chuỗi trong Python.

21648
20:40:14,741 --> 20:40:17,658
Cú pháp hơi khác một chút\nchỉ vì những người biết điều

21649
20:40:17,658 --> 20:40:19,991
không đồng ý, những người khác nhau\ncác khuôn khổ khác nhau xuất hiện

21650
20:40:19,991 --> 20:40:21,116
với những quy ước khác nhau.

21651
20:40:21,116 --> 20:40:23,982
Quy ước trong Flask,\ncác mẫu của họ

21652
20:40:23,982 --> 20:40:26,442
là sử dụng hai dấu ngoặc nhọn ở đây.

21653
20:40:26,441 --> 20:40:28,721
Hy vọng là bạn,\nngười lập trình, sẽ không bao giờ

21654
20:40:28,721 --> 20:40:32,241
muốn hiển thị hai dấu ngoặc nhọn trong trang web thực tế của bạn.

21655
20:40:32,241 --> 20:40:34,432
Nhưng ngay cả khi bạn làm vậy thì\n vẫn có cách giải quyết.

21656
20:40:35,572 --> 20:40:39,012
Vì vậy bây giờ hãy để tôi tiếp tục và quay lại tab trình duyệt của tôi tại đây.

21657
20:40:39,012 --> 20:40:41,922
Trước đây, mặc dù\ntôi đã thêm tên bằng David

21658
20:40:41,922 --> 20:40:44,952
vào cuối URL có câu hỏi\n

21659
20:40:44,952 --> 20:40:47,682
Nhưng bây giờ, hy vọng rằng, nếu\ntôi thực hiện những thay đổi này

21660
20:40:47,682 --> 20:40:51,350
hãy để tôi tiếp tục và mở\nup cửa sổ terminal của tôi.

21661
20:40:51,350 --> 20:40:55,432
Hãy để tôi khởi động lại Flask để nó\ntải các thay đổi của tôi theo mặc định.

21662
20:40:55,432 --> 20:40:59,380
Hãy để tôi quay lại tab xin chào của tôi và\n

21663
20:41:01,001 --> 20:41:02,471
Và chúng ta bắt đầu, xin chào, David.

21664
20:41:02,471 --> 20:41:05,501
Bây giờ tôi có thể chơi xung quanh và tôi có thể thay đổi\n

21665
20:41:07,842 --> 20:41:10,552
Và bây giờ chúng ta có thứ gì đó năng động hơn.

21666
20:41:10,551 --> 20:41:14,741
Vì vậy, các phần mới ở đây là trong\nPython, chúng tôi có một số mã ở đây

21667
20:41:14,741 --> 20:41:18,551
cho phép chúng tôi truy cập,\ntheo chương trình, mọi thứ

21668
20:41:18,551 --> 20:41:20,711
đó là sau\ndấu chấm hỏi trong URL.

21669
20:41:20,711 --> 20:41:26,622
Và điều duy nhất chúng ta phải làm điều đó\n

21670
20:41:26,622 --> 20:41:28,452
Bạn và tôi không cần phải bận tâm tìm hiểu

21671
20:41:28,452 --> 20:41:30,869
dấu chấm hỏi ở đâu,\ndấu bằng ở đâu, ở đâu

21672
20:41:30,869 --> 20:41:32,442
có thể là các ký hiệu và

21673
20:41:32,441 --> 20:41:36,221
Khung công tác Flask\nthực hiện tất cả những điều đó cho chúng ta.

21674
20:41:36,221 --> 20:41:43,251
Được rồi, cho đến nay bạn có câu hỏi nào về\nnhững nguyên tắc này không?

21675
20:41:44,557 --> 20:41:50,142
ĐỐI TƯỢNG: Tại sao bạn lại nói\ndấu chấm hỏi trong URL?

21676
20:41:50,142 --> 20:41:52,572
DAVID: Tại sao bạn cần một\ndấu chấm hỏi trong URL?

21677
20:41:52,572 --> 20:41:59,152
Câu trả lời ngắn gọn chỉ vì thế\n

21678
20:41:59,152 --> 20:42:02,752
Nếu bạn đang thực hiện một yêu cầu NHẬN\ntừ trình duyệt đến máy chủ

21679
20:42:02,751 --> 20:42:07,451
quy ước, được tiêu chuẩn hóa bởi\n

21680
20:42:07,452 --> 20:42:11,152
sau cái gọi là tuyến đường hoặc\nđường dẫn, sau đó là dấu chấm hỏi.

21681
20:42:11,152 --> 20:42:13,601
Và nó phác họa những gì\nlà một phần của gốc hoặc đường dẫn

21682
20:42:13,601 --> 20:42:17,751
và phần\nđầu vào của con người ở bên phải là gì.

21683
20:42:19,226 --> 20:42:22,872
KHÁN GIẢ: Bạn có thể nói lại lần nữa tại sao\n

21684
20:42:23,372 --> 20:42:25,502
Đây là điều khó chịu\nvề Python.

21685
20:42:25,501 --> 20:42:29,551
Khi bạn truyền tham số,\nhai hàm có tên

21686
20:42:29,551 --> 20:42:32,471
bạn thường nói điều gì đó\nbằng điều gì đó khác.

21687
20:42:32,471 --> 20:42:35,042
Vì vậy, hãy để tôi thực hiện một điều chỉnh nhỏ ở đây.

21688
20:42:35,042 --> 20:42:39,372
Thế còn tôi nói tên người ở đây thì sao.

21689
20:42:39,372 --> 20:42:44,222
Điều này cho phép tôi phát minh ra biến\nown cho mẫu của mình

21690
20:42:44,221 --> 20:42:46,211
và gán cho nó giá trị của tên.

21691
20:42:46,211 --> 20:42:52,676
Tuy nhiên, bây giờ tôi phải vào\n

21692
20:42:57,072 --> 20:43:00,452
Và điều này thật ngu ngốc vì\nit dài dòng một cách không cần thiết.

21693
20:43:00,452 --> 20:43:04,442
Vì vậy điều mọi người thường làm là họ\n

21694
20:43:04,441 --> 20:43:08,361
chính nó, mặc dù phải thừa nhận rằng nó trông có vẻ\n

21695
20:43:08,361 --> 20:43:10,111
Thứ ở bên trái\no dấu bằng là

21696
20:43:10,111 --> 20:43:14,221
tên của biến bạn dự định sử dụng\n

21697
20:43:14,221 --> 20:43:16,231
là giá trị thực tế bạn đang gán cho nó.

21698
20:43:16,232 --> 20:43:18,092
Và điều này là do mục đích chung của nó.

21699
20:43:18,092 --> 20:43:21,332
Tôi có thể ghi đè điều này và tôi có thể\nnói điều gì đó như tên luôn

21700
20:43:21,331 --> 20:43:23,881
bằng Emma, bất kể\nbiến đó là gì.

21701
20:43:23,881 --> 20:43:26,191
Và bây giờ nếu tôi quay lại\ntrình duyệt của mình và tải lại

21702
20:43:26,191 --> 20:43:30,121
bất kể URL có gì,\nDavid hay Carter, Luôn luôn--

21703
20:43:34,142 --> 20:43:36,602
Ồ, tôi chưa thay đổi lại mẫu của mình.

21704
20:43:37,142 --> 20:43:40,412
Hãy để tôi đổi lại thành\ntên, để nó có tên ở đó

21705
20:43:41,342 --> 20:43:43,892
Nhưng tôi đã mã hóa\ntên của Emma nên bây giờ chúng ta

21706
20:43:43,892 --> 20:43:47,492
chỉ có thể gặp Emma bất kể tên ai trong URL.

21707
20:43:48,521 --> 20:43:51,781
Được rồi, vậy đây là\ngiao diện người dùng xấu.

21708
20:43:51,782 --> 20:43:54,692
Nếu, để nhận được lời chào\ntrong ngày, bạn, người dùng

21709
20:43:54,691 --> 20:43:57,182
phải thay đổi\nURL theo cách thủ công, điều mà chưa ai trong chúng tôi từng làm.

21710
20:43:57,182 --> 20:43:58,982
Đây không phải là cách các trang web hoạt động.

21711
20:43:58,982 --> 20:44:02,972
Cơ chế nào bình thường hơn\n

21712
20:44:02,971 --> 20:44:06,661
và tự động đặt nó vào\nURL đó?

21713
20:44:06,661 --> 20:44:09,542
Tuần trước chúng ta đã làm điều đó như thế nào?

21714
20:44:11,262 --> 20:44:15,952
ĐỐI TƯỢNG: Chúng tôi có thanh tìm kiếm\n và chúng tôi [KHÔNG NGHE ĐƯỢC] bạn có

21715
20:44:15,952 --> 20:44:22,101
để tạo ra thứ gì đó trong đó [KHÔNG NGHE ĐƯỢC].

21716
20:44:22,101 --> 20:44:25,732
DAVID: Được rồi, vậy là chúng tôi đã làm được điều gì đó trong\n

21717
20:44:25,732 --> 20:44:29,601
Và cụ thể, thẻ đó là gì\n

21718
20:44:30,831 --> 20:44:32,761
DAVID: Xin lỗi, to hơn một chút nhé?

21719
20:44:36,441 --> 20:44:38,792
DAVID: Vậy là thẻ đầu vào,\bên trong thẻ biểu mẫu.

21720
20:44:38,792 --> 20:44:41,536
Vì vậy, tóm lại là các biểu mẫu hoặc\ntất nhiên, cách thức hoạt động của web

21721
20:44:41,536 --> 20:44:43,411
và cách chúng tôi thường\ngnhận thông tin đầu vào từ người dùng

21722
20:44:43,411 --> 20:44:46,739
cho dù đó là một nút hay một hộp văn bản\n

21723
20:44:46,740 --> 20:44:48,782
Vì vậy, hãy tiếp tục và thêm\nđiều đó vào hỗn hợp ở đây.

21724
20:44:48,782 --> 20:44:52,702
Vì vậy, hãy nâng cao ứng dụng xin chào này\n

21725
20:44:54,001 --> 20:44:58,101
Hãy để tôi bỏ cái\ntên này đi và để tôi chỉ

21726
20:44:58,101 --> 20:45:03,891
có một tệp index.html rất đơn giản\n

21727
20:45:03,892 --> 20:45:06,242
người dùng cho một số đầu vào như sau.

21728
20:45:06,241 --> 20:45:10,851
Tôi sẽ quay trở lại\n

21729
20:45:10,851 --> 20:45:13,851
tên người dùng, đây là trang của tôi\n

21730
20:45:14,642 --> 20:45:16,972
Vì vậy tôi sẽ tạo một thẻ biểu mẫu.

21731
20:45:16,971 --> 20:45:20,631
Phương pháp tôi sắp sử dụng bây giờ\n

21732
20:45:20,631 --> 20:45:23,092
Sau đó, bên trong biểu mẫu đó, tôi\nsẽ có một thẻ đầu vào.

21733
20:45:23,092 --> 20:45:25,634
Và tôi sẽ tắt\nautocomplete giống như chúng tôi đã làm tuần trước.

21734
20:45:25,634 --> 20:45:29,542
Tôi định bật tiêu điểm tự động nên\n

21735
20:45:29,542 --> 20:45:33,263
Tôi sẽ đặt tên\ncủa đầu vào này tên, tên.

21736
20:45:33,263 --> 20:45:35,971
Không quá khó hiểu, nhưng tôi\n

21737
20:45:35,971 --> 20:45:39,531
Vì vậy, thật hợp lý khi tên của\n

21738
20:45:39,532 --> 20:45:42,232
Phần giữ chỗ mà tôi muốn\nhuman nhìn thấy bằng văn bản màu xám nhạt

21739
20:45:42,232 --> 20:45:45,262
sẽ là Tên có chữ N viết hoa,\n

21740
20:45:45,262 --> 20:45:47,512
Và sau đó nhập trường văn bản này--

21741
20:45:47,512 --> 20:45:49,372
loại đầu vào này sẽ là văn bản.

21742
20:45:49,372 --> 20:45:52,312
Sau đó tôi sẽ cống hiến hết mình,\n

21743
20:45:52,312 --> 20:45:54,229
Và tôi không quan tâm\nit nói gì, nó cứ diễn ra thôi

21744
20:45:54,229 --> 20:45:56,582
để nói thuật ngữ gửi mặc định.

21745
20:45:56,581 --> 20:46:01,072
Bây giờ hãy để tôi tiếp tục và mở lại\ncửa sổ terminal của tôi.

21746
20:46:01,072 --> 20:46:06,232
Hãy để tôi truy cập vào cùng một URL\nđể tôi có thể xem-- rất tiếc.

21747
20:46:11,751 --> 20:46:13,301
Vì vậy, nó chỉ được lưu vào bộ nhớ đệm từ trước đó.

21748
20:46:13,301 --> 20:46:16,601
Hãy để tôi quay lại cùng\nURL đó, URL GitHub Preview.dev của tôi

21749
20:46:18,021 --> 20:46:19,932
Và bây giờ, tôi có thể gõ bất cứ điều gì tôi muốn.

21750
20:46:19,932 --> 20:46:23,601
Tuy nhiên, điều đáng chú ý là khi tôi nhấp vào\n

21751
20:46:24,642 --> 20:46:28,002
Nó có một giá trị mặc định,\nnhưng hãy để tôi đi vào tệp index.html của mình

21752
20:46:28,001 --> 20:46:30,761
và hãy để tôi thêm, giống như chúng tôi đã làm tuần trước, Google.

21753
20:46:30,762 --> 20:46:36,188
Trong khi trước đây tôi đã nói điều gì đó\n

21754
20:46:36,188 --> 20:46:38,021
chúng tôi sẽ không phụ thuộc vào\không phải bên thứ ba nào đó.

21755
20:46:38,021 --> 20:46:40,482
Tôi sẽ triển khai\n cái gọi là phần phụ trợ

21756
20:46:40,482 --> 20:46:44,752
và tôi sẽ có người dùng\n

21757
20:46:44,751 --> 20:46:47,381
không chỉ gạch chéo, còn /hello thì sao.

21758
20:46:47,381 --> 20:46:48,941
Tôi có thể bù đắp, bất cứ điều gì tôi muốn.

21759
20:46:48,941 --> 20:46:53,411
Chào hỏi giống như một từ có tác dụng tốt đẹp,\n

21760
20:46:53,411 --> 20:46:56,411
được gửi khi họ nhấp vào\nGửi vào biểu mẫu này.

21761
20:46:56,411 --> 20:46:59,891
Được rồi, bây giờ chúng ta hãy tiếp tục\nvà quay lại tab trình duyệt của tôi.

21762
20:46:59,892 --> 20:47:02,592
Thực ra, hãy để tôi tiếp tục\nvà để tôi tải lại Flask

21763
20:47:02,592 --> 20:47:05,082
ở đây để nó tải lại\ntất cả các thay đổi của tôi.

21764
20:47:05,081 --> 20:47:09,161
Hãy để tôi tải lại tab này để tôi có được\n

21765
20:47:10,271 --> 20:47:13,391
Nếu tôi xem nguồn trang, chúng tôi thực sự thấy rằng trình duyệt của tôi

21766
20:47:13,392 --> 20:47:15,252
đã tải xuống HTML mới nhất.

21767
20:47:15,251 --> 20:47:16,916
Vì vậy, nó chắc chắn đã thay đổi.

21768
20:47:16,917 --> 20:47:18,292
Hãy tiếp tục và gõ David.

21769
20:47:18,292 --> 20:47:22,062
Và khi tôi nhấp vào Gửi\ntại đây, điều gì sẽ xảy ra?

21770
20:47:25,262 --> 20:47:28,381
Điều gì sẽ xảy ra một cách trực quan,\nvề mặt chức năng, tuy nhiên bạn

21771
20:47:28,381 --> 20:47:32,301
muốn giải thích khi tôi nhấp vào Gửi.

21772
20:47:32,801 --> 20:47:34,346
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC] một trang trống.

21773
20:47:34,346 --> 20:47:36,471
DAVID: OK, người dùng sẽ\nđi tới một trang trống.

21774
20:47:36,471 --> 20:47:37,763
Bản năng khá tốt, bởi vì--

21775
20:47:37,763 --> 20:47:40,641
không có nơi nào khác, nếu tôi đề cập\n/greet, nó dường như không tồn tại.

21776
20:47:40,642 --> 20:47:44,872
URL sẽ\nthay đổi như thế nào, chỉ cho rõ ràng thôi?

21777
20:47:44,872 --> 20:47:47,122
Điều gì sẽ xuất hiện\nđột nhiên trong URL?

21778
20:47:53,563 --> 20:47:56,438
Cụ thể là trong URL, có gì đó\n

21779
20:47:56,994 --> 20:47:58,202
ĐỐI TƯỢNG: Cặp giá trị chính?

21780
20:47:58,202 --> 20:47:59,577
DAVID: Cặp giá trị khóa, phải.

21781
20:48:00,661 --> 20:48:02,941
Đó là lý do tại sao thủ thuật\nGoogle của chúng tôi tuần trước đã có hiệu quả.

21782
20:48:02,941 --> 20:48:05,604
Tôi đã tạo lại một\nbiểu mẫu trên trang web của riêng mình.

21783
20:48:05,604 --> 20:48:08,521
Và mặc dù tôi không đi loanh quanh\n

21784
20:48:08,521 --> 20:48:12,182
Tôi vẫn có thể gửi thông tin\n

21785
20:48:13,351 --> 20:48:16,232
cho câu hỏi của bạn trước đó, rằng\nbất cứ khi nào bạn gửi biểu mẫu

21786
20:48:16,232 --> 20:48:19,502
nó tự động kết thúc sau\na dấu hỏi trong URL

21787
20:48:20,432 --> 20:48:23,221
Vậy cả hai bạn đều\nđúng, chuyện này sẽ hỏng.

21788
20:48:23,221 --> 20:48:26,761
Và cả ba bạn đều đúng,\ncó nghĩa là không tìm thấy 404.

21789
20:48:26,762 --> 20:48:28,211
Bạn có thể nhìn thấy nó trong tab ở đây.

21790
20:48:28,211 --> 20:48:29,711
Đó là lỗi đã quay trở lại.

21791
20:48:29,711 --> 20:48:33,482
Nhưng điều thú vị và quan trọng nhất là URL đã thay đổi.

21792
20:48:33,482 --> 20:48:37,652
Và nó được chuyển đến /greet?name=david.

21793
20:48:37,652 --> 20:48:40,021
Vì vậy bây giờ tôi chỉ cần thêm\nmột số logic mà thực sự

21794
20:48:40,021 --> 20:48:41,762
tìm kiếm cái gọi là tuyến đường đó.

21795
20:48:41,762 --> 20:48:44,282
Vì vậy, hãy để tôi quay lại app.py của mình.

21796
20:48:44,282 --> 20:48:49,442
Hãy để tôi xác định một lộ trình khác cho,\nquote unquote, "gạch chéo chào.

21797
20:48:49,441 --> 20:48:52,961
Và sau đó, bên trong-- bên dưới này,\n

21798
20:48:52,961 --> 20:48:56,042
Tôi sẽ gọi nó là lời chào, nhưng tôi\ncó thể gọi nó là bất cứ cái gì tôi muốn.

21799
20:48:56,042 --> 20:48:58,711
Không có đối số nào bây giờ,\ncho việc này và sau đó

21800
20:48:58,711 --> 20:49:02,191
hãy để tôi tiếp tục và\nthực hiện việc này trong app.py của tôi.

21801
20:49:02,191 --> 20:49:05,051
Lần này, tôi thực sự muốn biết tên của con người.

21802
20:49:05,051 --> 20:49:09,061
Vì vậy, hãy để tôi nói requeste.args\nget quote unquote "name"

21803
20:49:09,062 --> 20:49:11,101
và để tôi lưu trữ biến đó trong\na có tên là name.

21804
20:49:11,101 --> 20:49:14,792
Vậy hãy để tôi trả lại một\nmẫu và bạn biết đấy

21805
20:49:14,792 --> 20:49:17,372
cái gì, tôi sẽ tự tạo cho mình\na một mẫu mới, hello.html.

21806
20:49:17,372 --> 20:49:19,622
Bởi vì điều này có mục đích\nkhác nên nó không phải là một hình thức.

21807
20:49:19,622 --> 20:49:22,562
Tôi muốn gửi lời chào tới\nuser trong tệp HTML này

21808
20:49:22,562 --> 20:49:27,722
và tôi muốn chuyển vào đó,\n

21809
20:49:27,721 --> 20:49:34,081
Được rồi, bây giờ nếu tôi đi lên và\n

21810
20:49:36,241 --> 20:49:39,691
Nếu tôi tiếp tục và nhấn tải lại hoặc gửi lại\n

21811
20:49:46,241 --> 20:49:48,652
Hãy để tôi thử, vậy hãy thử cái này.

21812
20:49:48,652 --> 20:49:50,232
Hãy tiếp tục và tải lại trang.

21813
20:49:50,232 --> 20:49:51,741
Trước đó, nó không được tìm thấy.

21814
20:49:51,741 --> 20:49:55,661
Bây giờ thì tệ hơn, và đây là\nlỗi 500, máy chủ nội bộ

21815
20:49:55,661 --> 20:49:59,891
lỗi mà tôi đã hứa vào tuần tới chúng tôi sẽ làm\n

21816
20:49:59,892 --> 20:50:01,782
Nhưng ở đây chúng tôi gặp lỗi\nội bộ máy chủ.

21817
20:50:01,782 --> 20:50:05,512
Vì đây là lỗi nội bộ nên điều này\n

21818
20:50:05,512 --> 20:50:09,042
Vậy là con đường thực sự đã được tìm thấy\n

21819
20:50:09,042 --> 20:50:14,502
Nhưng nếu chúng ta đi vào Mã VS ở đây và\n

21820
20:50:17,622 --> 20:50:21,042
điều này thực sự có một chút sai lệch.

21821
20:50:32,202 --> 20:50:34,872
Được rồi, ở đây chúng ta có\nlỗi này ở đây và cái này

21822
20:50:34,872 --> 20:50:37,241
là nơi cửa sổ terminal\nis của bạn sẽ hữu ích.

21823
20:50:37,241 --> 20:50:40,152
Trong cửa sổ terminal của bạn,\ntheo mặc định, thường là

21824
20:50:40,152 --> 20:50:43,271
sẽ trở nên hữu ích\nnhững thứ như nhật ký, L-O-G

21825
20:50:43,271 --> 20:50:46,608
về những gì máy chủ\nis nhìn thấy từ trình duyệt.

21826
20:50:46,608 --> 20:50:48,941
Ví dụ: đây là những gì\nmáy chủ vừa thấy có màu tím.

21827
20:50:48,941 --> 20:50:54,072
Nhận /greet?name=david\nsử dụng HTTP phiên bản 1.0.

21828
20:50:54,072 --> 20:50:57,551
Tuy nhiên, đây là mã trạng thái\nmà máy chủ trả về, 500.

21829
20:50:58,601 --> 20:51:02,021
Chà, đây là nơi chúng tôi lấy những thứ này\n

21830
20:51:02,021 --> 20:51:03,851
help50 đó\cuối cùng có thể giúp bạn

21831
20:51:03,851 --> 20:51:07,164
hoặc ở đây, chúng ta có thể\ncó manh mối ở phía dưới.

21832
20:51:07,164 --> 20:51:09,581
Và điều này thực sự khá\n rõ ràng, mặc dù chúng tôi chưa bao giờ

21833
20:51:11,892 --> 20:51:14,472
Tôi chưa tạo ra hello.html phải không?

21834
20:51:15,498 --> 20:51:17,831
Được rồi, vậy đó hẳn là\nphần cuối cùng của câu đố.

21835
20:51:17,831 --> 20:51:21,221
Và một lần nữa, đại diện cho cách bạn\n

21836
20:51:21,221 --> 20:51:24,311
hãy để tôi đi vào cửa sổ terminal của tôi.

21837
20:51:24,312 --> 20:51:28,812
Sau khi nhấn Control C, thao tác này\hủy hoặc làm gián đoạn một quá trình

21838
20:51:28,812 --> 20:51:30,792
hãy để tôi đi vào thư mục mẫu của tôi.

21839
20:51:30,792 --> 20:51:33,672
Nếu tôi gõ ls, tôi chỉ có index.html.

21840
20:51:33,672 --> 20:51:36,222
Vì vậy, hãy viết mã hello.html.

21841
20:51:36,221 --> 20:51:40,121
Và trong tập tin này chúng ta hãy\nnhanh chóng thực hiện loại tài liệu.

21842
20:51:40,122 --> 20:51:44,922
Loại tài liệu HTML, dấu ngoặc mở\nHTML, ngôn ngữ bằng tiếng Anh.

21843
20:51:44,922 --> 20:51:48,851
Bên trong này, tôi sẽ có thẻ head,\n

21844
20:51:48,851 --> 20:51:53,501
Tên là khung nhìn,\nnội dung của nó là--

21845
20:51:55,782 --> 20:52:02,982
Nội dung của nó là thang đo ban đầu\n

21846
20:52:02,982 --> 20:52:05,892
Trích dẫn không trích dẫn, tiêu đề\nis vẫn sẽ như vậy

21847
20:52:05,892 --> 20:52:08,292
Tôi sẽ gọi đây là lời chào\nvì đây là mẫu của tôi.

21848
20:52:08,292 --> 20:52:13,642
Và ở đây, trong phần thân, tôi\nsẽ có tên dấu phẩy xin chào.

21849
20:52:13,642 --> 20:52:17,862
Vì thế lẽ ra tôi có thể giữ lại điều cũ\n

21850
20:52:17,861 --> 20:52:19,331
về cơ bản, mẫu thứ hai của tôi.

21851
20:52:19,331 --> 20:52:22,961
Vì vậy, index.html bây giờ gần như giống\nnhưng tiêu đề thì khác

21852
20:52:24,342 --> 20:52:27,552
hello.html gần như giống nhau,\nnhưng nó không có biểu mẫu.

21853
20:52:27,551 --> 20:52:29,781
Nó chỉ có tên dấu phẩy xin chào.

21854
20:52:29,782 --> 20:52:34,272
Vì vậy bây giờ hãy để tôi tiếp tục và\nchạy lại vào đúng thư mục.

21855
20:52:34,271 --> 20:52:38,842
Bạn phải chạy Flask ở mọi nơi app.py\n

21856
20:52:38,842 --> 20:52:41,802
Vì vậy, hãy để tôi chạy Flask để\ngtrở lại vị trí cũ.

21857
20:52:41,801 --> 20:52:43,661
Hãy để tôi đi vào tab khác của tôi.

21858
20:52:43,661 --> 20:52:46,841
Lần này tôi bắt chéo ngón tay\nđó, khi tôi quay lại chém

21859
20:52:46,842 --> 20:52:51,792
và bây giờ tôi nhận được biểu mẫu của index.html\n

21860
20:52:54,491 --> 20:52:58,001
Và bây giờ chúng tôi có một trang web hoàn chỉnh\n

21861
20:52:58,001 --> 20:53:03,191
gạch chéo và /chào, phần sau của\n

21862
20:53:03,191 --> 20:53:05,231
sử dụng một mẫu, nhổ nó ra.

21863
20:53:05,232 --> 20:53:08,752
Nhưng có thể có điều gì đó không ổn,\nvà hãy xem điều gì xảy ra ở đây.

21864
20:53:08,751 --> 20:53:11,381
Giả sử tôi không gõ bất cứ điều gì vào.

21865
20:53:11,381 --> 20:53:13,631
Hãy để tôi đến đây và chỉ cần nhấp vào Gửi.

21866
20:53:13,631 --> 20:53:16,423
Bây giờ, ý tôi là, nó trông thật ngu ngốc.

21867
20:53:16,423 --> 20:53:18,381
Vì vậy, có rất nhiều\ncách chúng ta có thể giải quyết vấn đề này.

21868
20:53:18,381 --> 20:53:21,822
Tôi có thể yêu cầu người dùng\nphải nhập thông tin ở trang trước

21869
20:53:21,822 --> 20:53:23,955
Tôi có thể kiểm tra một số loại lỗi\nof lỗi này.

21870
20:53:23,955 --> 20:53:26,622
Nhưng có một cơ chế khác mà tôi\ncó thể sử dụng mà tôi sẽ chỉ cho bạn.

21871
20:53:26,622 --> 20:53:30,911
Hóa ra hàm GET này\trong ngữ cảnh của HTTP

21872
20:53:30,911 --> 20:53:33,161
và nói chung với\ntừ điển Python

21873
20:53:33,161 --> 20:53:35,572
bạn thực sự có thể cung cấp một giá trị mặc định.

21874
20:53:35,572 --> 20:53:39,941
Vì vậy nếu không có tham số tên\n

21875
20:53:39,941 --> 20:53:42,591
bạn thực sự có thể cho nó\na giá trị mặc định như thế này.

21876
20:53:42,592 --> 20:53:44,771
Vì vậy, tôi sẽ nói thế giới chẳng hạn.

21877
20:53:46,211 --> 20:53:48,342
Hãy để tôi không gõ gì\nlần nữa và nhấp vào Gửi.

21878
20:53:48,342 --> 20:53:52,032
Và hy vọng lần này,\ntôi sẽ làm-- ôi, xin lỗi.

21879
20:53:52,032 --> 20:53:54,792
Hãy để tôi khởi động lại Flask\nđể tải lại mẫu.

21880
20:53:54,792 --> 20:53:57,851
Hãy để tôi tiếp tục và không nhập gì\nlần này, hãy nhấp vào Gửi.

21881
20:54:05,622 --> 20:54:09,461
Giả sử rằng lý do này--

21882
20:54:11,021 --> 20:54:15,191
Giả sử tôi bỏ tên\n

21883
20:54:15,191 --> 20:54:17,831
Bây giờ tôi thấy xin chào thế giới\nvà đây là một sự tinh tế

21884
20:54:17,831 --> 20:54:19,961
rằng tôi không có ý định vào đây.

21885
20:54:19,961 --> 20:54:23,381
Khi bạn có câu hỏi\nđánh dấu tên không có giá trị gì

21886
20:54:23,381 --> 20:54:25,421
bạn đang chuyển vào\ncái được gọi là-- rất tiếc.

21887
20:54:25,422 --> 20:54:29,112
Khi bạn có câu hỏi chào\nđánh dấu tên bằng gì đó

21888
20:54:29,111 --> 20:54:31,841
bạn thực sự đang đưa ra một giá trị cho tên.

21889
20:54:31,842 --> 20:54:34,482
Đó là trích dẫn không trích dẫn\nkhông có gì ở giữa.

21890
20:54:34,482 --> 20:54:36,952
Điều đó khác với việc không có giá trị gì cả.

21891
20:54:36,952 --> 20:54:40,965
Vì vậy, cho phép tôi đề xuất\nrằng lỗi ở đây, chúng ta

21892
20:54:40,964 --> 20:54:42,881
muốn yêu cầu\nđiều này theo một cách khác.

21893
20:54:42,881 --> 20:54:45,372
Và có lẽ cách\nmạnh mẽ nhất để làm điều này

21894
20:54:45,372 --> 20:54:51,021
sẽ đi vào đây, trong HTML của tôi, và\n

21895
20:54:51,021 --> 20:54:55,751
Bây giờ, nếu tôi quay lại biểu mẫu của mình\nsau khi khởi động lại Flask tại đây

21896
20:54:55,751 --> 20:54:59,711
và tôi tiếp tục nhấp vào tải lại\không phải biểu mẫu của tôi và không nhập gì cả

21897
20:54:59,711 --> 20:55:03,342
và nhấp vào Gửi, bây giờ\ntrình duyệt sẽ mắng tôi.

21898
20:55:03,342 --> 20:55:05,502
Nhưng chỉ như một lời giới thiệu\nvề điều gì đó mà chúng ta sẽ trở thành

21899
20:55:05,501 --> 20:55:08,231
thực hiện tập bài tập tiếp theo\n về việc kiểm tra lỗi

21900
20:55:08,232 --> 20:55:14,771
bạn không bao giờ nên dựa vào\n

21901
20:55:14,771 --> 20:55:19,301
Bởi vì chúng tôi biết, từ tuần trước, rằng\n

21902
20:55:19,301 --> 20:55:21,682
và để tôi tìm hiểu về HTML ở đây.

21903
20:55:21,682 --> 20:55:24,042
Hãy để tôi đi vào cơ thể, hình thức.

21904
20:55:24,042 --> 20:55:26,661
Được rồi, bạn nói bắt buộc,\nTôi nói không bắt buộc.

21905
20:55:26,661 --> 20:55:29,721
Bạn chỉ có thể xóa những gì trong dom trong trình duyệt

21906
20:55:29,721 --> 20:55:32,682
và bây giờ tôi có thể tiếp tục\nvà gửi biểu mẫu này.

21907
20:55:32,682 --> 20:55:34,271
Và nó dường như bị hỏng.

21908
20:55:34,271 --> 20:55:37,461
Không phải là vấn đề lớn với một chút ngớ ngẩn\n

21909
20:55:37,461 --> 20:55:40,512
Nhưng nếu bạn đang cố gắng\nyêu cầu con người thực sự

21910
20:55:40,512 --> 20:55:43,902
cung cấp thông tin đầu vào cần thiết cho\n

21911
20:55:43,902 --> 20:55:49,452
bạn không muốn tin tưởng rằng HTML\n

21912
20:55:49,452 --> 20:55:52,332
Được rồi, nếu có bất kỳ câu hỏi nào,\nvề ứng dụng cụ thể này

21913
20:55:52,331 --> 20:55:56,211
trước khi chúng tôi thêm một tính năng khác ở đây?

21914
20:55:59,947 --> 20:56:01,911
KHÁN GIẢ: Các bạn [KHÔNG NGHE ĐƯỢC].

21915
20:56:04,255 --> 20:56:05,422
DAVID: Xin lỗi, to hơn một chút.

21916
20:56:14,270 --> 20:56:15,812
DAVID: Nếu thế thì có vấn đề gì không?

21917
20:56:15,812 --> 20:56:17,285
KHÁN GIẢ: Bạn phải [KHÔNG NGHE ĐƯỢC].

21918
20:56:22,122 --> 20:56:24,521
Điều bạn thực sự nên làm là làm gì đó\n

21919
20:56:24,521 --> 20:56:26,092
nơi tôi sẽ bắt đầu\nkiểm tra lỗi mọi thứ.

21920
20:56:26,092 --> 20:56:27,792
Vậy hãy để tôi vẫy tay\nvà đề xuất rằng chúng ta sẽ

21921
20:56:27,792 --> 20:56:29,259
giải quyết vấn đề này tốt hơn chỉ trong chốc lát.

21922
20:56:29,259 --> 20:56:31,301
Nhưng cũng không tệ khi làm\nnhững gì tôi vừa làm ở đây, nó

21923
20:56:31,301 --> 20:56:34,241
sẽ chỉ xử lý một trong những\n

21924
20:56:35,751 --> 20:56:38,051
Được rồi, mặc dù\nđiều này còn mới đối với hầu hết chúng ta

21925
20:56:38,051 --> 20:56:43,391
ở đây, hãy xem xét index.html,\n đầu tiên của tôi

21926
20:56:45,551 --> 20:56:48,783
Điều gì có thể được cho là được thiết kế tồi?

21927
20:56:48,783 --> 20:56:50,741
Mặc dù đây có thể\nlà lần đầu tiên bạn

21928
20:56:50,741 --> 20:56:54,461
từng chạm tới lập trình web như thế này.

21929
20:56:54,461 --> 20:57:01,902
Điều này có gì xấu hay ngu ngốc\n

21930
20:57:01,902 --> 20:57:05,831
Và cũng có lý do khiến tôi chán\n

21931
20:57:06,642 --> 20:57:11,415
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] bạn đã nói,\n

21932
20:57:11,414 --> 20:57:13,081
DAVID: Vâng, có quá nhiều sự lặp lại.

21933
20:57:13,081 --> 20:57:16,322
Ý tôi là, nó cố tình tẻ nhạt\n

21934
20:57:16,322 --> 20:57:19,351
Loại tài liệu, thẻ HTML,\nthẻ đầu, thẻ tiêu đề.

21935
20:57:19,351 --> 20:57:21,991
Và những điều nhỏ nhặt đã thay đổi\ntrong quá trình thực hiện, chẳng hạn như tiêu đề

21936
20:57:21,991 --> 20:57:24,031
và chắc chắn, nội dung của cơ thể.

21937
20:57:24,032 --> 20:57:27,302
Nhưng rất nhiều điều này, ý tôi là, gần như toàn bộ trang

21938
20:57:27,301 --> 20:57:30,599
là một bản sao của chính nó trong nhiều tập tin.

21939
20:57:30,599 --> 20:57:33,932
Và xin Chúa đừng để chúng ta có mẫu thứ ba,\n

21940
20:57:35,072 --> 20:57:37,441
Điều này sẽ nhanh chóng trở nên rất\n tẻ nhạt.

21941
20:57:37,441 --> 20:57:39,970
Và giả sử bạn muốn\nthay đổi điều gì đó ở một nơi

21942
20:57:39,970 --> 20:57:43,262
bạn sẽ phải thay đổi nó ngay bây giờ trong\n

21943
20:57:43,961 --> 20:57:46,741
Vì vậy, giống như trong\nlập trình tổng quát hơn

21944
20:57:46,741 --> 20:57:49,230
chúng ta có khả năng này để tìm ra những điểm chung.

21945
20:57:49,230 --> 20:57:51,480
Bạn cũng vậy trong bối cảnh\ncủa lập trình web

21946
20:57:51,480 --> 20:57:54,271
và đặc biệt\ntạo khuôn mẫu, có khả năng

21947
20:57:54,271 --> 20:57:56,379
để loại bỏ tất cả những điểm chung đó.

21948
20:57:56,379 --> 20:57:58,171
Cú pháp sẽ\ncó một chút tò mò

21949
20:57:58,171 --> 20:58:01,092
nhưng về mặt chức năng thì nó\nkhá đơn giản.

21950
20:58:02,292 --> 20:58:06,301
Hãy để tôi tiếp tục và sao chép\nnội dung của index.html.

21951
20:58:06,301 --> 20:58:09,182
Hãy để tôi vào thư mục templates\ncủa tôi và mã hóa một tập tin

21952
20:58:09,182 --> 20:58:12,131
theo mặc định, được gọi là bố cục.html.

21953
20:58:12,131 --> 20:58:15,751
Và hãy để tôi tiếp tục, và theo\ncâu trả lời của bạn, hãy sao chép tất cả những thứ đó

21954
20:58:15,751 --> 20:58:18,282
thay vào đó, hãy tìm những điểm chung trong\ntệp này.

21955
20:58:18,282 --> 20:58:21,151
Vì vậy ở đây tôi có một tập tin\ngọi là bố cục.html.

21956
20:58:21,150 --> 20:58:26,311
Tôi không muốn mỗi trang đều giống nhau\n

21957
20:58:26,312 --> 20:58:27,782
Tôi sẽ gọi mọi thứ là xin chào.

21958
20:58:27,782 --> 20:58:30,662
Nhưng trong phần nội dung của trang,\nđiều tôi sắp làm ở đây chỉ là

21959
20:58:30,661 --> 20:58:35,262
có một trình giữ chỗ cho những nội dung\nthực tế có thay đổi.

21960
20:58:35,262 --> 20:58:38,131
Vì vậy, trong cách bố trí này, tôi\nsẽ tiếp tục ở đây

21961
20:58:38,131 --> 20:58:42,822
và chỉ cần đặt vào phần nội dung\ntrang của tôi, cú pháp này thế nào?

21962
20:58:44,372 --> 20:58:48,782
Chặn nội dung và sau đó đóng dấu ngoặc nhọn phần trăm\n.

21963
20:58:48,782 --> 20:58:50,972
Và sau đó tôi sẽ thực hiện khối kết thúc.

21964
20:58:50,971 --> 20:58:55,891
Vì vậy, đây là một cú pháp gây tò mò, nhưng\nđây là cú pháp mẫu hơn.

21965
20:58:55,892 --> 20:58:59,222
Cú pháp mẫu khác mà chúng ta đã thấy\n

21966
20:58:59,221 --> 20:59:01,051
Đó chỉ là việc cắm các giá trị.

21967
20:59:01,051 --> 20:59:05,311
Có cú pháp khác với Flask\n

21968
20:59:05,312 --> 20:59:10,112
dấu ngoặc nhọn, dấu phần trăm và sau đó là một số\n

21969
20:59:10,892 --> 20:59:13,382
Và cái này hơi lạ\nvì theo nghĩa đen nó có

21970
20:59:13,381 --> 20:59:16,721
không có gì giữa dấu đóng\nvà dấu ngoặc nhọn mở ở đây.

21971
20:59:16,721 --> 20:59:19,201
Nhưng hãy xem điều này có thể làm gì cho chúng ta.

21972
20:59:19,202 --> 20:59:25,682
Bây giờ hãy để tôi đi vào chỉ mục.html của tôi,\n

21973
20:59:25,682 --> 20:59:28,952
từ đó và hãy để tôi tập trung vào\nnhững gì khác biệt tối thiểu.

21974
20:59:28,952 --> 20:59:33,881
Điều duy nhất thực sự khác biệt\n

21975
20:59:33,881 --> 20:59:37,682
Vì vậy, hãy để tôi tiếp tục và cắt\nbiểu mẫu đó ra khay nhớ tạm của tôi.

21976
20:59:37,682 --> 20:59:40,441
Hãy để tôi thay đổi\ndòng đầu tiên của index.html

21977
20:59:40,441 --> 20:59:46,741
để nói rằng tập tin này sẽ\nmở rộng bố cục.html

21978
20:59:46,741 --> 20:59:48,932
và lưu ý rằng tôi đang sử dụng lại\ndấu ngoặc nhọn.

21979
20:59:48,932 --> 20:59:52,381
Và tập tin này sẽ\ncó khối nội dung riêng

21980
20:59:52,381 --> 20:59:57,301
bên trong đó chỉ là\nHTML mà tôi thực sự

21981
20:59:57,301 --> 20:59:59,792
muốn làm cụ thể cho trang này.

21982
20:59:59,792 --> 21:00:02,051
Và tôi sẽ giữ vết lõm\n của mình đẹp đẽ và gọn gàng ở đây.

21983
21:00:02,051 --> 21:00:03,542
Và hãy xem xét những gì tôi đã làm.

21984
21:00:03,542 --> 21:00:05,971
Điều này bắt đầu có vẻ\nnhanh chóng và lạ lùng, và bây giờ

21985
21:00:05,971 --> 21:00:09,871
sự kết hợp giữa HTML với mã tạo khuôn mẫu.

21986
21:00:09,872 --> 21:00:15,961
Index.html, dòng đầu tiên bây giờ là, này,\n

21987
21:00:17,072 --> 21:00:20,402
Dòng tiếp theo này, từ ba đến\n10, nói, này, Flask, đây

21988
21:00:20,402 --> 21:00:23,732
là những gì tôi coi là khối cơ thể của mình.

21989
21:00:23,732 --> 21:00:27,362
Cắm cái này vào phần giữ chỗ bố cục.

21990
21:00:27,361 --> 21:00:33,611
Vì vậy, nếu bây giờ tôi quay lại\nto bố cục.html và bố cục.html

21991
21:00:33,611 --> 21:00:35,671
Ngược lại, hầu như tất cả đều là HTML.

21992
21:00:35,672 --> 21:00:38,757
Nhưng có phần giữ chỗ này và\n

21993
21:00:39,631 --> 21:00:41,402
Nếu tôi muốn đặt một\ngiá trị mặc định, tôi có thể

21994
21:00:41,402 --> 21:00:45,002
đặt một giá trị mặc định vào đó để đề phòng\n

21995
21:00:45,001 --> 21:00:47,171
Nhưng nói chung, điều đó\nsẽ không liên quan.

21996
21:00:47,172 --> 21:00:50,882
Vì vậy, đây chỉ là phần giữ chỗ,\n

21997
21:00:50,881 --> 21:00:54,491
cắm nội dung\ndành riêng cho trang ngay tại đây.

21998
21:00:54,491 --> 21:00:58,262
Vì vậy, nếu bây giờ tôi truy cập vào hello.html,\nviệc này thậm chí còn dễ dàng hơn.

21999
21:00:58,262 --> 21:01:01,262
Tôi sẽ cắt nội dung này\nvà loại bỏ mọi nội dung khác.

22000
21:01:01,262 --> 21:01:06,842
Greet.html 2 sẽ mở rộng\n

22001
21:01:06,842 --> 21:01:13,512
và sau đó tôi sẽ có khối cơ thể\n

22002
21:01:13,512 --> 21:01:15,961
Và sau đó tôi sẽ tiếp tục và kết thúc khối đó ở đây.

22003
21:01:15,961 --> 21:01:18,812
Đây không phải là thẻ HTML,\nđây không phải là cú pháp HTML.

22004
21:01:18,812 --> 21:01:22,741
Về mặt kỹ thuật, cú pháp chúng ta tiếp tục\nxem với dấu ngoặc nhọn

22005
21:01:22,741 --> 21:01:28,982
và những dấu ngoặc nhọn này hiện có phần trăm\n

22006
21:01:28,982 --> 21:01:33,812
J-I-N-J-A, một ngôn ngữ\nmà một số người đã phát minh ra

22007
21:01:33,812 --> 21:01:35,732
cho mục đích tạo khuôn mẫu này.

22008
21:01:35,732 --> 21:01:37,952
Và những người\phát minh ra Flask đã quyết định

22009
21:01:37,952 --> 21:01:40,052
chúng tôi sẽ không nghĩ ra\n cú pháp riêng của mình

22010
21:01:40,051 --> 21:01:44,066
chúng ta sẽ sử dụng những cái khác\n

22011
21:01:44,066 --> 21:01:46,441
Vì vậy, một lần nữa, bắt đầu có\na điểm này trong khóa học

22012
21:01:46,441 --> 21:01:50,371
và thực sự là trong điện toán, rất nhiều\n

22013
21:01:50,952 --> 21:01:54,842
Vậy Flask đang sử dụng cú pháp này, nhưng\n

22014
21:01:57,032 --> 21:02:01,832
Được rồi, bây giờ\nindex.html là một nửa HTML

22015
21:02:01,831 --> 21:02:04,261
một nửa mã tạo khuôn mẫu, cú pháp Jinja.

22016
21:02:04,262 --> 21:02:08,012
Greet.html gần như có tất cả\ncú pháp Jinja, thậm chí không có thẻ

22017
21:02:08,012 --> 21:02:11,582
nhưng bởi vì cả hai\nextend bố cục.html

22018
21:02:11,581 --> 21:02:14,911
bây giờ tôi nghĩ tôi đã cải thiện\nthiết kế của thứ này.

22019
21:02:14,911 --> 21:02:18,941
Nếu tôi quay lại app.py, không điều nào trong số này thực sự cần phải thay đổi.

22020
21:02:18,941 --> 21:02:22,111
Tôi không thay đổi mẫu của mình\nđể đề cập đến bố cục.html

22021
21:02:22,111 --> 21:02:25,621
điều đó đã được ngầm hiểu trong thực tế\n

22022
21:02:25,622 --> 21:02:28,741
Vì vậy bây giờ nếu tôi tiếp tục\nmở cửa sổ terminal của mình

22023
21:02:28,741 --> 21:02:32,822
quay lại cùng thư mục\nas app.py và chạy Flask

22024
21:02:32,822 --> 21:02:35,732
được rồi, ứng dụng của tôi đang chạy trên cổng 5000.

22025
21:02:35,732 --> 21:02:39,392
Bây giờ hãy để tôi quay lại /route\nin trình duyệt của tôi và nhấn Enter

22026
21:02:40,682 --> 21:02:44,252
Và chỉ cần kiểm tra một chút thôi,\ntôi hãy xem nguồn của trang

22027
21:02:45,932 --> 21:02:48,361
Và có tất cả mã.

22028
21:02:48,361 --> 21:02:51,421
Không đề cập đến Jinja, không có\ndấu ngoặc nhọn, không có dấu phần trăm.

22029
21:02:52,096 --> 21:02:54,721
Nó được in không đẹp lắm\ntheo cách tương tự, nhưng không sao.

22030
21:02:54,721 --> 21:02:57,263
Bởi vì bây giờ, chúng tôi đang bắt đầu\ntạo trang web một cách linh hoạt.

22031
21:02:57,263 --> 21:03:00,512
Và ý tôi là đây không phải\n

22032
21:03:01,111 --> 21:03:03,871
Nếu nó được thụt vào trong phiên bản\nmã nguồn

22033
21:03:03,872 --> 21:03:05,911
không quan trọng trình duyệt\nthực sự nhìn thấy gì.

22034
21:03:05,911 --> 21:03:08,402
Bây giờ hãy để tôi tiếp tục và nhập\ntên của tôi, nhấp vào Gửi.

22035
21:03:08,402 --> 21:03:10,051
Tôi nên xem, vâng, xin chào, David.

22036
21:03:10,051 --> 21:03:12,152
Hãy để tôi tiếp tục và xem\nnguồn của trang này.

22037
21:03:12,152 --> 21:03:16,211
Và chúng ta sẽ thấy gần như giống nhau\n

22038
21:03:16,211 --> 21:03:19,741
Vì vậy, bây giờ, đây là lập trình web\theo nghĩa đen.

22039
21:03:19,741 --> 21:03:23,042
Tôi không mã hóa trang có nội dung\n

22040
21:03:24,032 --> 21:03:27,752
Tôi đã mã hóa cứng một trang có\nmẫu có phần giữ chỗ

22041
21:03:27,751 --> 21:03:31,471
và bây giờ tôi đang sử dụng thực tế\nlogic, một số mã trong app.py

22042
21:03:31,471 --> 21:03:37,751
để thực sự yêu cầu máy chủ\nnội dung cần gửi tới trình duyệt.

22043
21:03:37,751 --> 21:03:42,901
Được rồi, có câu hỏi nào không,\nchúng ta đang ở đâu ở đây?

22044
21:03:42,902 --> 21:03:45,271
Đây hiện là một ứng dụng web.

22045
21:03:45,271 --> 21:03:49,051
Dù đơn giản nhưng nó\nkhông còn chỉ là một trang web nữa.

22046
21:03:49,922 --> 21:03:54,521
ĐỐI TƯỢNG: Những gì chúng tôi đã làm tốt hơn\n

22047
21:03:54,521 --> 21:03:57,232
DAVID: Nó tốt hơn cho\nthiết kế hay cho bộ nhớ?

22048
21:03:57,732 --> 21:03:59,922
Nó chắc chắn tốt hơn\ncho thiết kế bởi vì, thực sự

22049
21:03:59,922 --> 21:04:02,112
nếu chúng ta có trang thứ ba,\ntrang thứ tư, tôi thực sự sẽ

22050
21:04:02,111 --> 21:04:03,911
bắt đầu chỉ cần dùng đến cách sao chép và dán.

22051
21:04:03,911 --> 21:04:07,031
Và như bạn đã thấy với trang chủ,\thông thường, ở phần đầu trang của bạn

22052
21:04:07,032 --> 21:04:10,632
bạn có thể muốn đưa vào một số CSS\n

22053
21:04:10,631 --> 21:04:13,122
Bạn có thể muốn có\nthông tin khác trên đó.

22054
21:04:13,122 --> 21:04:16,754
Nếu bạn phải nâng cấp phiên bản\n

22055
21:04:16,754 --> 21:04:18,461
vì vậy bạn muốn thay đổi\không có dòng nào trong số đó

22056
21:04:18,461 --> 21:04:21,851
theo nghĩa đen bạn sẽ phải đi vào\n

22057
21:04:26,501 --> 21:04:30,731
Về mặt lý thuyết, máy chủ, bởi vì\n

22058
21:04:30,732 --> 21:04:33,394
về mặt lý thuyết nó có thể thực hiện một số\notối ưu hóa bên trong.

22059
21:04:33,394 --> 21:04:36,101
Flask có thể đang làm điều đó, nhưng\n

22060
21:04:36,101 --> 21:04:38,021
Chúng tôi đang sử dụng nó trong\nchế độ phát triển, chế độ này

22061
21:04:38,021 --> 21:04:41,592
nghĩa là nó thường\ntải lại mọi thứ mỗi lần.

22062
21:04:41,592 --> 21:04:44,802
Các câu hỏi khác về ứng dụng này?

22063
21:04:48,842 --> 21:04:54,461
Được rồi, vậy hãy để tôi hỏi một câu,\n

22064
21:04:54,461 --> 21:04:56,641
Còn những tác động đối với quyền riêng tư thì sao?

22065
21:04:56,642 --> 21:05:02,192
Tại sao đây có thể không phải là thiết kế tốt nhất\n

22066
21:05:05,066 --> 21:05:06,491
KHÁN GIẢ: Vì lý do nào đó,\nbạn muốn có tên của mình.

22067
21:05:06,491 --> 21:05:08,682
Vì vậy, những người riêng tư này\ncó thể chỉ cần nhìn vào URL.

22068
21:05:09,182 --> 21:05:11,042
Ý tôi là, nếu bạn có anh chị em hoặc bạn cùng phòng khó tính

22069
21:05:11,042 --> 21:05:13,051
và họ có quyền truy cập vào\nmáy tính xách tay của bạn và họ chỉ

22070
21:05:13,051 --> 21:05:15,301
đi tìm hiểu\nautocomplete hoặc lịch sử của bạn

22071
21:05:15,301 --> 21:05:18,331
giống như, theo nghĩa đen là những gì bạn đã nhập vào\n

22072
21:05:18,331 --> 21:05:21,331
Không phải là vấn đề lớn nếu đó là tên của bạn, nhưng\n

22073
21:05:21,331 --> 21:05:23,551
thẻ hoặc bất cứ thứ gì khác\ncó tính nhạy cảm nhẹ

22074
21:05:23,551 --> 21:05:26,941
có thể bạn không muốn nó\nkết thúc trong URL chút nào

22075
21:05:26,941 --> 21:05:29,402
ngay cả khi bạn đang ở chế độ\ẩn danh hay gì đó.

22076
21:05:29,402 --> 21:05:34,152
Bạn chỉ không muốn bộc lộ bản thân\n

22077
21:05:34,152 --> 21:05:35,941
Vì vậy có lẽ, chúng ta có thể làm tốt hơn thế.

22078
21:05:35,941 --> 21:05:38,311
Và may mắn thay, điều này thực sự là một sự thay đổi dễ dàng.

22079
21:05:38,312 --> 21:05:43,502
Hãy để tôi đi vào\nindex.html nơi chứa biểu mẫu của tôi.

22080
21:05:43,501 --> 21:05:48,271
Và trong biểu mẫu của tôi, tôi chỉ có thể thay đổi\nphương thức từ GET sang POST.

22081
21:05:48,271 --> 21:05:50,911
Nó vẫn sẽ gửi cặp khóa\nvalue đến máy chủ

22082
21:05:50,911 --> 21:05:52,951
nhưng nó sẽ không đưa chúng vào URL.

22083
21:05:52,952 --> 21:05:56,256
Ưu điểm của điều này là chúng ta\ncó thể xoa dịu mối lo ngại về quyền riêng tư này

22084
21:05:56,256 --> 21:05:58,381
nhưng tôi cũng sẽ phải\nthực hiện một thay đổi khác.

22085
21:05:58,381 --> 21:06:02,851
Bởi vì bây giờ, nếu tôi tiếp tục chạy\n

22086
21:06:02,851 --> 21:06:07,331
và bây giờ tôi tải lại biểu mẫu để thực hiện\n

22087
21:06:07,331 --> 21:06:10,171
Bạn nên có thói quen\nvào phần Xem, Nhà phát triển

22088
21:06:10,172 --> 21:06:12,783
Xem Nguồn hoặc Công cụ dành cho nhà phát triển\nđể đảm bảo

22089
21:06:12,783 --> 21:06:15,241
rằng những gì bạn đang thấy trên\ntrình duyệt chính là những gì bạn dự định.

22090
21:06:15,241 --> 21:06:18,062
Và vâng, tôi thấy những gì tôi muốn.

22091
21:06:19,652 --> 21:06:22,381
Hãy để tôi tiếp tục và nhập\nin David rồi nhấp vào Gửi.

22092
21:06:22,381 --> 21:06:24,872
Bây giờ tôi gặp một lỗi khác.

22093
21:06:24,872 --> 21:06:28,902
Đây là HTTP 405,\nphương pháp này không được phép.

22094
21:06:30,001 --> 21:06:34,081
Chà, trong ứng dụng Flask của tôi, tôi đã\n

22095
21:06:34,081 --> 21:06:37,601
Một trong số đó là dành cho dấu gạch chéo,\nthì nó hoạt động tốt.

22096
21:06:37,601 --> 21:06:40,751
Một trong số đó là dành cho /greet,\nand đã từng hoạt động tốt.

22097
21:06:40,751 --> 21:06:46,301
Nhưng rõ ràng Flask đang làm gì\n

22098
21:06:46,301 --> 21:06:51,512
Vì vậy, nếu tôi muốn thay đổi tuyến đường này thành\n

22099
21:06:51,512 --> 21:06:56,682
trích dẫn "POST" bên trong\ncủa tham số này tại đây.

22100
21:06:56,682 --> 21:07:01,592
Vì vậy, bây giờ, tôi thực sự có thể\nhỗ trợ POST chứ không chỉ GET.

22101
21:07:01,592 --> 21:07:08,642
Và nếu bây giờ tôi khởi động lại Flask, vậy Flask\n

22102
21:07:08,642 --> 21:07:11,282
Hãy để tôi quay lại một màn hình\nbiểu mẫu, tải lại

22103
21:07:11,282 --> 21:07:13,202
trang này chỉ để đảm bảo\ntôi có thông tin mới nhất

22104
21:07:13,202 --> 21:07:14,785
mặc dù không có gì thay đổi ở đó.

22105
21:07:14,785 --> 21:07:18,392
Nhập David và nhấp vào Gửi ngay,\nbây giờ tôi sẽ thấy xin chào thế giới.

22106
21:07:18,392 --> 21:07:25,142
Lưu ý rằng tôi đang ở tuyến đường chào đón,\n

22107
21:07:28,021 --> 21:07:30,331
Được rồi, đó là một\nbài học thú vị.

22108
21:07:30,331 --> 21:07:35,141
Đó là một thay đổi đơn giản, nhưng trong khi GET\n

22109
21:07:35,142 --> 21:07:37,382
Nhưng nó vẫn hoạt động lâu\nas bạn chỉnh sửa phần phụ trợ

22110
21:07:37,381 --> 21:07:41,971
để xem như một yêu cầu POST,\n

22111
21:07:41,971 --> 21:07:44,521
Sẽ không đơn giản như việc nhìn vào chính URL đó.

22112
21:07:44,521 --> 21:07:46,322
Tại sao chúng ta không nên luôn sử dụng POST?

22113
21:07:49,491 --> 21:07:53,751
Tại sao không sử dụng POST ở mọi nơi?

22114
21:07:55,342 --> 21:07:58,822
Đúng rồi, vì nó đáng ghét\n

22115
21:07:58,822 --> 21:08:02,084
nếu bạn để lại những thứ này\n

22116
21:08:02,084 --> 21:08:04,042
có thể ngó quanh và xem\nbạn đang làm gì.

22117
21:08:09,138 --> 21:08:11,523
ĐỐI TƯỢNG: Bạn phải\nsao chép [KHÔNG NGHE ĐƯỢC]..

22118
21:08:15,532 --> 21:08:18,792
Ý tôi là, nếu bạn loại bỏ GET\n

22119
21:08:18,792 --> 21:08:22,194
lịch sử của bạn, tính năng tự động hoàn tất của bạn\ngs khá ít hữu ích.

22120
21:08:22,194 --> 21:08:25,152
Bởi vì không có thông tin nào\n

22121
21:08:25,152 --> 21:08:26,569
đi qua menu và nhấn Enter.

22122
21:08:26,569 --> 21:08:28,182
Bạn sẽ phải điền lại biểu mẫu.

22123
21:08:28,182 --> 21:08:30,389
Và có\triệu chứng khác mà bạn có thể thấy ở đây.

22124
21:08:30,389 --> 21:08:33,014
Hãy để tôi thu nhỏ và\ntôi tải lại trang này.

22125
21:08:33,014 --> 21:08:34,932
Lưu ý rằng bạn sẽ nhận được\ncảnh báo này và nó sẽ

22126
21:08:34,932 --> 21:08:39,551
trông khác trong Safari và Firefox\n

22127
21:08:40,342 --> 21:08:43,932
Vì vậy, trình duyệt của bạn có thể nhớ những gì\n

22128
21:08:43,932 --> 21:08:45,711
nhưng chỉ khi bạn đang ở trên trang này.

22129
21:08:45,711 --> 21:08:50,562
Và điều này trái ngược với GET,\ntrong đó trạng thái là thông tin.

22130
21:08:50,562 --> 21:08:53,957
Giống như các cặp giá trị khóa được\nhúng vào chính URL đó.

22131
21:08:53,956 --> 21:08:56,081
Và nếu bạn đã xem\nemail tôi đã gửi sớm hôm nay

22132
21:08:56,081 --> 21:08:59,277
Tôi đã cố tình liên kết\nvới https://www.google.c

22133
21:08:59,277 --> 21:09:00,881
om/search?q=Mấy giờ rồi.

22134
21:09:06,971 --> 21:09:11,471
Theo định nghĩa, đây là một yêu cầu GET\n khi bạn nhấp vào nó.

22135
21:09:11,471 --> 21:09:14,861
Bởi vì nó sẽ lấy\nthông tin, cặp giá trị khóa

22136
21:09:14,861 --> 21:09:18,171
từ URL, gửi nó tới Google\n

22137
21:09:18,172 --> 21:09:20,592
Và lý do tôi gửi\nthông tin này qua email trước đó là vì tôi

22138
21:09:20,592 --> 21:09:23,812
muốn mọi người có thể nhanh chóng\n

22139
21:09:23,812 --> 21:09:27,732
Và vì vậy tôi có thể sắp xếp tự động hóa quy trình\n

22140
21:09:27,732 --> 21:09:29,952
nhưng điều đó bạn gây ra khi\nbạn nhấp vào liên kết đó.

22141
21:09:29,952 --> 21:09:35,381
Nếu Google không hỗ trợ GET thì họ\n

22142
21:09:35,381 --> 21:09:38,171
sẽ gửi tất cả các bạn đến\nURL này, thật không may

22143
21:09:39,762 --> 21:09:42,972
lẽ ra tôi phải thêm vào\n của mình

22144
21:09:44,812 --> 21:09:46,522
Vì vậy, nó chỉ có hại cho khả năng sử dụng.

22145
21:09:46,521 --> 21:09:49,721
Vì vậy, ở đó, chúng ta cũng có thể có thiết kế\n

22146
21:09:49,721 --> 21:09:53,261
mà còn cả thiết kế khi nói đến\ntrải nghiệm người dùng hoặc UX

22147
21:09:53,262 --> 21:09:54,941
như một nhà khoa học máy tính sẽ gọi nó.

22148
21:09:54,941 --> 21:09:58,211
Cuối cùng, chỉ xét về những gì bạn muốn\ntối ưu hóa.

22149
21:09:58,211 --> 21:10:00,081
Vì vậy, GET và POST đều có vai trò của chúng.

22150
21:10:00,081 --> 21:10:02,581
Điều này phụ thuộc vào loại\nchức năng bạn muốn cung cấp

22151
21:10:02,581 --> 21:10:06,911
và loại độ nhạy cảm\ncó thể có xung quanh nó.

22152
21:10:06,911 --> 21:10:10,122
Được rồi, có bất kỳ câu hỏi nào, sau đó,\n

22153
21:10:10,122 --> 21:10:13,722
Cực kỳ đơn giản, chỉ cần lấy\ntên của ai đó và in lại.

22154
21:10:13,721 --> 21:10:16,031
Nhưng bây giờ chúng tôi có tất cả\nhệ thống ống nước mà

22155
21:10:16,032 --> 21:10:19,032
để tạo ra hầu hết mọi thứ chúng ta muốn.

22156
21:10:21,820 --> 21:10:24,112
Được rồi, chúng ta hãy tiếp tục\nvà nghỉ ngơi năm phút.

22157
21:10:24,111 --> 21:10:27,951
Và khi chúng tôi quay lại, chúng tôi sẽ thêm vào\n

22158
21:10:30,202 --> 21:10:32,182
Và nhớ lại rằng điều\ncuối cùng chúng ta vừa thay đổi

22159
21:10:32,182 --> 21:10:34,941
là lộ trình sử dụng\nPOST thay vì GET.

22160
21:10:34,941 --> 21:10:37,851
Vậy là tên của tôi và\nbất kỳ giá trị nào trong URL đã biến mất.

22161
21:10:37,851 --> 21:10:44,031
Nhưng có một lỗi hoặc thay đổi nhỏ\n

22162
21:10:44,032 --> 21:10:47,062
Tôi đã nhập David vào\nbiểu mẫu và tôi đã nhấp vào Gửi

22163
21:10:47,062 --> 21:10:50,452
vậy mà ở đây\nnó đang nói xin chào thế giới bằng dấu phẩy.

22164
21:10:50,452 --> 21:10:53,491
Vì vậy, nó dường như bị\nđột nhiên bị hỏng

22165
21:10:53,491 --> 21:10:56,572
mặc dù chúng tôi đã thêm hỗ trợ cho POST.

22166
21:10:56,572 --> 21:10:58,792
Nhưng có điều gì đó không ổn.

22167
21:10:58,792 --> 21:11:01,342
Về mặt logic, nó phải là trường hợp ở đây.

22168
21:11:01,342 --> 21:11:05,461
Theo trực giác, nếu tôi nhìn thấy\n

22169
21:11:07,161 --> 21:11:10,101
Chắc là nó\nkhông nhìn thấy khóa có tên

22170
21:11:10,101 --> 21:11:14,482
tên trong request.args, đó là tên này.

22171
21:11:14,482 --> 21:11:16,851
Cung cấp cho bạn quyền truy cập vào\nmọi thứ sau URL.

22172
21:11:16,851 --> 21:11:19,471
Đó là bởi vì có điều này\nkhác mà chúng ta nên biết

22173
21:11:19,471 --> 21:11:21,741
không chỉ là\nrequest.args mà còn là request.form.

22174
21:11:21,741 --> 21:11:26,211
Chúng được đặt tên khủng khiếp, nhưng\nrequest.args dành cho các yêu cầu GET

22175
21:11:26,211 --> 21:11:28,804
request.form dành cho các yêu cầu POST.

22176
21:11:28,804 --> 21:11:31,012
Mặt khác, chúng khá giống nhau về mặt chức năng.

22177
21:11:31,012 --> 21:11:33,592
Nhưng trách nhiệm thuộc về bạn,\nngười dùng hay lập trình viên

22178
21:11:33,592 --> 21:11:35,832
để đảm bảo bạn đang sử dụng đúng loại.

22179
21:11:35,831 --> 21:11:38,671
Vì vậy tôi nghĩ nếu chúng ta muốn\nthoát khỏi thế giới

22180
21:11:38,672 --> 21:11:41,002
và thực sự nhìn thấy những gì\ntôi, con người, đã nhập vào

22181
21:11:41,001 --> 21:11:45,201
Tôi nghĩ tôi chỉ có thể thay đổi\nrequest.args thành request.form.

22182
21:11:45,202 --> 21:11:47,782
Vẫn chấm get, vẫn\nquote bỏ trích dẫn "tên

22183
21:11:47,782 --> 21:11:52,252
và bây giờ, nếu tôi tiếp tục và chạy lại\nFlask trong cửa sổ terminal của mình

22184
21:11:52,251 --> 21:11:54,776
quay lại trình duyệt của tôi,\nquay lại-- và thực ra

22185
21:11:54,777 --> 21:11:56,152
Tôi thậm chí sẽ không quay lại mẫu đơn.

22186
21:11:56,152 --> 21:11:59,392
Thực sự tôi sẽ tải lại,\nCommand R hoặc Control R

22187
21:11:59,392 --> 21:12:02,572
và cảnh báo này\nnói rằng nó sẽ gửi đi

22188
21:12:02,572 --> 21:12:05,001
thông tin tương tự cho trang web.

22189
21:12:05,001 --> 21:12:08,901
Khi tôi nhấp vào Tiếp tục, bây giờ tôi\nsẽ thấy dấu phẩy xin chào David.

22190
21:12:08,902 --> 21:12:11,182
Vì vậy, một lần nữa, bạn cũng\nsẽ gặp phải, có thể

22191
21:12:11,182 --> 21:12:12,801
tất cả những sự tinh tế nhỏ này.

22192
21:12:12,801 --> 21:12:15,801
Nhưng nếu bạn thực sự tập trung vào\nnhững nguyên tắc đầu tiên của tuần trước

22193
21:12:15,801 --> 21:12:18,682
giống như HTTP là gì,\nnó hoạt động như thế nào với yêu cầu

22194
21:12:18,682 --> 21:12:20,786
yêu cầu POST\nhiện tại hoạt động như thế nào, bạn nên

22195
21:12:20,786 --> 21:12:22,911
có rất nhiều yếu tố xây dựng tinh thần

22196
21:12:22,911 --> 21:12:25,101
để giải quyết những vấn đề như thế này.

22197
21:12:25,101 --> 21:12:28,342
Và để tôi cho bạn một ý tưởng khác\n

22198
21:12:28,342 --> 21:12:32,662
Khung công tác này có tên là Flask chỉ là một\n

22199
21:12:32,661 --> 21:12:36,262
tất cả đều thực hiện cùng một\nmô hình, cùng một cách suy nghĩ

22200
21:12:36,262 --> 21:12:38,482
và cùng một cách\nlập trình ứng dụng.

22201
21:12:38,482 --> 21:12:41,932
Và nó được gọi là MVC,\nbộ điều khiển chế độ xem mô hình.

22202
21:12:41,932 --> 21:12:46,432
Và đây là một sơ đồ rất đơn giản\n

22203
21:12:46,432 --> 21:12:48,301
và tôi đã thực hiện cho đến nay.

22204
21:12:48,301 --> 21:12:51,292
Và thực ra, điều này còn hơn cả\n

22205
21:12:51,292 --> 21:12:55,123
Trong app.py là công việc của một lập trình viên\n

22206
21:12:55,123 --> 21:12:57,081
Đó là mã bạn đang\nviết, mã này được gọi là

22207
21:12:57,081 --> 21:13:01,131
logic kinh doanh tạo ra tất cả\n

22208
21:13:01,131 --> 21:13:03,471
những giá trị nào cần hiển thị, v.v.

22209
21:13:03,471 --> 21:13:09,861
Trong bố cục.html, index.html, hello.html\n

22210
21:13:09,861 --> 21:13:12,651
đó là sự hình dung\nrằng con người thực sự

22211
21:13:14,271 --> 21:13:18,561
Những thứ đó thật ngu ngốc, chúng đẹp\n

22212
21:13:18,562 --> 21:13:20,991
Tất cả công việc khó khăn đều được thực hiện trong app.py.

22213
21:13:20,991 --> 21:13:26,001
Vậy bộ điều khiển, hay còn gọi là app.py, nằm ở đâu\n

22214
21:13:26,001 --> 21:13:31,491
Và theo quan điểm của bạn là nơi HTML và\n của bạn

22215
21:13:31,491 --> 21:13:35,512
dấu ngoặc nhọn, dấu ngoặc nhọn\n

22216
21:13:35,512 --> 21:13:39,411
Chúng tôi chưa thêm mô hình M\nto MVC, đó là

22217
21:13:39,411 --> 21:13:42,322
sẽ đề cập đến những thứ\nnhư tệp CSV hoặc cơ sở dữ liệu.

22218
21:13:42,322 --> 21:13:46,116
Mô hình, nơi bạn lưu giữ\dữ liệu thực tế, thường là lâu dài.

22219
21:13:46,116 --> 21:13:47,991
Vậy chúng ta sẽ quay lại\nvấn đề đó, nhưng bức ảnh này

22220
21:13:47,991 --> 21:13:52,312
nơi bạn có một trong số này-- mỗi cái\n

22221
21:13:52,312 --> 21:13:55,222
một cái khác là đại diện cho\ncách thức hoạt động của rất nhiều khung công tác.

22222
21:13:55,221 --> 21:13:58,792
Những gì chúng tôi dạy hôm nay, tuần này,\n

22223
21:13:58,792 --> 21:14:01,581
Nó không thực sự cụ thể đối với Flask,\n

22224
21:14:01,581 --> 21:14:03,471
Đó thực sự là một mô hình rất\nphổ biến mà bạn

22225
21:14:03,471 --> 21:14:08,211
có thể triển khai bằng Java, C Sharp hoặc\n

22226
21:14:08,211 --> 21:14:12,595
Được rồi, bây giờ chúng ta hãy\nquay lại Mã VS tại đây.

22227
21:14:12,595 --> 21:14:14,512
Hãy để tôi ngừng chạy\nFlask và để tôi tiếp tục

22228
21:14:14,512 --> 21:14:19,922
và tạo một thư mục mới hoàn toàn\n

22229
21:14:19,922 --> 21:14:24,592
Và hãy để tôi tiếp tục và tạo thư mục\na có tên FroshIMS

22230
21:14:24,592 --> 21:14:27,862
đại diện cho sinh viên năm nhất nội bộ\n

22231
21:14:29,422 --> 21:14:32,601
Và bây giờ tôi sẽ mã hóa một app.py.

22232
21:14:32,601 --> 21:14:36,351
Và trong sự mong chờ, tôi sẽ\n

22233
21:14:36,351 --> 21:14:38,251
Cái này trong thư mục FroshIMS.

22234
21:14:38,251 --> 21:14:42,351
Và sau đó trong thư mục mẫu của tôi,\n

22235
21:14:42,351 --> 21:14:44,482
và tôi sắp bắt đầu tự mình bắt đầu ở đây.

22236
21:14:46,221 --> 21:14:48,741
Tôi chỉ sao chép bố cục của mình\ntừ trước đó vì hầu hết

22237
21:14:48,741 --> 21:14:53,031
công việc thú vị của tôi lần này là\n

22238
21:14:53,032 --> 21:14:54,512
Vậy chúng ta đang tạo ra cái gì?

22239
21:14:54,512 --> 21:14:58,282
Vì vậy, theo nghĩa đen, điều\nđầu tiên tôi viết dưới dạng một ứng dụng web

22240
21:14:58,282 --> 21:15:02,042
20 năm trước, có một trang web\ntheo đúng nghĩa đen như thế này.

22241
21:15:02,042 --> 21:15:04,131
Vì vậy, lúc đó tôi giống như một sinh viên năm hai\hay năm cuối.

22242
21:15:04,131 --> 21:15:06,982
Tôi chỉ học CS50 và một lớp tiếp theo.

22243
21:15:06,982 --> 21:15:08,889
Tôi không biết lập trình web như thế nào.

22244
21:15:08,888 --> 21:15:11,721
Cả hai khóa học đó đều không được dạy\n

22245
21:15:11,721 --> 21:15:14,391
Vì vậy, vào thời điểm đó, tôi đã tự học một ngôn ngữ tên là Perl.

22246
21:15:14,392 --> 21:15:18,000
Và tôi đã học được đôi điều về\n

22247
21:15:18,000 --> 21:15:20,542
thậm chí không thể nói là đã tra google đủ,\nvì Google chưa xuất hiện

22248
21:15:22,142 --> 21:15:26,432
Đọc đủ trực tuyến để tìm ra cách\n

22249
21:15:26,432 --> 21:15:29,282
trong khuôn viên trường, năm đầu tiên,\nthực sự có thể đăng ký

22250
21:15:29,282 --> 21:15:32,162
thông qua một trang web về thể thao nội bộ.

22251
21:15:32,161 --> 21:15:35,161
Vào thời của tôi, bạn\nsẽ điền vào một tờ giấy theo đúng nghĩa đen

22252
21:15:35,161 --> 21:15:38,491
rồi đi bộ qua sân tới\n

22253
21:15:38,491 --> 21:15:40,861
trượt nó dưới ký túc xá\ncủa Giám thị hoặc RA

22254
21:15:40,861 --> 21:15:43,381
và do đó bạn đã\nđăng ký tham gia các môn thể thao.

22255
21:15:46,532 --> 21:15:48,512
Đã có mạng Internet,\nthực sự là chưa tồn tại

22256
21:15:48,512 --> 21:15:50,801
được sử dụng nhiều trong khuôn viên trường hoặc nói chung hơn.

22257
21:15:50,801 --> 21:15:54,301
Vì vậy, hình nền\nlặp đi lặp lại vô tận

22258
21:15:54,301 --> 21:15:56,611
rõ ràng là đang thịnh hành vào thời điểm đó.

22259
21:15:56,611 --> 21:15:58,951
Tất cả những thứ này giống như những hình ảnh\nmà tôi phải tự tay tạo ra

22260
21:15:58,952 --> 21:16:03,881
bởi vì chúng tôi không có các tính năng\n

22261
21:16:03,881 --> 21:16:07,801
Vì vậy, nó thực sự chỉ là HTML và nó\n

22262
21:16:09,512 --> 21:16:12,301
Và nó thực sự chỉ là\nnhững khối xây dựng giống nhau

22263
21:16:12,301 --> 21:16:15,131
mà chúng ta đã nghe nói ngày nay bây giờ đã có.

22264
21:16:15,131 --> 21:16:17,702
Vì vậy, chúng ta sẽ loại bỏ tất cả\nhình ảnh và tập trung hơn

22265
21:16:17,702 --> 21:16:19,952
về chức năng và\tính thẩm mỹ, nhưng hãy xem

22266
21:16:19,952 --> 21:16:23,252
nếu chúng ta có thể tạo ra một ứng dụng web\n mà qua đó ai đó có thể

22267
21:16:23,251 --> 21:16:26,281
đăng ký một môn thể thao nội bộ như vậy.

22268
21:16:26,282 --> 21:16:29,972
Vì vậy, trong app.py, tôi tiếp tục và\ninhập một số thứ quen thuộc ngay bây giờ.

22269
21:16:29,971 --> 21:16:33,481
Từ Flask, hãy nhập\ncapital Flask,

22270
21:16:33,482 --> 21:16:36,482
đó có phải là chức năng mà chúng ta cần khởi động\n

22271
21:16:36,482 --> 21:16:39,661
Kết xuất các mẫu, vì vậy chúng ta có\n

22272
21:16:39,661 --> 21:16:42,122
những mẫu đó và yêu cầu\nđể chúng tôi có khả năng

22273
21:16:42,122 --> 21:16:44,850
để có được đầu vào từ con người.

22274
21:16:44,850 --> 21:16:46,892
Hãy để tôi tiếp tục và tạo\nứng dụng đó

22275
21:16:46,892 --> 21:16:49,302
sử dụng câu thần chú kỳ diệu này ở đây.

22276
21:16:49,301 --> 21:16:56,141
Và sau đó chúng ta hãy tiếp tục và xác định một\n

22277
21:16:56,142 --> 21:16:58,022
Tôi sẽ định nghĩa một\nhàm có tên là index.

22278
21:16:58,021 --> 21:17:00,661
Nhưng nói rõ hơn, hàm\n này có thể là bất cứ thứ gì.

22279
21:17:00,661 --> 21:17:03,221
Foo, bar, baz, bất cứ thứ gì khác.

22280
21:17:03,221 --> 21:17:05,281
Nhưng tôi có xu hướng đặt tên\nchúng theo cách

22281
21:17:05,282 --> 21:17:07,022
phù hợp với tên\ntuyến đường.

22282
21:17:07,021 --> 21:17:09,061
Nhưng bạn có thể gọi nó\nbất cứ tên gì bạn muốn, đó là

22283
21:17:09,062 --> 21:17:12,601
chỉ là hàm sẽ nhận được\n

22284
21:17:12,601 --> 21:17:14,851
Bây giờ, hãy để tôi tiếp tục\nvà bắt đầu mọi việc.

22285
21:17:14,851 --> 21:17:18,294
Trả về, render mẫu của file index.html.

22286
21:17:18,294 --> 21:17:19,711
Chỉ cần giữ nó đơn giản, không có gì hơn.

22287
21:17:19,711 --> 21:17:22,622
Vì vậy không có thông tin cụ thể\nFroshIM nào về vấn đề này ở đây

22288
21:17:22,622 --> 21:17:25,172
Tôi chỉ muốn đảm bảo rằng tôi\nlàm mọi thứ một cách chính xác.

22289
21:17:25,172 --> 21:17:27,152
Trong khi đó, tôi đã có bố cục của mình.

22290
21:17:27,152 --> 21:17:31,562
Được rồi, hãy để tôi tiếp tục và trong thư mục\ntemplates của tôi, hãy mã hóa một tệp

22291
21:17:33,751 --> 21:17:40,051
Và hãy mở rộng\nlayout.html ở trên cùng

22292
21:17:40,051 --> 21:17:42,152
chỉ để chúng ta nhận được\nlợi ích từ mẫu đó.

22293
21:17:42,152 --> 21:17:44,012
Và ở dưới đây, tôi\nsẽ nói phải làm.

22294
21:17:44,012 --> 21:17:47,012
Chỉ để tôi có điều gì đó\nđang diễn ra một cách trực quan để đảm bảo

22295
21:17:48,452 --> 21:17:51,782
Trong thư mục FroshIMS của tôi,\nhãy để tôi chạy Flask.

22296
21:17:51,782 --> 21:17:54,961
Bây giờ hãy để tôi quay lại URL trước đó của tôi,\n

22297
21:17:54,961 --> 21:17:59,611
Nhưng bây giờ, tôi đang phục vụ\nup trang FroshIM.

22298
21:18:01,351 --> 21:18:04,622
Đó là vì tôi\nđã vô tình làm hỏng việc.

22299
21:18:04,622 --> 21:18:07,851
Tôi đã làm gì sai trong index.html?

22300
21:18:13,361 --> 21:18:16,229
Tệp này mở rộng bố cục.html, nhưng--

22301
21:18:16,229 --> 21:18:17,771
ĐỐI TƯỢNG: Bạn đã bỏ qua thẻ chặn?

22302
21:18:18,271 --> 21:18:22,661
Tôi quên nói với Flask những gì cần cắm vào bố cục đó.

22303
21:18:22,661 --> 21:18:26,801
Vì vậy tôi chỉ cần nói khối nội dung và\n

22304
21:18:26,801 --> 21:18:28,841
hoặc bất cứ điều gì tôi muốn\cuối cùng tìm đến.

22305
21:18:31,751 --> 21:18:34,091
OK, bây giờ nó trông xấu xí, khó hiểu hơn.

22306
21:18:34,092 --> 21:18:36,972
Nhưng một lần nữa, đây là bản chất của việc tạo khuôn mẫu.

22307
21:18:36,971 --> 21:18:41,101
Bây giờ hãy để tôi khởi động lại Flask\ntại đây, để tôi quay lại trang.

22308
21:18:41,733 --> 21:18:43,691
Tôi bắt chéo ngón tay lần này\nvà thế là chúng ta bắt đầu.

22309
21:18:44,081 --> 21:18:46,241
Vì vậy đây không phải là ứng dụng\nTôi muốn, nhưng ít nhất tôi

22310
21:18:46,241 --> 21:18:48,630
biết rằng tôi có một số\nhệ thống ống nước ở đó theo mặc định.

22311
21:18:48,630 --> 21:18:50,922
Được rồi, vậy nếu tôi muốn\nngười dùng có thể đăng ký

22312
21:18:50,922 --> 21:18:53,112
đối với một trong những môn thể thao này,\nhãy nâng cao ngay bây giờ

22313
21:18:53,111 --> 21:18:56,051
index.html để thực sự\ncó một biểu mẫu

22314
21:18:56,051 --> 21:18:59,811
có thể có một trình đơn thả xuống cho tất cả\n

22315
21:18:59,812 --> 21:19:01,991
Vì vậy, hãy để tôi đi vào mẫu này ở đây.

22316
21:19:01,991 --> 21:19:05,171
Và thay vì phải làm, chúng ta hãy\ntiếp tục và cống hiến hết mình

22317
21:19:05,172 --> 21:19:08,922
thế còn thẻ H1 chỉ ghi\n

22318
21:19:09,732 --> 21:19:13,032
Thế còn một thẻ biểu mẫu\nsẽ sử dụng POST thì sao

22319
21:19:13,032 --> 21:19:16,211
chỉ vì nó không thực sự cần thiết\n

22320
21:19:17,292 --> 21:19:20,021
Hành động cho việc đó,\nchúng tôi dự định tạo ra như thế nào

22321
21:19:20,021 --> 21:19:24,971
một lộ trình đăng ký để chúng tôi gửi\n

22322
21:19:24,971 --> 21:19:26,531
Vì vậy chúng ta sẽ phải quay lại vấn đề đó.

22323
21:19:26,532 --> 21:19:32,412
Ở đây, hãy để tôi tiếp tục và tạo,\n

22324
21:19:35,782 --> 21:19:37,824
Thế còn một cái tên bằng\ntên thì sao, bởi vì tôi là

22325
21:19:37,823 --> 21:19:40,781
sẽ hỏi học sinh\n của họ

22326
21:19:41,629 --> 21:19:43,211
Và kiểu của ô này sẽ là văn bản.

22327
21:19:43,211 --> 21:19:45,372
Vì vậy, điều này khá giống với trước đây.

22328
21:19:45,372 --> 21:19:48,822
Nhưng nếu bạn chưa thấy cái này\nyet, hãy tạo một menu chọn lọc

22329
21:19:48,822 --> 21:19:51,042
cái gọi là menu thả xuống trong HTML.

22330
21:19:51,042 --> 21:19:54,551
Và có lẽ lựa chọn đầu tiên\nTôi muốn ở đó

22331
21:19:54,551 --> 21:19:58,331
sẽ như thế nào, ồ, còn ba người hiện tại thì sao

22332
21:19:58,331 --> 21:20:05,322
các môn thể thao cho mùa thu, đó là\nbóng rổ và một lựa chọn khác

22333
21:20:05,322 --> 21:20:07,902
sẽ là bóng đá,\nvà lựa chọn thứ ba là

22334
21:20:07,902 --> 21:20:13,461
sẽ là chiếc đĩa ném cuối cùng dành cho\n

22335
21:20:13,461 --> 21:20:14,922
Vì vậy tôi có ba lựa chọn đó.

22336
21:20:16,062 --> 21:20:20,412
Tôi chưa triển khai lộ trình của mình,\n

22337
21:20:20,411 --> 21:20:23,682
để quay lại ngay bây giờ và kiểm tra\n xem biểu mẫu của tôi đã được tải lại chưa.

22338
21:20:23,682 --> 21:20:26,419
Vì vậy, hãy để tôi tiếp tục\ndừng lại và khởi động Flask.

22339
21:20:26,419 --> 21:20:28,961
Bạn sẽ thấy có nhiều cách\tự động hóa quá trình khởi động lại

22340
21:20:28,961 --> 21:20:31,122
máy chủ mà chúng tôi sẽ làm cho\nbạn cho tập hợp vấn đề thứ chín

22341
21:20:31,122 --> 21:20:32,832
vì vậy bạn không cần phải\ntiếp tục dừng Flask.

22342
21:20:32,831 --> 21:20:36,822
Hãy để tôi tải lại lộ trình chỉ mục của mình\nvà được rồi, nó không đẹp lắm.

22343
21:20:39,762 --> 21:20:41,832
Nhưng bây giờ nó có ít nhất\nmột số chức năng

22344
21:20:41,831 --> 21:20:44,921
nơi tôi có thể nhập tên của mình\nvà sau đó nhập môn thể thao.

22345
21:20:44,922 --> 21:20:47,502
Hiện tại, tôi có thể đang thiên về\nmọi người đối với bóng rổ.

22346
21:20:47,501 --> 21:20:51,971
Giống như trải nghiệm người dùng, trải nghiệm người dùng\nkhôn ngoan, việc kiểm tra trước thật khó chịu

22347
21:20:51,971 --> 21:20:53,572
bóng rổ nhưng không phải những người khác.

22348
21:20:53,572 --> 21:20:55,572
Vì vậy, chúng tôi có thể khắc phục một số điểm yếu\nnhỏ đó.

22349
21:20:55,572 --> 21:20:57,822
Hãy để tôi quay lại index.html.

22350
21:20:57,822 --> 21:21:04,110
Hãy để tôi tạo một tùy chọn trống ở đây\n

22351
21:21:04,110 --> 21:21:05,652
sẽ có tên của bất kỳ môn thể thao nào.

22352
21:21:05,652 --> 21:21:08,110
Nhưng nó sẽ có\ntừ tôi muốn con người nhìn thấy

22353
21:21:08,110 --> 21:21:12,622
nên thực ra tôi sẽ vô hiệu hóa cái này\n

22354
21:21:12,622 --> 21:21:15,012
Nhưng tôi sẽ nói thể thao ở đây.

22355
21:21:15,012 --> 21:21:18,491
Và có nhiều cách khác nhau để thực hiện việc này,\n

22356
21:21:22,422 --> 21:21:24,762
Tạo một trình giữ chỗ\nsports để người dùng

22357
21:21:24,762 --> 21:21:26,862
nhìn thấy một cái gì đó trong danh sách thả xuống.

22358
21:21:26,861 --> 21:21:29,932
Hãy để tôi tiếp tục và khởi động lại\nFlask, tải lại trang

22359
21:21:29,932 --> 21:21:31,932
và bây giờ mọi chuyện sẽ\ntốt hơn một chút.

22360
21:21:31,932 --> 21:21:34,122
Bây giờ bạn thấy môn thể thao\nđược chọn theo mặc định

22361
21:21:34,122 --> 21:21:37,092
nhưng cuối cùng bạn phải kiểm tra một trong\nnhững cái khác.

22362
21:21:37,092 --> 21:21:38,482
Được rồi, thế là khá tốt rồi.

22363
21:21:38,482 --> 21:21:40,692
Vì vậy bây giờ hãy để tôi gõ vào David.

22364
21:21:40,691 --> 21:21:43,121
Tôi sẽ đăng ký đĩa ném đĩa cuối cùng.

22365
21:21:43,122 --> 21:21:46,512
Được rồi, tôi chắc chắn đã quên điều gì đó.

22366
21:21:48,702 --> 21:21:52,782
Được rồi, vậy loại đầu vào bằng với việc gửi.

22367
21:21:52,782 --> 21:21:54,102
Được rồi, hãy đặt nó vào.

22368
21:21:57,544 --> 21:21:58,961
Gửi có thể đẹp hơn một chút.

22369
21:21:58,961 --> 21:22:03,491
Hãy nhớ rằng chúng ta có thể thay đổi một số\n

22370
21:22:03,491 --> 21:22:05,652
Giá trị của nút này\nphải là giá trị đăng ký, có thể

22371
21:22:05,652 --> 21:22:07,241
chỉ để làm cho mọi thứ đẹp hơn một chút.

22372
21:22:07,241 --> 21:22:10,456
Bây giờ hãy để tôi tải lại trang và đăng ký.

22373
21:22:10,456 --> 21:22:13,331
Được rồi, bây giờ chúng ta thực sự có\n

22374
21:22:13,331 --> 21:22:17,741
mà tôi đã tạo cách đây vài năm để cho phép\n

22375
21:22:17,741 --> 21:22:21,641
Vì vậy, bây giờ hãy bắt đầu và tạo ra có thể\n

22376
21:22:22,691 --> 21:22:25,686
Và ở đây, nếu chúng ta muốn\cho phép người dùng đăng ký

22377
21:22:25,687 --> 21:22:28,812
hãy kiểm tra lỗi một chút\n

22378
21:22:28,812 --> 21:22:30,612
Người dùng có thể làm gì sai?

22379
21:22:30,611 --> 21:22:32,801
Bởi vì giả định rằng họ sẽ làm vậy.

22380
21:22:32,801 --> 21:22:34,631
Thứ nhất, họ có thể không gõ tên của mình.

22381
21:22:34,631 --> 21:22:36,505
Thứ hai, họ có thể không chọn một môn thể thao.

22382
21:22:36,505 --> 21:22:38,172
Vì vậy, họ có thể chỉ gửi một biểu mẫu trống.

22383
21:22:38,172 --> 21:22:40,302
Vì vậy, đó là hai điều chúng tôi\ncó thể kiểm tra, chỉ là

22384
21:22:40,301 --> 21:22:43,721
để chúng tôi không ghi điểm giả\n

22385
21:22:43,721 --> 21:22:47,351
Vì vậy, hãy tạo một\ntuyến đường khác có tên là hello, /greet.

22386
21:22:47,351 --> 21:22:50,501
Và sau đó, trong lộ trình này, hãy\ntạo một hàm có tên là chào

22387
21:22:50,501 --> 21:22:52,661
nhưng có thể được gọi là bất cứ điều gì chúng ta muốn.

22388
21:22:52,661 --> 21:22:56,054
Sau đó chúng ta hãy tiếp tục và vào\n

22389
21:22:56,054 --> 21:22:57,221
và xác nhận việc gửi.

22390
21:22:57,221 --> 21:22:59,351
Vì vậy, một chút nhận xét cho bản thân mình ở đây.

22391
21:22:59,351 --> 21:23:08,031
Sẽ thế nào nếu không có giá trị tên\nrequest.form GET

22392
21:23:08,032 --> 21:23:10,211
vậy đó là nếu hàm\n đó không trả về gì cả

22393
21:23:10,211 --> 21:23:14,062
như trích dẫn không trích dẫn hoặc\ntừ đặc biệt không có trong Python.

22394
21:23:14,062 --> 21:23:25,042
Hoặc request.form.get"sport" không phải\nin quote unquote, chúng là gì?

22395
21:23:25,042 --> 21:23:32,122
Bóng rổ, môn còn lại là bóng đá,\n

22396
21:23:32,122 --> 21:23:35,961
Hơi dài một chút nhưng hãy chú ý\n

22397
21:23:35,961 --> 21:23:39,051
Nếu người dùng không cung cấp tên cho chúng tôi, nghĩa là

22398
21:23:39,051 --> 21:23:41,671
nếu hàm này trả về\ntương đương với false

22399
21:23:41,672 --> 21:23:45,592
nghĩa là trích dẫn không trích dẫn hoặc theo nghĩa đen\n

22400
21:23:45,592 --> 21:23:52,252
Hoặc nếu môn thể thao mà người dùng cung cấp là\n

22401
21:23:52,251 --> 21:23:56,061
hoặc đĩa ném cuối cùng mà tôi đã xác định\n

22402
21:23:56,062 --> 21:23:57,652
và chỉ la mắng người dùng theo một cách nào đó.

22403
21:23:57,652 --> 21:24:02,961
Hãy trả về kết xuất\nmẫu của failed.html.

22404
21:24:02,961 --> 21:24:06,211
Và đó sẽ chỉ là một số\n

22405
21:24:06,211 --> 21:24:08,751
Ngược lại, nếu họ đã đi xa đến mức này, hãy tiếp tục

22406
21:24:08,751 --> 21:24:12,111
và xác nhận đăng ký\nbằng cách quay lại-- rất tiếc

22407
21:24:12,111 --> 21:24:18,182
trả về trích dẫn mẫu kết xuất\nunquote "thành công" chấm HTML.

22408
21:24:18,182 --> 21:24:20,461
Được rồi, vậy có vài\nviệc cần làm nhanh.

22409
21:24:20,461 --> 21:24:25,111
Trước tiên hãy để tôi vào và vào thư mục mẫu của tôi

22410
21:24:25,111 --> 21:24:28,291
hãy tạo tệp failed.html này.

22411
21:24:28,292 --> 21:24:31,191
Và đây chỉ nhằm\nlà một thông điệp gửi tới người dùng

22412
21:24:31,191 --> 21:24:34,262
rằng họ không cung cấp\nthông tin một cách chính xác.

22413
21:24:34,262 --> 21:24:37,042
Vì vậy, hãy để tôi tiếp tục và trong failed.html.

22414
21:24:40,012 --> 21:24:44,902
Vì vậy, hãy để tôi mở rộng bố cục.html và trong\n

22415
21:24:44,902 --> 21:24:47,902
Tôi sẽ la mắng họ như vậy\n

22416
21:24:47,902 --> 21:24:52,521
Và sau đó hãy để tôi tạo một\ntệp khác có tên là Success.html, tệp đó

22417
21:24:52,521 --> 21:24:54,904
tương tự chủ yếu chỉ là cú pháp Jinja.

22418
21:24:54,904 --> 21:24:57,322
Và tôi chỉ định nói\nbây giờ, mặc dù họ không

22419
21:24:57,322 --> 21:24:59,902
được đăng ký về mặt kỹ thuật trong bất kỳ\ncơ sở dữ liệu nào, bạn đã được đăng ký.

22420
21:24:59,902 --> 21:25:02,032
Đó là ý nghĩa của sự thành công.

22421
21:25:02,032 --> 21:25:05,211
Được rồi, hãy để tôi tiếp tục\nvà quay lại FroshIMS của tôi

22422
21:25:07,131 --> 21:25:09,322
Hãy để tôi quay lại biểu mẫu và tải lại.

22423
21:25:10,911 --> 21:25:13,881
Được rồi, bây giờ hãy để tôi\nkhông hợp tác và chỉ

22424
21:25:13,881 --> 21:25:17,061
bấm ngay vào Register sốt ruột.

22425
21:25:20,721 --> 21:25:24,769
Đăng ký-- ồ, tôi\nđang nhầm lẫn hai ví dụ của chúng ta.

22426
21:25:24,770 --> 21:25:26,062
Được rồi, tôi đã phát hiện ra lỗi.

22427
21:25:32,241 --> 21:25:35,812
Đó là nơi tôi đang ở,\ntôi thực sự đã phát minh ra cái gì ở đây?

22428
21:25:44,562 --> 21:25:45,812
ĐỐI TƯỢNG: Đăng ký, không chào hỏi.

22429
21:25:47,611 --> 21:25:50,731
Tôi đã nghĩ đến ví dụ cuối cùng,\nvì vậy tuyến đường phải được đăng ký.

22430
21:25:50,732 --> 21:25:54,122
Trớ trêu thay, hàm này có thể là lời chào,\n

22431
21:25:54,122 --> 21:25:57,792
Nhưng để giữ cho mình tỉnh táo, chúng ta hãy\n

22432
21:25:57,792 --> 21:26:00,218
Hãy để tôi tiếp tục và\nkhởi động Flask như dự định.

22433
21:26:00,218 --> 21:26:02,551
Hãy để tôi tải lại biểu mẫu\nđể đảm bảo tất cả đều hoạt động.

22434
21:26:02,551 --> 21:26:06,902
Bây giờ, xin đừng hợp tác và trở thành\na người dùng xấu, hãy nhấp vào đăng ký--

22435
21:26:07,982 --> 21:26:10,652
OK, lỗi ngoài ý muốn khác.

22436
21:26:10,652 --> 21:26:12,881
Nhưng cái này chúng ta đã thấy trước đây.

22437
21:26:12,881 --> 21:26:15,721
Lưu ý rằng theo mặc định,\nroute chỉ hỗ trợ GET.

22438
21:26:15,721 --> 21:26:18,721
Vì vậy, nếu tôi muốn\nhỗ trợ cụ thể cho POST

22439
21:26:18,721 --> 21:26:25,471
Tôi phải chuyển vào bằng một phương thức\n

22440
21:26:25,471 --> 21:26:28,351
các phương thức có thể là\nGET POST bằng dấu phẩy, nhưng nếu tôi

22441
21:26:28,351 --> 21:26:32,221
không cần GET in\n

22442
21:26:32,221 --> 21:26:34,741
Được rồi, bây giờ chúng ta hãy\nlàm điều này lần cuối.

22443
21:26:34,741 --> 21:26:37,441
Tải lại biểu mẫu để đảm bảo\mọi thứ đều ổn, nhấp vào Đăng ký

22444
21:26:37,441 --> 21:26:39,194
và bạn chưa được đăng ký.

22445
21:26:40,111 --> 21:26:42,528
Được rồi, hãy để tôi tiếp tục và ít nhất hãy cho họ biết tên tôi.

22446
21:26:44,312 --> 21:26:49,662
Được thôi, tôi sẽ tiếp tục\n

22447
21:26:53,402 --> 21:26:58,542
Tôi nên-- tôi muốn làm gì ở đây?

22448
21:26:58,542 --> 21:27:00,572
Được rồi, vậy hãy cùng tìm hiểu điều này.

22449
21:27:00,572 --> 21:27:04,711
Làm cách nào để gỡ lỗi một thứ như thế này,\n

22450
21:27:07,081 --> 21:27:10,351
Chúng ta có thể tiến hành\nkhắc phục sự cố này bằng cách nào?

22451
21:27:10,351 --> 21:27:13,202
Biến điều này thành thời điểm có thể dạy được.

22452
21:27:13,202 --> 21:27:15,782
Được rồi, trước tiên,\nhãy kiểm tra an toàn.

22453
21:27:17,372 --> 21:27:20,521
Hãy để tôi tiếp tục và xem trang\nsource, một nguyên tắc nhỏ.

22454
21:27:20,521 --> 21:27:23,081
Hãy xem mã HTML mà bạn thực sự đã gửi cho người dùng.

22455
21:27:23,081 --> 21:27:27,251
Vì vậy, ở đây, tôi có\đầu vào với một tên tên.

22456
21:27:27,251 --> 21:27:29,711
Đó là điều tôi dự định, có vẻ ổn.

22457
21:27:29,711 --> 21:27:32,551
À, tôi thấy rồi, kể cả\nbạn, nếu bạn chưa bao giờ

22458
21:27:32,551 --> 21:27:35,792
đã sử dụng một menu chọn lọc, có thể bạn\nkhông biết đó là gì

22459
21:27:35,792 --> 21:27:41,911
bị thiếu ở đây mà tôi không có để nhập văn bản.

22460
21:27:41,911 --> 21:27:45,466
Chỉ bằng trực giác, logic.

22461
21:27:45,467 --> 21:27:47,342
Điều gì đang diễn ra trong đầu tôi, thật đáng xấu hổ

22462
21:27:47,342 --> 21:27:51,692
được thôi, nếu biểu mẫu của tôi nghĩ\n

22463
21:27:51,691 --> 21:27:55,471
làm thế nào tôi có thể tạo ra một tình huống trong đó\n

22464
21:27:55,471 --> 21:27:57,481
À, tên, tôi không nghĩ\nit sẽ để trống

22465
21:27:57,482 --> 21:28:01,262
bởi vì tôi đã đặt tên cho\ntrường văn bản này một cách rõ ràng

22466
21:28:01,262 --> 21:28:02,972
và điều đó đã có tác dụng lần trước.

22467
21:28:02,971 --> 21:28:06,421
Bây giờ tôi đã cung cấp đầu vào thứ hai\nin dưới dạng menu chọn.

22468
21:28:06,422 --> 21:28:13,112
Nhưng điều gì dường như bị thiếu ở đây\nmà tôi cho là có tồn tại ở đây?

22469
21:28:13,111 --> 21:28:16,381
Đó chỉ là một sai lầm ngớ ngẩn mà tôi đã mắc phải.

22470
21:28:16,381 --> 21:28:19,448
Điều gì có thể còn thiếu ở đây?

22471
21:28:19,448 --> 21:28:23,552
Nếu request.form cung cấp cho bạn tất cả\nthông tin đầu vào mà người dùng có thể

22472
21:28:23,551 --> 21:28:26,551
đã gõ vào, hãy để tôi\ngo vào mã thực tế của tôi

22473
21:28:26,551 --> 21:28:30,451
ở đây dưới hình thức và tên của tôi tương đương với thể thao.

22474
21:28:30,452 --> 21:28:32,472
Tôi chỉ không đặt tên cho đầu vào đó.

22475
21:28:32,471 --> 21:28:34,651
Vì vậy, nó tồn tại và\ntrình duyệt không quan tâm.

22476
21:28:34,652 --> 21:28:36,485
Nó vẫn sẽ\nhiển thị biểu mẫu cho bạn

22477
21:28:36,485 --> 21:28:40,211
chỉ là nó chưa được đặt cho nó một cái tên duy nhất\n

22478
21:28:40,211 --> 21:28:42,551
Vậy nên bây giờ, nếu tôi không định đút chân vào miệng

22479
21:28:42,551 --> 21:28:44,741
Tôi nghĩ đó là điều tôi đã làm sai.

22480
21:28:44,741 --> 21:28:46,711
Và một lần nữa, quá trình\ncủa tôi để tìm ra điều đó

22481
21:28:46,711 --> 21:28:49,043
đang xem mã của tôi,\nsuy nghĩ một cách logic

22482
21:28:49,043 --> 21:28:50,251
cái này đúng không, cái này đúng không?

22483
21:28:50,251 --> 21:28:52,421
Không, tôi đã thiếu tên ở đó.

22484
21:28:52,422 --> 21:28:55,382
Vì vậy, hãy chạy Flask,\nhãy tải lại biểu mẫu

22485
21:28:55,381 --> 21:28:59,941
chỉ để đảm bảo tất cả đều là mặc định\n

22486
21:28:59,941 --> 21:29:04,441
trong trò chơi ném đĩa cuối cùng, lần này các ngón tay của tôi bắt chéo một cách khó khăn hơn.

22487
21:29:06,932 --> 21:29:08,664
Tôi không có ý định\nlàm hỏng việc theo cách đó

22488
21:29:08,664 --> 21:29:10,831
nhưng đó chính xác là\nloại quá trình suy nghĩ đúng đắn

22489
21:29:10,831 --> 21:29:12,152
để chẩn đoán các vấn đề như thế này.

22490
21:29:12,152 --> 21:29:16,021
Quay lại những điều cơ bản, quay lại những gì\n

22491
21:29:16,021 --> 21:29:18,432
và chỉ cai trị mọi thứ trong và ngoài.

22492
21:29:18,432 --> 21:29:21,182
Chỉ có một số lượng hữu hạn\n

22493
21:29:22,054 --> 21:29:23,410
KHÁN GIẢ: Bạn có [KHÔNG NGHE ĐƯỢC].

22494
21:29:25,581 --> 21:29:27,081
DAVID: Xin lỗi-- nói to hơn một chút nhé?

22495
21:29:27,081 --> 21:29:30,981
KHÁN GIẢ: Tôi không hiểu tại sao\ntên lại bằng môn thể thao [KHÔNG NGHE ĐƯỢC]..

22496
21:29:30,982 --> 21:29:33,631
DAVID: Tại sao tên bằng\nsport lại giải quyết được vấn đề?

22497
21:29:33,631 --> 21:29:35,872
Chà, trước tiên hãy quay lại HTML.

22498
21:29:35,872 --> 21:29:43,172
Trước đây, thực tế là\n

22499
21:29:44,601 --> 21:29:47,932
Nhưng tên, hoặc nhiều hơn\nnói chung là các cặp giá trị khóa

22500
21:29:47,932 --> 21:29:51,211
là cách thông tin được gửi\ntừ một biểu mẫu đến máy chủ.

22501
21:29:51,211 --> 21:29:56,422
Vì vậy nếu không có tên thì không có chìa khóa\n

22502
21:29:56,422 --> 21:30:00,082
Sẽ giống như không có gì sánh được với điều tối thượng\n

22503
21:30:00,081 --> 21:30:02,432
Trình duyệt sẽ không gửi nó.

22504
21:30:02,432 --> 21:30:08,331
Tuy nhiên, trong app.py, tôi đã ngây thơ\n

22505
21:30:08,331 --> 21:30:11,061
sẽ có một cái tên được gọi là\nquote unquote "sport.

22506
21:30:11,062 --> 21:30:13,702
Nó có thể là bất cứ thứ gì,\nnhưng tôi cho rằng đó là môn thể thao.

22507
21:30:13,702 --> 21:30:15,532
Nhưng tôi chưa bao giờ nói với mẫu đó.

22508
21:30:15,532 --> 21:30:19,022
Và nếu tôi thực sự muốn tìm hiểu sâu hơn,\n

22509
21:30:19,021 --> 21:30:22,012
Hãy để tôi quay lại\ncách đây một lúc.

22510
21:30:22,012 --> 21:30:25,801
Hãy để tôi xóa tên\ncủa menu thả xuống môn thể thao.

22511
21:30:25,801 --> 21:30:30,981
Hãy để tôi chạy lại Flask ở đây\nvà tải lại biểu mẫu

22512
21:30:30,982 --> 21:30:33,411
sau khi nó được phục vụ xong.

22513
21:30:34,581 --> 21:30:39,277
Xem Công cụ dành cho nhà phát triển rồi để tôi\n

22514
21:30:39,277 --> 21:30:41,152
tuần trước chúng tôi đã chơi đùa với\na một chút.

22515
21:30:41,152 --> 21:30:44,334
Và chúng tôi cũng chơi đùa với Curl,\n

22516
21:30:44,334 --> 21:30:46,042
Đây là một cái khác-- đây\nnhững gì tôi sẽ có

22517
21:30:46,042 --> 21:30:49,411
xong nếu tôi vẫn không thấy lỗi\n

22518
21:30:49,411 --> 21:30:53,512
Lẽ ra tôi vẫn gõ tên mình như trước,\n

22519
21:30:53,512 --> 21:30:55,252
Tôi sẽ nhấp vào đăng ký.

22520
21:30:55,251 --> 21:30:59,241
Và bây giờ, tôi\nđã xem xét yêu cầu HTTP.

22521
21:30:59,241 --> 21:31:01,342
Và tôi sẽ bấm vào Đăng ký ở đây.

22522
21:31:01,342 --> 21:31:04,942
Và giống như chúng ta đã làm tuần trước, tôi\n

22523
21:31:04,941 --> 21:31:07,671
Và có rất nhiều thứ\nmà chúng ta thường có thể bỏ qua.

22524
21:31:07,672 --> 21:31:10,792
Nhưng ở đây, hãy để tôi phóng to\n, ở phía dưới cùng

22525
21:31:10,792 --> 21:31:13,131
những gì nhà phát triển\ncông cụ của Chrome đang làm cho tôi

22526
21:31:13,131 --> 21:31:16,141
nó hiển thị cho tôi tất cả dữ liệu\nbiểu mẫu đã được gửi.

22527
21:31:16,142 --> 21:31:18,712
Vậy đây thực sự có thể là manh mối tiết lộ của tôi.

22528
21:31:18,711 --> 21:31:21,982
Tôi chỉ không gửi môn thể thao này\ngay cả khi người đó đã nhập nội dung đó vào.

22529
21:31:21,982 --> 21:31:23,991
Và một cách hợp lý, bởi vì\ntôi đã từng làm điều này trước đây

22530
21:31:23,991 --> 21:31:26,932
điều đó có nghĩa là tôi đã không đặt tên cho thứ đó.

22531
21:31:28,101 --> 21:31:31,372
Giống như những lập trình viên, nhà phát triển web giỏi\n

22532
21:31:32,422 --> 21:31:34,160
Họ không viết mã không có lỗi.

22533
21:31:34,160 --> 21:31:35,452
Đó không phải là điểm để đạt được.

22534
21:31:35,452 --> 21:31:38,542
Mục tiêu cần đạt được là\ntrở thành một bác sĩ chẩn đoán giỏi

22535
21:31:38,542 --> 21:31:40,551
Tôi sẽ nói, trong những trường hợp này.

22536
21:31:46,812 --> 21:31:52,152
KHÁN GIẢ: Nếu bạn muốn\n thì sao

22537
21:31:52,152 --> 21:31:54,444
DAVID: Tôi xin lỗi, to hơn một chút nhé?

22538
21:31:54,444 --> 21:31:57,012
ĐỐI TƯỢNG: Nếu bạn muốn\nchỉnh sửa bằng CSS hoặc bất cứ thứ gì

22539
21:31:57,012 --> 21:32:01,422
trong HTML, khi bạn phải sửa\nmẫu, bạn làm cách nào?

22540
21:32:01,422 --> 21:32:05,532
DAVID: Vậy bạn sẽ chỉnh sửa\nCSS như thế nào nếu bạn có những mẫu này?

22541
21:32:05,532 --> 21:32:07,842
Quá trình đó thực tế chúng ta sẽ sớm thấy được.

22542
21:32:07,842 --> 21:32:09,467
Nó gần như sẽ giống hệt nhau.

22543
21:32:09,467 --> 21:32:12,550
Chỉ để cung cấp cho bạn một đoạn giới thiệu về điều này,\n

22544
21:32:12,550 --> 21:32:15,402
nhưng chúng tôi sẽ cung cấp cho bạn một số phân phối\n

22545
21:32:15,402 --> 21:32:17,862
Bạn hoàn toàn có thể\nlàm điều gì đó như thế này.

22546
21:32:17,861 --> 21:32:22,660
Liên kết href bằng dấu chấm quote\nunquote "kiểu"

22547
21:32:22,660 --> 21:32:27,370
CSS rel bằng biểu định kiểu, đó là một\n

22548
21:32:27,370 --> 21:32:31,422
Sự khác biệt duy nhất ngày nay là sử dụng Flask,\n

22549
21:32:31,422 --> 21:32:34,041
theo quy ước, bạn nên truy cập vào thư mục tĩnh của mình.

22550
21:32:34,040 --> 21:32:36,072
Vì vậy, sự thay đổi bạn sẽ thực hiện trong bố cục của mình

22551
21:32:36,072 --> 21:32:40,001
có thể nói rằng style dot\nCSS nằm trong thư mục tĩnh của bạn.

22552
21:32:40,001 --> 21:32:43,990
Và sau đó, nếu tôi vào\nthư mục FroshIMS của tôi

22553
21:32:43,990 --> 21:32:46,330
Tôi có thể tạo một thư mục tĩnh.

22554
21:32:46,331 --> 21:32:48,822
Tôi có thể CD vào đó,\nmặc định không có gì ở đó cả.

22555
21:32:48,822 --> 21:32:51,762
Nhưng nếu bây giờ tôi mã hóa một\nfile có tên styles.css

22556
21:32:51,762 --> 21:32:54,822
Bây giờ tôi có thể làm một cái gì đó giống như cơ thể này.

22557
21:32:54,822 --> 21:33:05,982
Và ở đây, tôi có thể nói là nền\n

22558
21:33:05,982 --> 21:33:10,211
Hãy để tôi tiếp tục và khởi động lại\nFlask trong thư mục FroshIMS.

22559
21:33:10,211 --> 21:33:12,822
Tôi không hài lòng vì\nTôi đang thực hiện việc này một cách nhanh chóng.

22560
21:33:12,822 --> 21:33:16,161
Quay lại biểu mẫu của tôi và tải lại.

22561
21:33:16,160 --> 21:33:19,751
Thì đấy, bây giờ chúng ta cũng đã kết thúc\nnhững việc của tuần trước rồi.

22562
21:33:19,751 --> 21:33:22,853
Nếu tôi trả lời đúng câu hỏi?

22563
21:33:22,854 --> 21:33:27,202
ĐỐI TƯỢNG: [KHÔNG NGHE ĐƯỢC] thay đổi\không có trang nào và không thay đổi trang kia.

22564
21:33:27,202 --> 21:33:30,202
DAVID: Nếu bạn muốn thay đổi một trang\n

22565
21:33:32,122 --> 21:33:36,952
Trong trường hợp đó, bạn có thể muốn có\n

22566
21:33:38,152 --> 21:33:42,381
Bạn có thể sử dụng các lớp khác nhau trong một\n

22567
21:33:42,381 --> 21:33:43,801
Có nhiều cách khác nhau để làm điều đó.

22568
21:33:43,801 --> 21:33:47,751
Bạn thậm chí có thể có\ntrình giữ chỗ trong bố cục của mình

22569
21:33:47,751 --> 21:33:52,221
cho phép bạn cắm\nURL của một kiểu cụ thể

22570
21:33:52,221 --> 21:33:53,661
trang tính trong các tập tin cá nhân của bạn.

22571
21:33:53,661 --> 21:33:56,432
Nhưng điều đó nhanh chóng bắt đầu trở nên\nphức tạp hơn.

22572
21:33:56,432 --> 21:33:58,172
Vậy tóm lại là bạn hoàn toàn có thể làm được.

22573
21:33:58,172 --> 21:34:01,942
Nhưng thông thường, tôi\nnói rằng hầu hết các trang web đều cố gắng không

22574
21:34:01,941 --> 21:34:03,652
để sử dụng các Bảng kiểu khác nhau trên mỗi trang.

22575
21:34:03,652 --> 21:34:06,322
Họ sử dụng lại các phong cách nhiều nhất có thể.

22576
21:34:06,322 --> 21:34:08,572
Được rồi, hãy để tôi tiếp tục\nvà hoàn nguyên việc này thật nhanh.

22577
21:34:08,572 --> 21:34:11,512
Và hãy bắt đầu thêm một chút chức năng\nở đây.

22578
21:34:11,512 --> 21:34:14,392
Tôi sẽ tiếp tục và chỉ\n

22579
21:34:14,392 --> 21:34:16,162
để chưa làm phức tạp mọi việc.

22580
21:34:16,161 --> 21:34:19,251
Và hãy tiếp tục và chơi thôi\n

22581
21:34:19,851 --> 21:34:23,264
Trong biểu mẫu của tôi ở đây, menu thả xuống\n hoàn toàn ổn.

22582
21:34:24,182 --> 21:34:27,411
Nhưng giả sử thay vào đó tôi muốn\nthay đổi nó thành hộp kiểm.

22583
21:34:27,411 --> 21:34:31,432
Có lẽ tôi muốn học sinh có thể\n

22584
21:34:31,432 --> 21:34:34,822
Chà, có lẽ sẽ hợp lý hơn nếu\ndọn dẹp phần này theo một số cách.

22585
21:34:35,572 --> 21:34:40,762
Trước khi chúng ta chuyển sang hộp kiểm,\n

22586
21:34:40,762 --> 21:34:45,211
Lưu ý rằng tôi đã mã hóa cứng bóng rổ,\n

22587
21:34:45,211 --> 21:34:49,592
Và nếu bạn nhớ lại, trong app.py, tôi cũng\n

22588
21:34:49,592 --> 21:34:52,932
Và bất cứ khi nào bạn nhìn thấy bản sao dán\cũng như nội dung tương đương

22589
21:34:52,932 --> 21:34:54,601
cảm thấy như chúng ta có thể làm tốt hơn.

22590
21:34:54,601 --> 21:34:56,402
Vậy điều gì sẽ xảy ra nếu thay vào đó tôi làm điều này.

22591
21:34:56,402 --> 21:35:00,711
Điều gì sẽ xảy ra nếu thay vào đó tôi tự cho mình\na biến thể thao toàn cầu

22592
21:35:00,711 --> 21:35:03,111
Tôi sẽ viết hoa từ\nchỉ để hàm ý rằng nó

22593
21:35:03,111 --> 21:35:07,161
mặc dù có nghĩa là không đổi\n

22594
21:35:07,161 --> 21:35:09,741
Môn thể thao đầu tiên sẽ là bóng rổ.

22595
21:35:11,721 --> 21:35:15,921
Thứ ba sẽ là chiếc đĩa ném cuối cùng.

22596
21:35:15,922 --> 21:35:19,942
Bây giờ tôi có một\nnơi thuận tiện để lưu trữ tất cả các môn thể thao của mình

22597
21:35:19,941 --> 21:35:22,461
nếu nó thay đổi vào học kỳ tiếp theo\hay năm tới hay gì đó.

22598
21:35:22,461 --> 21:35:24,471
Nhưng hãy để ý xem tôi có thể làm gì.

22599
21:35:24,471 --> 21:35:26,101
Bây giờ tôi có thể làm một cái gì đó như thế này.

22600
21:35:26,101 --> 21:35:30,111
Hãy để tôi chuyển vào mẫu\nindex của tôi một biến

22601
21:35:30,111 --> 21:35:34,461
được gọi là các môn thể thao tương đương với\ncác môn thể thao có thể thay đổi toàn cầu đó.

22602
21:35:34,461 --> 21:35:37,792
Bây giờ hãy để tôi đi vào chỉ mục của mình,\nvà đây thực sự là

22603
21:35:37,792 --> 21:35:41,782
sẽ gợi ý về sức mạnh của\n

22604
21:35:41,782 --> 21:35:45,452
Hãy để tôi tiếp tục và loại bỏ tất cả\n

22605
21:35:45,452 --> 21:35:50,332
và để tôi cho bạn xem một chút\n

22606
21:35:52,851 --> 21:35:54,872
Chúng tôi chưa thấy kết thúc này đối với cú pháp.

22607
21:35:54,872 --> 21:35:57,692
Giống như cú pháp khối kết thúc,\nnhưng nó đơn giản như vậy.

22608
21:35:57,691 --> 21:36:00,951
Vậy là bạn có sự khởi đầu và kết thúc cho\n của mình

22609
21:36:02,392 --> 21:36:08,482
Tùy chọn dấu ngoặc nhọn\nthể thao dấu ngoặc nhọn đóng.

22610
21:36:09,831 --> 21:36:12,981
Hãy để tôi quay lại cửa sổ\nterminal của mình, chạy Flask.

22611
21:36:12,982 --> 21:36:16,161
Và nếu tôi không làm hỏng\n ở đây, hãy để tôi quay lại vấn đề này.

22612
21:36:16,161 --> 21:36:18,801
Màu đỏ sắp biến mất\nvì tôi đã xóa CSS của mình.

22613
21:36:18,801 --> 21:36:21,831
Và bây giờ tôi vẫn có danh sách thả xuống môn thể thao\nvà tất cả các môn thể thao đó

22614
21:36:22,771 --> 21:36:24,351
Bây giờ tôi có thể thực hiện thêm một cải tiến nữa.

22615
21:36:24,351 --> 21:36:27,301
Tôi không cần đề cập đến\ncác môn thể thao tương tự này theo cách thủ công trong app.py.

22616
21:36:27,301 --> 21:36:31,671
Bây giờ tôi chỉ có thể nói nếu môn thể thao mà\nngười dùng nhập vào không

22617
21:36:31,672 --> 21:36:35,070
trong biến toàn cục của tôi, thể thao,\nvà hỏi câu hỏi tương tự.

22618
21:36:35,070 --> 21:36:36,862
Và điều này thực sự\ncó ích vì nếu có

22619
21:36:36,861 --> 21:36:41,001
chẳng hạn, một môn thể thao khác đã được thêm vào, chẳng hạn như bóng đá

22620
21:36:41,001 --> 21:36:43,921
tất cả những gì tôi phải làm là\nthay đổi biến toàn cục của mình.

22621
21:36:43,922 --> 21:36:47,542
Và nếu bây giờ tôi tải lại biểu mẫu\nvà nhìn vào danh sách thả xuống, bùm

22622
21:36:47,542 --> 21:36:49,732
bây giờ tôi có hỗ trợ cho môn thể thao thứ tư.

22623
21:36:49,732 --> 21:36:51,422
Và tôi có thể tiếp tục thêm và thêm vào đó.

22624
21:36:51,422 --> 21:36:55,012
Vì vậy, đây là nơi việc tạo khuôn mẫu bắt đầu\nđể thực sự trở nên mạnh mẽ hơn trong việc đó

22625
21:36:55,012 --> 21:37:00,472
bây giờ, trong mẫu này, tôi đang sử dụng cú pháp vòng lặp for\nJinja, cú pháp này

22626
21:37:00,471 --> 21:37:02,961
gần giống với\nPython ở đây, ngoại trừ bạn

22627
21:37:02,961 --> 21:37:06,262
cần dấu ngoặc nhọn và phần trăm\n

22628
21:37:07,131 --> 21:37:08,811
Nhưng đó là ý tưởng tương tự như trong Python.

22629
21:37:08,812 --> 21:37:13,072
Lặp lại một cái gì đó bằng vòng lặp for\n

22630
21:37:13,072 --> 21:37:14,991
Và điều này giống như mọi\ntrang web ngoài kia.

22631
21:37:15,861 --> 21:37:19,851
Khi bạn truy cập hộp thư đến của mình và bạn\n

22632
21:37:19,851 --> 21:37:22,491
Google chưa mã hóa cứng\nemail của bạn theo cách thủ công.

22633
21:37:22,491 --> 21:37:24,322
Họ đã lấy chúng từ cơ sở dữ liệu.

22634
21:37:24,322 --> 21:37:26,072
Họ có một số loại vòng lặp như thế này

22635
21:37:26,072 --> 21:37:32,057
và chỉ xuất ra hàng của bảng sau\n

22636
21:37:32,057 --> 21:37:34,432
Được rồi, vậy bây giờ, hãy tiếp tục và thay đổi điều này, có lẽ

22637
21:37:34,432 --> 21:37:40,232
ồ, còn những\nhộp kiểm nhỏ hoặc nút radio thì sao.

22638
21:37:40,232 --> 21:37:41,572
Vậy hãy để tôi tiếp tục và làm điều này.

22639
21:37:41,572 --> 21:37:46,432
Thay vì chọn một menu, tôi sẽ\n

22640
21:37:46,432 --> 21:37:52,351
Với mỗi môn thể thao này hãy để tôi đi\n

22641
21:37:52,351 --> 21:37:55,281
nhưng hãy để tôi tiếp tục và\nxuất thẻ đầu vào

22642
21:37:55,282 --> 21:37:59,302
tên của nó là quote\nunquote "sport", loại hình đó

22643
21:37:59,301 --> 21:38:05,001
là hộp kiểm, giá trị của nó là\n

22644
21:38:05,001 --> 21:38:09,403
bỏ trích dẫn rồi sau đó\n

22645
21:38:10,111 --> 21:38:11,911
Vì vậy, bạn nhìn thấy một từ bên cạnh hộp kiểm.

22646
21:38:11,911 --> 21:38:14,161
Và chúng ta sẽ xem xét kết quả\ncủa việc này sau giây lát.

22647
21:38:14,161 --> 21:38:17,721
Vì vậy, nó thực sự đơn giản hơn một chút\n

22648
21:38:17,721 --> 21:38:20,961
bởi vì bây giờ hãy xem điều gì sẽ xảy ra nếu tôi tải lại biểu mẫu của mình.

22649
21:38:20,961 --> 21:38:24,322
Giao diện người dùng khác\nvà nó không đẹp bằng

22650
21:38:24,322 --> 21:38:27,601
nhưng nó sẽ cho phép người dùng ký\n

22651
21:38:28,351 --> 21:38:31,682
Bây giờ tôi có thể nhấp vào bóng rổ\nand bóng đá và bóng đá

22652
21:38:31,682 --> 21:38:34,021
hoặc một số sự kết hợp khác của chúng.

22653
21:38:34,021 --> 21:38:37,801
Nếu tôi xem nguồn của trang, cái này\n

22654
21:38:37,801 --> 21:38:41,981
Tôi không phải gõ bốn\n

22655
21:38:41,982 --> 21:38:45,302
Và những thứ này đều có\ncùng tên, nhưng không sao cả.

22656
21:38:45,301 --> 21:38:48,932
Hóa ra với Flask, nếu nó thấy\n

22657
21:38:48,932 --> 21:38:52,922
nó sẽ trao lại chúng cho bạn với tư cách\n

22658
21:38:52,922 --> 21:38:56,192
Được rồi, nhưng giả sử chúng ta không muốn\n

22659
21:38:57,572 --> 21:39:01,202
Hãy để tôi tiếp tục và thay đổi\nhộp kiểm này thành nút radio, nút này

22660
21:39:01,202 --> 21:39:03,162
một nút radio loại trừ lẫn nhau.

22661
21:39:03,161 --> 21:39:04,891
Vì vậy, bạn chỉ có thể đăng ký một.

22662
21:39:04,892 --> 21:39:09,542
Vì vậy, bây giờ, khi tôi tải lại\ntrang, chúng ta sẽ bắt đầu.

22663
21:39:12,001 --> 21:39:16,771
Và bởi vì tôi đã đưa từng thứ này\n

22664
21:39:16,771 --> 21:39:20,171
sport," đó là điều khiến chúng loại trừ lẫn nhau.

22665
21:39:20,172 --> 21:39:23,492
Trình duyệt biết cả bốn\nnhững thứ này đều là loại hình thể thao

22666
21:39:23,491 --> 21:39:26,732
do đó tôi sẽ chỉ cho phép\nbạn chọn một trong những thứ này.

22667
21:39:26,732 --> 21:39:29,072
Và đó đơn giản là vì\ntất cả chúng đều có cùng tên.

22668
21:39:29,072 --> 21:39:32,491
Một lần nữa, nếu tôi xem nguồn trang, hãy chú ý\n

22669
21:39:32,491 --> 21:39:36,542
tên bằng môn thể thao, tên bằng\n

22670
21:39:36,542 --> 21:39:39,703
mà mỗi người sẽ có.

22671
21:39:39,703 --> 21:39:45,251
Được rồi, bạn có câu hỏi nào\nvề cách tiếp cận này không?

22672
21:39:45,751 --> 21:39:47,751
Được rồi, hãy để tôi tiếp tục và\nmở phiên bản này

22673
21:39:47,751 --> 21:39:51,451
mà tôi đã thực hiện trước đó\n

22674
21:39:51,452 --> 21:39:53,342
Cho đến nay, chúng ta\nchưa đến mức hoàn toàn

22675
21:39:53,342 --> 21:39:56,672
trang web này ở đâu,\n

22676
21:39:56,672 --> 21:39:59,192
giống như trong cơ sở dữ liệu, tất cả những người\nđã đăng ký thể thao.

22677
21:39:59,191 --> 21:40:01,891
Bây giờ, chúng tôi thực sự muốn thông báo với\nstudents rằng bạn đã đăng ký

22678
21:40:01,892 --> 21:40:03,812
hoặc bạn chưa đăng ký,\nnhưng theo nghĩa đen thì chúng tôi

22679
21:40:03,812 --> 21:40:05,892
không làm gì với thông tin này.

22680
21:40:05,892 --> 21:40:08,532
Vậy chúng ta có thể thực hiện điều này như thế nào?

22681
21:40:08,532 --> 21:40:10,502
Được rồi, để tôi tiếp tục\nvà đóng các tab này

22682
21:40:10,501 --> 21:40:15,901
và để tôi đi sâu vào cái mà tôi gọi là phiên bản\n

22683
21:40:15,902 --> 21:40:19,711
Và hãy để tôi đi vào thư mục nguồn\nnine của tôi, FroshIMS3

22684
21:40:19,711 --> 21:40:22,652
và để tôi tiếp tục mở app.py.

22685
21:40:22,652 --> 21:40:24,211
Vì vậy, đây là một phiên bản làm sẵn.

22686
21:40:24,211 --> 21:40:26,141
Trong trường hợp này, tôi đã từ bỏ\nbóng đá.

22687
21:40:26,142 --> 21:40:28,862
Nhưng tôi đã thêm một\nthứ ở trên cùng.

22688
21:40:28,861 --> 21:40:33,871
Trong tiếng Anh,\ncái này thể hiện ở dòng thứ bảy là gì?

22689
21:40:33,872 --> 21:40:35,911
Bạn sẽ mô tả\nthứ đó là gì?

22690
21:40:41,452 --> 21:40:42,172
ĐỐI TƯỢNG: Đó là một cuốn từ điển trống rỗng.

22691
21:40:42,172 --> 21:40:43,372
DAVID: Vâng, nó là một cuốn từ điển trống rỗng, phải không?

22692
21:40:43,372 --> 21:40:45,622
Người đăng ký dường như có\na biến ở bên trái.

22693
21:40:45,622 --> 21:40:47,930
Nó đang được gán một\ntừ điển trống ở bên phải.

22694
21:40:47,929 --> 21:40:49,971
Và một từ điển nữa,\nis chỉ là các cặp giá trị khóa.

22695
21:40:49,971 --> 21:40:53,451
Một lần nữa, đây là nơi chứa các từ điển\n

22696
21:40:53,960 --> 21:40:56,752
Bởi vì điều này sẽ cho phép tôi\n

22697
21:40:56,751 --> 21:40:59,271
cho chiếc đĩa ném cuối cùng, Carter\nđã đăng ký tham gia bóng đá

22698
21:40:59,271 --> 21:41:00,831
Emma đăng ký cái gì khác.

22699
21:41:00,831 --> 21:41:04,311
Bạn có thể liên kết khóa với\ngiá trị, tên với thể thao

22700
21:41:04,312 --> 21:41:07,532
giả sử một mô hình mà bạn chỉ có thể\n

22701
21:41:07,532 --> 21:41:12,802
Và hãy xem\nlogic nào xử lý việc này.

22702
21:41:12,801 --> 21:41:16,281
Ở đây trong lộ trình đăng ký của tôi\n đoạn mã tôi đã tạo trước

22703
21:41:16,282 --> 21:41:18,202
lưu ý rằng tôi đang xác thực\ntên người dùng.

22704
21:41:18,202 --> 21:41:20,392
Hơi khác so với\ntrước nhưng cùng một ý tưởng.

22705
21:41:20,392 --> 21:41:23,482
Tôi đang sử dụng request.form.get\nđể lấy tên người.

22706
21:41:23,482 --> 21:41:26,512
Nếu không có tên thì nếu\nhuman không gõ tên

22707
21:41:26,512 --> 21:41:29,241
Tôi sẽ xuất ra error.html.

22708
21:41:29,241 --> 21:41:33,652
Nhưng hãy lưu ý rằng tôi đã bắt đầu làm\n

22709
21:41:33,652 --> 21:41:37,551
Rõ ràng là tôi đang nói với người dùng,\n

22710
21:41:38,631 --> 21:41:41,182
Có vẻ như tôi đang chuyển\nmẫu lỗi của mình

22711
21:41:41,182 --> 21:41:44,535
thay vì chỉ có failed.html,\na thông báo cụ thể.

22712
21:41:44,535 --> 21:41:45,952
Vậy chúng ta hãy đi xuống cái hang thỏ này.

22713
21:41:45,952 --> 21:41:52,052
Hãy để tôi thực sự đi vào\ntemplates/error.hml, và chắc chắn rồi

22714
21:41:52,051 --> 21:41:55,762
đây là một tập tin mới tôi đã tạo ở đây, đó\n

22715
21:41:55,762 --> 21:41:59,332
một con mèo gắt gỏng là một phần của lỗi\n

22716
21:41:59,331 --> 21:42:04,581
Trong phần thân khối của tôi, tôi có thẻ H1\n

22717
21:42:04,581 --> 21:42:07,131
Sau đó tôi có một đoạn\ntag có thể cắm vào bất cứ thứ gì

22718
21:42:07,131 --> 21:42:10,881
thông báo lỗi là\ncontroller, app.py, đang truyền vào.

22719
21:42:10,881 --> 21:42:14,211
Và sau đó chỉ để cho vui thôi, tôi có một\n

22720
21:42:14,211 --> 21:42:15,751
rằng trên thực tế đã có sai sót.

22721
21:42:18,422 --> 21:42:22,792
Tôi cũng làm tương tự\nrequest.form.get của sport

22722
21:42:22,792 --> 21:42:24,562
và tôi lưu trữ nó trong một\nbiến có tên là sport.

22723
21:42:24,562 --> 21:42:28,351
Nếu không có môn thể thao đó thì đó là\n

22724
21:42:28,351 --> 21:42:30,771
thì tôi sẽ kết xuất\nerror.html hai thứ, nhưng tôi

22725
21:42:30,771 --> 21:42:33,361
sẽ đưa ra một thông điệp khác, thiếu môn thể thao.

22726
21:42:33,361 --> 21:42:38,451
Ngược lại, nếu môn thể thao họ đã nhập\n

22727
21:42:38,452 --> 21:42:41,991
Tôi sẽ kết xuất error.html,\nnhưng phàn nàn theo cách khác

22728
21:42:41,991 --> 21:42:44,781
bằng cách nào đó bạn đã cho tôi một môn thể thao không hợp lệ.

22729
21:42:44,782 --> 21:42:47,032
Như thể một hacker đã xâm nhập vào\nHTML của trang

22730
21:42:47,032 --> 21:42:49,379
đã thay đổi nó để thêm môn thể thao\hiện tại của họ như bóng chuyền.

22731
21:42:49,379 --> 21:42:51,711
Mặc dù nó không được cung cấp nhưng họ vẫn gửi môn bóng chuyền.

22732
21:42:51,711 --> 21:42:55,161
Nhưng không sao cả, tôi thậm chí còn từ chối nó\n

22733
21:42:55,161 --> 21:42:58,671
đã cố gắng gửi nó cho tôi bằng cách\nthay đổi tên miền cục bộ.

22734
21:42:58,672 --> 21:43:00,832
Và thực sự, điều kỳ diệu chỉ là thế này thôi.

22735
21:43:00,831 --> 21:43:03,441
Tôi nhớ rằng\nngười này đã đăng ký

22736
21:43:03,441 --> 21:43:06,621
bằng cách lập chỉ mục vào từ điển\nngười đăng ký

22737
21:43:06,622 --> 21:43:11,631
sử dụng tên mà con người đã nhập làm\n

22738
21:43:12,902 --> 21:43:15,232
Chà, tôi đã thêm một tuyến đường cuối cùng ở đây.

22739
21:43:15,232 --> 21:43:19,672
Tôi có lộ trình /người đăng ký với\n

22740
21:43:19,672 --> 21:43:21,622
một mẫu có tên là registerrants.html.

22741
21:43:21,622 --> 21:43:26,582
Nhưng nó lấy biến\ntoàn cục làm đầu vào giống như trước đây.

22742
21:43:26,581 --> 21:43:32,961
Vậy hãy đi xuống cái hang thỏ này để tôi\n

22743
21:43:34,402 --> 21:43:38,182
Nó trông có vẻ hơi lớn\nnhưng nó mở rộng bố cục.

22744
21:43:39,381 --> 21:43:42,322
Tôi có một thẻ H1 có dòng chữ\nngười đăng ký, to và đậm.

22745
21:43:42,322 --> 21:43:44,691
Sau đó, tôi có một cái bàn\nmà chúng ta đã thấy tuần trước.

22746
21:43:44,691 --> 21:43:48,561
Cái này có đầu bảng chỉ\nnói tên môn thể thao cho hai cột.

22747
21:43:48,562 --> 21:43:53,961
Sau đó, nó có phần thân bảng ở trong,\n

22748
21:43:53,961 --> 21:43:57,172
Tôi đang nói, với mỗi tên\nin biến người đăng ký

22749
21:43:57,172 --> 21:44:01,162
xuất ra một hàng của bảng, thẻ bắt đầu,\nand thẻ kết thúc, bên trong đó

22750
21:44:01,161 --> 21:44:04,341
hai dữ liệu bảng, hai\nô, dữ liệu bảng cho tên

22751
21:44:04,342 --> 21:44:08,552
dữ liệu bảng cho tên khung người đăng ký.

22752
21:44:08,551 --> 21:44:10,971
Vì vậy, nó rất giống với cú pháp Python.

22753
21:44:10,971 --> 21:44:14,861
Về cơ bản nó là cú pháp Python, mặc dù\n

22754
21:44:15,361 --> 21:44:17,511
Vậy hiệu quả ròng ở đây là gì?

22755
21:44:17,512 --> 21:44:20,812
Để tôi mở cửa sổ terminal\n, chạy Flask run.

22756
21:44:20,812 --> 21:44:24,872
Bây giờ hãy để tôi đi vào\nbiểu mẫu mà tôi đã tạo sẵn ở đây.

22757
21:44:26,032 --> 21:44:27,952
Hãy để tôi tiếp tục và gõ David.

22758
21:44:27,952 --> 21:44:30,322
Để tôi chọn, ồ, không thể thao.

22759
21:44:33,232 --> 21:44:34,881
Và có con mèo gắt gỏng.

22760
21:44:34,881 --> 21:44:37,881
Tuy nhiên, môn thể thao bị thiếu\nđặc biệt đã được xuất ra.

22761
21:44:38,672 --> 21:44:41,422
Hãy để tôi tiếp tục và không nói tên.

22762
21:44:44,751 --> 21:44:47,241
Được rồi, bây giờ hãy để tôi\nác ý làm điều này.

22763
21:44:49,581 --> 21:44:53,691
Chắc chắn là tôi sẽ gõ tên mình, nhưng hãy để\n

22764
21:44:53,691 --> 21:44:57,891
Hãy để tôi ác tâm đi xuống cuối cùng\n

22765
21:44:59,542 --> 21:45:04,342
Hãy thay đổi điều đó và đổi\nđiều này thành bóng chuyền.

22766
21:45:05,122 --> 21:45:08,991
Vì vậy, bây giờ tôi có thể đăng ký\nbất kỳ môn thể thao nào tôi muốn tạo.

22767
21:45:08,991 --> 21:45:11,961
Hãy để tôi nhấp vào đăng ký,\nnhưng các môn thể thao không hợp lệ.

22768
21:45:11,961 --> 21:45:14,182
Một lần nữa, điều đó nói lên sức mạnh và sự cần thiết

22769
21:45:14,182 --> 21:45:17,361
để kiểm tra mọi thứ trên phần phụ trợ\nvà không tin tưởng người dùng.

22770
21:45:17,361 --> 21:45:21,591
Hack các trang web thật dễ dàng\n

22771
21:45:22,292 --> 21:45:24,292
Được rồi, cuối cùng, hãy\nlàm điều này thật sự.

22772
21:45:24,292 --> 21:45:26,292
David sẽ đăng ký\nđĩa ném đĩa đỉnh cao.

22773
21:45:27,292 --> 21:45:30,562
Và bây giờ, đầu ra không đẹp\ncho lắm, nhưng hãy chú ý

22774
21:45:30,562 --> 21:45:32,552
Tôi đang ở tuyến đường đăng ký.

22775
21:45:32,551 --> 21:45:34,641
Và nếu tôi thu nhỏ, tôi có một bảng HTML.

22776
21:45:34,642 --> 21:45:38,132
Hai cột, tên và môn thể thao,\nDavid và đĩa ném cuối cùng.

22777
21:45:38,131 --> 21:45:41,881
Hãy để tôi quay lại biểu mẫu, để tôi\n

22778
21:45:41,881 --> 21:45:43,322
và đăng ký chơi bóng rổ.

22779
21:45:44,221 --> 21:45:49,111
Bây giờ chúng ta thấy hai hàng trong bảng này,\n

22780
21:45:49,622 --> 21:45:51,414
Và nếu chúng ta làm điều này\nthêm một lần nữa, có thể Emma

22781
21:45:51,414 --> 21:45:53,762
đến và đăng ký\nđăng ký bóng đá.

22782
21:45:53,762 --> 21:45:58,667
Tất cả thông tin này hiện đang được\nlưu trữ trong từ điển này.

22783
21:45:58,667 --> 21:45:59,792
Được rồi, thế thì tuyệt vời.

22784
21:45:59,792 --> 21:46:03,991
Bây giờ chúng ta có cơ sở dữ liệu, mặc dù ở\n

22785
21:46:03,991 --> 21:46:09,039
Nhưng tại sao đây có thể không phải là cách triển khai tốt nhất?

22786
21:46:10,716 --> 21:46:13,619
ĐỐI TƯỢNG: Bạn đang lưu trữ [KHÔNG NGHE ĐƯỢC].

22787
21:46:18,851 --> 21:46:21,476
Vì vậy chúng tôi chỉ lưu trữ\ntừ điển này trong bộ nhớ của máy tính

22788
21:46:21,476 --> 21:46:24,732
và điều đó thật tuyệt cho đến khi tôi nhấn\nControl C và giết Flask

22789
21:46:26,172 --> 21:46:29,412
Hoặc máy chủ khởi động lại, hoặc có thể\ntôi đóng máy tính xách tay của mình hay bất cứ thứ gì.

22790
21:46:29,411 --> 21:46:32,711
Nếu máy chủ ngừng chạy,\nbộ nhớ sẽ bị mất.

22791
21:46:34,182 --> 21:46:37,312
Nó sẽ bị vứt đi khi bạn mất\nnguồn hoặc dừng chương trình.

22792
21:46:37,312 --> 21:46:39,101
Vì vậy có lẽ đây không phải là cách tiếp cận tốt nhất.

22793
21:46:39,101 --> 21:46:41,361
Có lẽ sẽ tốt hơn\nnếu sử dụng tệp CSV.

22794
21:46:41,361 --> 21:46:43,991
Và trên thực tế, khoảng 20 năm trước,\nđó chính xác là những gì tôi đã làm.

22795
21:46:43,991 --> 21:46:45,891
Tôi đã lưu trữ mọi thứ trong tệp CSV.

22796
21:46:45,892 --> 21:46:48,402
Nhưng hãy bỏ qua bước đó,\nvì chúng ta đã thấy tuần trước

22797
21:46:48,402 --> 21:46:51,551
hoặc một vài tuần trước\nbây giờ, cách chúng ta có thể sử dụng SQLite.

22798
21:46:51,551 --> 21:46:54,131
Hãy xem liệu chúng ta có thể\nkết hôn với một số SQL ở đây không

22799
21:46:54,131 --> 21:46:58,131
để lưu trữ một\ncơ sở dữ liệu thực tế cho chương trình.

22800
21:46:58,131 --> 21:47:00,072
Hãy để tôi quay lại đây và\nđể tôi mở lòng, nói

22801
21:47:00,072 --> 21:47:03,611
phiên bản bốn của phiên bản này,\ngần như giống nhau nhưng nó

22802
21:47:03,611 --> 21:47:05,291
thêm một chút chức năng.

22803
21:47:05,292 --> 21:47:10,542
Hãy để tôi đóng các tab này và để tôi\n

22804
21:47:10,542 --> 21:47:13,752
Vì vậy, hãy lưu ý rằng nó gần như\ngiống nhau, nhưng ở trên cùng

22805
21:47:13,751 --> 21:47:18,251
Tôi đang tạo kết nối cơ sở dữ liệu\n

22806
21:47:18,251 --> 21:47:20,044
Vậy đó là cơ sở dữ liệu\ntôi đã tạo trước.

22807
21:47:20,044 --> 21:47:21,461
Vậy chúng ta hãy đi xuống cái hang thỏ đó.

22808
21:47:22,482 --> 21:47:24,622
Hãy để tôi làm cho cửa sổ terminal của tôi lớn hơn.

22809
21:47:24,622 --> 21:47:28,362
Hãy để tôi chạy SQLite 3 của FroshIMS.db.

22810
21:47:30,342 --> 21:47:33,432
và hãy suy ra\ntôi đã thiết kế cái này để làm gì.

22811
21:47:33,432 --> 21:47:37,721
Tôi có một bảng tên là người đăng ký,\n

22812
21:47:37,721 --> 21:47:42,101
Cột ID là số nguyên, tên\n

22813
21:47:42,101 --> 21:47:44,711
và một cột thể thao cũng là văn bản, không được để trống

22814
21:47:44,711 --> 21:47:46,361
và khóa chính chỉ là ID.

22815
21:47:46,361 --> 21:47:49,391
Để tôi có một\nID duy nhất cho mỗi lần đăng ký.

22816
21:47:49,392 --> 21:47:51,912
Hãy xem có\nai ở đó chưa.

22817
21:47:51,911 --> 21:47:55,604
Chọn ngôi sao từ người đăng ký.

22818
21:47:55,604 --> 21:47:56,771
Được rồi, không có ai ở đó cả.

22819
21:47:56,771 --> 21:47:58,361
Chưa có ai đăng ký tham gia thể thao.

22820
21:47:58,361 --> 21:48:00,941
Vì vậy, hãy quay lại\ncode và tiếp tục.

22821
21:48:00,941 --> 21:48:03,792
Trong mã của tôi bây giờ, tôi có\ncùng một biến toàn cục

22822
21:48:03,792 --> 21:48:07,032
để xác thực và\ntạo HTML của tôi.

22823
21:48:07,032 --> 21:48:09,522
Có vẻ như lộ trình chỉ mục của tôi giống nhau.

22824
21:48:09,521 --> 21:48:13,241
Nó đang tự động tạo\nmenu thể thao.

22825
21:48:13,241 --> 21:48:14,899
Thật thú vị, chúng ta sẽ quay lại vấn đề này.

22826
21:48:14,899 --> 21:48:17,232
Có một lộ trình hủy đăng ký\nsẽ cho phép ai đó

22827
21:48:17,232 --> 21:48:22,092
tự hủy đăng ký nếu\nhọ muốn thoát khỏi môn thể thao này

22828
21:48:24,702 --> 21:48:27,342
Đây là lộ trình đăng ký mới và\nđược cải thiện của tôi.

22829
21:48:27,342 --> 21:48:30,702
Vẫn hoạt động trên POST, nên\ncó một chút riêng tư ở đó.

22830
21:48:30,702 --> 21:48:33,532
Tôi đang xác thực việc gửi\n như sau.

22831
21:48:33,532 --> 21:48:36,942
Tôi nhận được tên\nngười dùng đã nhập, môn thể thao mà người dùng đã nhập

22832
21:48:36,941 --> 21:48:41,141
và nếu đó không phải là tên hoặc\nmôn thể thao đó không có trong thể thao

22833
21:48:41,142 --> 21:48:42,959
Tôi sẽ kết xuất failed.html.

22834
21:48:43,792 --> 21:48:45,142
Không có con mèo trong phiên bản này.

22835
21:48:46,542 --> 21:48:50,262
Nếu không, hãy nhớ lại cách chúng ta\nkết hợp SQL và Python trước đây.

22836
21:48:50,262 --> 21:48:53,562
Chúng tôi đang sử dụng thư viện SQL\n của CS50, nhưng đó chỉ là

22837
21:48:53,562 --> 21:48:56,892
làm cho việc thực thi dễ dàng hơn một chút\n

22838
21:48:56,892 --> 21:49:00,522
Chèn vào người đăng ký\ntên môn thể thao bằng dấu phẩy.

22839
21:49:00,521 --> 21:49:05,152
Hai giá trị nào, tên và\n

22840
21:49:05,152 --> 21:49:08,021
Và cuối cùng, đây là một\n mới

22841
21:49:08,021 --> 21:49:10,781
rõ ràng bây giờ, Flask\ncũng cung cấp cho bạn quyền truy cập

22842
21:49:10,782 --> 21:49:17,407
tới chức năng chuyển hướng, đó là cách\n

22843
21:49:17,407 --> 21:49:19,782
và tất cả các trang web khác mà chúng ta\nđã chơi tuần trước

22844
21:49:19,782 --> 21:49:23,262
tất cả chúng tôi đều đang thực hiện chuyển hướng\n

22845
21:49:23,262 --> 21:49:26,741
Hàm Flask\nchuyển hướng này xuất phát từ chính tôi

22846
21:49:26,741 --> 21:49:30,221
đã nhập nó ở\nđầu tệp này.

22847
21:49:30,221 --> 21:49:35,141
Nó xử lý HTTP 301 hoặc 302 hoặc 307\n

22848
21:49:37,211 --> 21:49:42,282
Được rồi, vậy là xong việc\nđăng ký qua tuyến đường này.

22849
21:49:42,282 --> 21:49:45,912
Hãy cùng xem lộ trình của\nngười đăng ký là gì.

22850
21:49:45,911 --> 21:49:49,031
Ở đây, chúng tôi có một\n lộ trình mới cho /người đăng ký.

22851
21:49:49,032 --> 21:49:52,042
Và thay vì chỉ lặp lại\nover một từ điển như trước

22852
21:49:52,042 --> 21:49:56,471
chúng tôi đang quay trở lại, hãy cùng\nxem, db.execute của ngôi sao được chọn

22853
21:49:57,312 --> 21:50:00,402
Vì vậy, đó thực sự là chương trình\n

22854
21:50:00,402 --> 21:50:02,411
Thao tác đó trả lại cho tôi\ndanh sách từ điển

22855
21:50:02,411 --> 21:50:05,652
mỗi trong số đó đại diện cho\không có hàng nào trong bảng.

22856
21:50:05,652 --> 21:50:08,831
Sau đó, tôi sẽ kết xuất\nđăng ký và bắt đầu HTML

22857
21:50:08,831 --> 21:50:12,281
chuyển qua theo nghĩa đen\ndanh sách từ điển đó

22858
21:50:12,282 --> 21:50:15,562
giống như việc sử dụng thư viện\ncủa CS50 trước đây.

22859
21:50:15,562 --> 21:50:18,522
Vậy chúng ta hãy đi xem\na những cái này-- hình thức đó.

22860
21:50:18,521 --> 21:50:24,372
Nếu tôi vào các mẫu và\nmở registrants.html

22861
21:50:24,372 --> 21:50:27,372
ồ, được rồi, nó chỉ là một cái bàn như trước thôi.

22862
21:50:27,372 --> 21:50:30,672
Và thực ra, hãy để tôi thay đổi điều này\n về mặt cú pháp để đảm bảo tính nhất quán.

22863
21:50:30,672 --> 21:50:36,312
Chúng tôi có một vòng lặp Jinja for\lặp lại từng người đăng ký

22864
21:50:36,312 --> 21:50:39,672
và với mỗi cái đó\nxuất ra một hàng trong bảng.

22865
21:50:39,672 --> 21:50:40,902
Ồ, nhưng điều này thật thú vị.

22866
21:50:40,902 --> 21:50:44,622
Thay vì chỉ có hai cột\n

22867
21:50:44,622 --> 21:50:47,654
lưu ý rằng tôi cũng\không đưa ra một biểu mẫu đầy đủ.

22868
21:50:47,653 --> 21:50:49,361
Được rồi, chuyện này\nbắt đầu hấp dẫn rồi.

22869
21:50:49,361 --> 21:50:52,661
Vì vậy, hãy quay lại\ncửa sổ terminal của tôi

22870
21:50:52,661 --> 21:50:56,531
chạy Flask và thực sự xem\nví dụ này trông như thế nào bây giờ.

22871
21:50:58,812 --> 21:51:00,592
Trong trang chủ, nó\ntrông giống hệt như vậy.

22872
21:51:00,592 --> 21:51:02,175
Nhưng bây giờ hãy để tôi đăng ký một cái gì đó.

22873
21:51:02,175 --> 21:51:04,792
David cho chiếc đĩa ném cuối cùng, hãy đăng ký.

22874
21:51:08,831 --> 21:51:12,561
David đăng ký\đĩa bay cuối cùng, đăng ký.

22875
21:51:13,062 --> 21:51:15,132
Thật tốt là tôi đã hủy đăng ký.

22876
21:51:15,131 --> 21:51:16,932
Vì vậy, bây giờ nó sẽ trông như thế này.

22877
21:51:16,932 --> 21:51:22,119
Tôi có một trang ở tuyến đường có tên\n

22878
21:51:22,119 --> 21:51:24,161
cột, tên và môn thể thao,\nDavid, chiếc đĩa ném tuyệt đỉnh.

22879
21:51:24,161 --> 21:51:25,521
Nhưng chờ đã, cột thứ ba.

22880
21:51:26,021 --> 21:51:30,461
Bởi vì nếu tôi xem nguồn trang,\n

22881
21:51:30,461 --> 21:51:34,572
Đối với mỗi hàng trong bảng này, tôi cũng\n

22882
21:51:36,532 --> 21:51:40,092
Nhưng trước khi chúng ta biết nó hoạt động như thế nào,\n

22883
21:51:40,682 --> 21:51:42,282
Vậy Carter sẽ cho bạn chơi bóng rổ.

22884
21:51:44,961 --> 21:51:48,072
Bây giờ hãy để tôi quay lại và cùng\nđăng ký cho Emma môn bóng đá nhé.

22885
21:51:50,051 --> 21:51:55,481
Trước khi chúng ta xem xét HTML đó, hãy\n

22886
21:51:55,482 --> 21:51:59,741
Hãy đi vào SQLite FroshIMS.

22887
21:51:59,741 --> 21:52:10,152
Hãy để tôi vào FroshIMS và để tôi\n

22888
21:52:10,152 --> 21:52:12,461
Và bây giờ hãy chọn ngôi sao từ những người đăng ký.

22889
21:52:12,461 --> 21:52:16,391
Và trong khi đó, trước đây, khi tôi thực thi\n

22890
21:52:17,471 --> 21:52:21,111
Vì vậy bây giờ chúng ta thấy chính xác những gì đang diễn ra bên dưới mui xe.

22891
21:52:21,111 --> 21:52:24,461
Vì vậy bây giờ chúng ta hãy xem\nbiểu mẫu này-- trang này ngay bây giờ.

22892
21:52:24,461 --> 21:52:29,141
Nếu tôi muốn hủy đăng ký, hãy hủy đăng ký\n

22893
21:52:30,941 --> 21:52:33,042
Việc nhấp vào một trong những\nnút đó thực sự sẽ

22894
21:52:33,042 --> 21:52:36,021
xóa hàng khỏi cơ sở dữ liệu.

22895
21:52:36,021 --> 21:52:41,411
Nhưng làm thế nào để chúng ta liên kết một trang web\n

22896
21:52:41,411 --> 21:52:43,451
Đây là mảnh ghép cuối cùng của câu đố.

22897
21:52:43,452 --> 21:52:47,232
Cho đến nay, mọi thứ đều\ncó biểu mẫu và cả URL.

22898
21:52:47,232 --> 21:52:49,362
Nhưng điều gì sẽ xảy ra nếu người dùng\nkhông gõ bất cứ thứ gì vào

22899
21:52:49,361 --> 21:52:51,551
họ chỉ đang nhấp vào một nút?

22900
21:52:53,422 --> 21:52:55,897
Hãy để tôi đi trước và\nđánh hơi tình hình giao thông,

22901
21:52:55,896 --> 21:52:57,521
bạn có thể có thói quen làm bây giờ.

22902
21:52:57,521 --> 21:53:01,331
Bất cứ lúc nào bạn tò mò về cách một trang web\n

22903
21:53:01,331 --> 21:53:05,771
Và Carter, chúng tôi hủy đăng ký môn bóng rổ của bạn nhé?

22904
21:53:05,771 --> 21:53:09,311
Hãy hủy đăng ký Carter và\nxem chuyện gì vừa xảy ra.

22905
21:53:09,312 --> 21:53:13,392
Nếu tôi xem yêu cầu hủy đăng ký\n, hãy lưu ý rằng đó là POST.

22906
21:53:13,392 --> 21:53:16,212
Mã trạng thái\cuối cùng trở lại là 302

22907
21:53:16,211 --> 21:53:18,641
nhưng hãy nhìn vào chính yêu cầu đó.

22908
21:53:18,642 --> 21:53:21,372
Tất cả các tiêu đề ở đó chúng tôi sẽ bỏ qua.

22909
21:53:21,372 --> 21:53:25,872
Điều duy nhất mà\nnút gửi đi, một cách khéo léo

22910
21:53:25,872 --> 21:53:29,892
là một tham số ID, một khóa bằng hai.

22911
21:53:29,892 --> 21:53:34,152
Hai cái có lẽ\nđại diện hoặc ánh xạ tới cái gì?

22912
21:53:34,152 --> 21:53:37,062
Hai thứ này từ đâu tới?

22913
21:53:37,062 --> 21:53:40,782
Nó không nói Carter, nó không nói bóng rổ?

22914
21:53:41,330 --> 21:53:43,122
ĐỐI TƯỢNG: Người thứ hai đã đăng ký.

22915
21:53:43,122 --> 21:53:44,532
DAVID: Người\nthứ hai đã đăng ký.

22916
21:53:44,532 --> 21:53:47,682
Vậy những khóa chính mà chúng ta đã bắt đầu\n

22917
21:53:47,682 --> 21:53:50,982
trước đây, tại sao việc có thể\n lại hữu ích

22918
21:53:50,982 --> 21:53:53,232
đây chỉ là một trong những lý do tại sao.

22919
21:53:53,232 --> 21:53:58,271
Nếu tôi chỉ cần\nsgửi số ID của người đó là đủ

22920
21:53:58,271 --> 21:54:03,141
Tôi muốn xóa khỏi cơ sở dữ liệu,\n

22921
21:54:03,142 --> 21:54:09,322
Nếu tôi truy cập app.py và nhìn vào\n của tôi

22922
21:54:11,172 --> 21:54:15,642
Đầu tiên tôi vào biểu mẫu và tôi nhận được\n

22923
21:54:15,642 --> 21:54:19,872
Trên thực tế, nếu có ID và\nbiểu mẫu không trống

22924
21:54:19,872 --> 21:54:21,642
Tôi thực thi dòng mã này.

22925
21:54:21,642 --> 21:54:24,642
Xóa khỏi những người đăng ký có\nID bằng dấu chấm hỏi

22926
21:54:24,642 --> 21:54:29,202
rồi tôi cắm số đó vào,\nxóa Carter và chỉ Carter.

22927
21:54:29,202 --> 21:54:32,472
Và tôi không sử dụng tên anh ấy, bởi vì\n

22928
21:54:32,471 --> 21:54:34,001
hai người tên là Emma hay David?

22929
21:54:34,001 --> 21:54:35,601
Bạn không muốn xóa cả hai.

22930
21:54:35,601 --> 21:54:39,732
Đó là lý do tại sao những\nID duy nhất này lại rất quan trọng.

22931
21:54:39,732 --> 21:54:41,622
Và đây là một lý do khác tại sao.

22932
21:54:41,622 --> 21:54:45,012
Bạn không muốn lưu trữ\nmột số thứ trong URL.

22933
21:54:45,012 --> 21:54:49,752
Giả sử chúng ta truy cập\nURL này, hủy đăng ký?ID=3.

22934
21:54:53,262 --> 21:54:58,131
Giả sử tôi cố tình gửi URL này cho Emma.

22935
21:54:58,131 --> 21:55:00,131
Điều đó không quan trọng lắm\nsự khởi đầu là gì

22936
21:55:00,131 --> 21:55:06,251
nhưng tôi cho rằng tôi đã gửi URL này cho cô ấy qua email,\n

22937
21:55:07,691 --> 21:55:10,331
Và nó sử dụng GET thay vì POST.

22938
21:55:10,331 --> 21:55:12,326
Tôi vừa lừa cô ấy làm gì thế?

22939
21:55:15,369 --> 21:55:17,161
Điều gì sẽ xảy ra\nnếu Emma nhấp vào đây?

22940
21:55:19,021 --> 21:55:21,521
DAVID: Anh sẽ lừa cô ấy để hủy đăng ký chính mình.

22941
21:55:22,021 --> 21:55:24,811
Bởi vì nếu cô ấy đã đăng nhập\nvào trang web FroshIMS này

22942
21:55:24,812 --> 21:55:28,862
và URL chứa ID của cô ấy chỉ\nvì tôi có ác ý

22943
21:55:28,861 --> 21:55:31,921
và cô ấy nhấp vào nó và\ntrang web đang sử dụng GET

22944
21:55:31,922 --> 21:55:34,711
Thật không may, GET URLs\nare, một lần nữa, có trạng thái.

22945
21:55:34,711 --> 21:55:36,782
Họ có thông tin trạng thái trong các URL.

22946
21:55:36,782 --> 21:55:39,532
Và trong trường hợp này, chỉ cần\nxóa người dùng và bùng nổ là đủ

22947
21:55:39,532 --> 21:55:42,144
cô ấy có thể đã vô tình\nhủy đăng ký chính mình.

22948
21:55:42,144 --> 21:55:43,351
Và điều này khá vô hại.

22949
21:55:43,351 --> 21:55:45,872
Giả sử đây\nh là tài khoản ngân hàng của cô ấy đang cố gắng

22950
21:55:45,872 --> 21:55:47,672
để thực hiện rút tiền hoặc gửi tiền.

22951
21:55:47,672 --> 21:55:50,822
Giả sử đây là một trang web nào đó, một URL Facebook

22952
21:55:50,822 --> 21:55:53,339
cố gắng lừa cô ấy\nđăng nội dung nào đó một cách tự động.

22953
21:55:53,339 --> 21:55:55,172
Đây cũng là một\nsự cân nhắc khác khi bạn

22954
21:55:55,172 --> 21:55:59,402
nên sử dụng POST thay vì GET,\nvì yêu cầu GET có thể

22955
21:55:59,402 --> 21:56:04,331
được cắm vào các email được gửi qua Slack\n

22956
21:56:04,331 --> 21:56:06,601
Và trừ khi có\n lời nhắc nhở, bạn có chắc chắn không

22957
21:56:06,601 --> 21:56:09,751
bạn muốn hủy đăng ký\nchính mình, bạn có thể mù quáng

22958
21:56:09,751 --> 21:56:11,851
lừa người dùng khiến\nkhông thể bị tổn thương bởi những gì

22959
21:56:11,851 --> 21:56:14,221
được gọi là giả mạo yêu cầu giữa các trang web.

22960
21:56:14,221 --> 21:56:17,401
Một cách nói hoa mỹ rằng bạn\nlừa họ nhấp vào một liên kết

22961
21:56:17,402 --> 21:56:21,241
mà lẽ ra họ không nên có, bởi vì\n

22962
21:56:21,241 --> 21:56:25,111
Được rồi, có câu hỏi nào\\không phải những khối xây dựng này không?

22963
21:56:26,929 --> 21:56:32,275
ĐỐI TƯỢNG: Việc đầu tiên\nlàm trong phiên bản SQL là gì

22964
21:56:32,275 --> 21:56:34,232
[KHÔNG NGHE ĐƯỢC] họ có ba dấu gạch chéo ở đâu?

22965
21:56:35,501 --> 21:56:37,456
DAVID: Ý anh là khi có ba cột?

22966
21:56:37,456 --> 21:56:42,311
ĐỐI TƯỢNG: Không, ba dấu gạch chéo về phía trước.

22967
21:56:42,312 --> 21:56:44,882
DAVID: Ba dấu gạch chéo về phía trước.

22968
21:56:46,407 --> 21:56:49,377
KHÁN GIẢ: Vâng, vậy nên tôi\nnghĩ nó ở chế độ [KHÔNG NGHE ĐƯỢC]..

22969
21:56:52,851 --> 21:56:56,031
DAVID: Xin lỗi, nó ở đâu?

22970
21:56:57,235 --> 21:57:02,065
ĐỐI TƯỢNG: Nó ở trong [KHÔNG NGHE ĐƯỢC] cuộn lên.

22971
21:57:06,304 --> 21:57:07,721
DAVID: Xin lỗi, hướng khác à?

22972
21:57:12,846 --> 21:57:16,407
Vì vậy xin vui lòng cuộn thêm một chút.

22973
21:57:16,407 --> 21:57:17,532
DAVID: Tiếp tục cuộn thêm à?

22974
21:57:20,081 --> 21:57:27,761
Đây là một URI, cú pháp điển hình\n

22975
21:57:27,762 --> 21:57:32,351
giao thức, có thể nói như vậy, có nghĩa là\n

22976
21:57:32,351 --> 21:57:35,322
:// giống như bạn và tôi thấy trong URL.

22977
21:57:35,322 --> 21:57:37,961
Về cơ bản, dấu gạch chéo thứ ba\ncó nghĩa là thư mục hiện tại.

22978
21:57:38,622 --> 21:57:41,461
Vì vậy, đó là một sự tò mò kỳ lạ,\nnhưng đó là điều điển hình

22979
21:57:41,461 --> 21:57:43,961
bất cứ khi nào bạn đề cập đến một\ntệp cục bộ chứ không phải tệp đó

22980
21:57:45,251 --> 21:57:48,311
Đó là một sự đơn giản hóa quá mức,\n

22981
21:57:48,312 --> 21:57:50,472
Xin lỗi vì đã không nhấp vào sớm hơn.

22982
21:57:50,471 --> 21:57:53,292
Được rồi, hãy lặp lại FroshIMS một lần nữa

22983
21:57:53,292 --> 21:57:56,622
ở đây chỉ để cho thấy tôi là ai\n

22984
21:57:56,622 --> 21:57:59,562
như tôi nhớ lại, không chỉ lưu trữ những thứ này trong tệp CSV.

22985
21:57:59,562 --> 21:58:02,047
Tôi cũng đã tự động\tạo email

22986
21:58:02,047 --> 21:58:04,422
gửi giám thị phụ trách\nchương trình thể thao nội bộ

22987
21:58:04,422 --> 21:58:07,512
để họ có thể có một\n

22988
21:58:07,512 --> 21:58:09,652
và họ cũng có thể dễ dàng\ntrả lời chúng.

22989
21:58:09,652 --> 21:58:13,282
Hãy để tôi chuyển sang phiên bản FroshIMS\nnăm mà tôi đã tạo trước ở đây

22990
21:58:13,282 --> 21:58:18,642
và để tôi tiếp tục và mở\nup, chẳng hạn như app.py lần này.

22991
21:58:18,642 --> 21:58:21,132
Và đây là một số mã\nmà tôi đã viết trước.

22992
21:58:21,131 --> 21:58:24,921
Và lúc đầu trông có vẻ hơi đáng sợ\n

22993
21:58:24,922 --> 21:58:30,312
Bây giờ tôi đã thêm thư viện Flask\nmail vào ảnh

22994
21:58:30,312 --> 21:58:33,461
bằng cách thêm thư Flask vào\nrequirements.txt và chạy lệnh

22995
21:58:33,461 --> 21:58:37,101
để tự động cài đặt email\nhỗ trợ cho Flask.

22996
21:58:37,101 --> 21:58:39,851
Và điều này hơi khó hiểu một chút, nhưng thực ra nó chủ yếu là

22997
21:58:39,851 --> 21:58:41,622
sao chép dán từ tài liệu.

22998
21:58:41,622 --> 21:58:44,351
Việc tôi đang làm ở đây là\nTôi đang định cấu hình Bình của mình

22999
21:58:44,351 --> 21:58:47,721
ứng dụng có một vài cấu hình\nbiến, nếu bạn muốn.

23000
21:58:47,721 --> 21:58:51,221
Đây là cú pháp cho điều đó.\n

23001
21:58:51,221 --> 21:58:55,601
đi kèm với Flask được tự động\n

23002
21:58:55,601 --> 21:58:58,961
ở dòng thứ chín, và tôi chỉ cần điền\n

23003
21:58:58,961 --> 21:59:01,482
các giá trị cho địa chỉ\nsender mặc định mà tôi

23004
21:59:01,482 --> 21:59:05,472
muốn gửi email theo mặc định\n

23005
21:59:05,471 --> 21:59:08,651
số cổng, cổng TCP\nmà chúng ta đã nói đến tuần trước.

23006
21:59:08,652 --> 21:59:12,491
Máy chủ thư, tôi sẽ sử dụng máy chủ smtp.gmail.com của\nGmail.

23007
21:59:12,491 --> 21:59:14,531
Sử dụng TLS, điều này có nghĩa là sử dụng mã hóa.

23008
21:59:15,672 --> 21:59:18,562
Tên người dùng thư, việc này sẽ\nlấy nó từ môi trường của tôi.

23009
21:59:18,562 --> 21:59:21,972
Vì vậy vì mục đích bảo mật, tôi đã không\n

23010
21:59:21,971 --> 21:59:24,023
và mật khẩu vào mã.

23011
21:59:24,024 --> 21:59:26,982
Vì vậy, thực ra tôi đang lưu trữ chúng trong cái gì\n

23012
21:59:26,982 --> 21:59:29,112
Bạn sẽ thấy nhiều hơn về\nin bộ bài tập chín này

23013
21:59:29,111 --> 21:59:31,121
và đó là một\nquy ước rất phổ biến trên máy chủ

23014
21:59:31,122 --> 21:59:36,771
trong thế giới thực để lưu trữ thông tin nhạy cảm\n

23015
21:59:36,771 --> 21:59:39,641
để có thể truy cập được\nkhi trang web của bạn đang chạy

23016
21:59:39,642 --> 21:59:41,202
nhưng không có trong mã nguồn của bạn.

23017
21:59:41,202 --> 21:59:44,232
Quá dễ dàng nếu\nbạn đặt thông tin xác thực

23018
21:59:44,232 --> 21:59:47,532
nội dung nhạy cảm trong nguồn\ncode của bạn để đăng nó lên GitHub

23019
21:59:47,532 --> 21:59:50,832
hoặc vô tình chụp ảnh màn hình,\n

23020
21:59:50,831 --> 21:59:55,961
Vì vậy, vì mục đích của ngày hôm nay, hãy biết rằng\n

23021
21:59:55,961 --> 21:59:57,581
được gọi là các biến môi trường.

23022
21:59:57,581 --> 22:00:01,091
Và điều này giống như một sự ngoài luồng, a\n

23023
22:00:01,092 --> 22:00:04,122
ghép nối trong bộ nhớ của máy tính\nbằng cách chạy một lệnh nhất định

23024
22:00:04,122 --> 22:00:06,491
nhưng điều đó không bao giờ hiển thị\ntrong mã thực tế của bạn.

23025
22:00:06,491 --> 22:00:09,131
Nếu không thì sẽ có rất nhiều tên người dùng và mật khẩu

23026
22:00:09,131 --> 22:00:11,921
vô tình xuất hiện trên mạng.

23027
22:00:11,922 --> 22:00:14,322
Vì vậy, tôi đã cài đặt cái này trước.

23028
22:00:14,322 --> 22:00:16,152
Hãy để tôi xem liệu tôi có thể làm điều này một cách chính xác.

23029
22:00:16,152 --> 22:00:19,581
Hãy để tôi chuyển sang\ntab khác sau giây lát.

23030
22:00:19,581 --> 22:00:23,441
Và đây, trên màn hình thứ hai của tôi, tôi có hộp thư đến của John Harvard.

23031
22:00:23,441 --> 22:00:26,322
Hiện tại nó trống và tôi\nsẽ tiếp tục đăng ký

23032
22:00:26,322 --> 22:00:28,542
hy vọng là vì một môn thể thao nào đó như John\nHarvard đây.

23033
22:00:28,542 --> 22:00:32,831
Vì vậy, hãy để tôi tiếp tục và chạy\nFlask run trên phiên bản năm này.

23034
22:00:32,831 --> 22:00:36,311
Hãy để tôi tiếp tục và\ntải lại màn hình chính.

23035
22:00:37,001 --> 22:00:38,681
Hãy để tôi tải lại màn hình chính ở đây.

23036
22:00:38,682 --> 22:00:41,411
Lần này rõ ràng là tôi đang hỏi tên và email.

23037
22:00:41,411 --> 22:00:43,497
Vậy tên sẽ là John Harvard.

23038
22:00:45,771 --> 22:00:51,342
Anh ấy sẽ đăng ký, còn bóng đá thì sao.

23039
22:00:52,902 --> 22:00:57,612
Và nếu tôi làm đúng thì không\n

23040
22:00:57,611 --> 22:01:06,701
thấy bạn đã đăng ký, nhưng khi anh ấy\n

23041
22:01:06,702 --> 22:01:13,002
khoanh tay rằng điều này\n

23042
22:01:13,001 --> 22:01:15,086
và tôi hứa là nó đã xảy ra ngay trước giờ học.

23043
22:01:22,851 --> 22:01:25,241
Tôi không nghĩ lần này có sai lầm.

23044
22:01:28,402 --> 22:01:31,822
Hãy để tôi thử thứ gì đó\nở đây thật nhanh

23045
22:01:31,822 --> 22:01:35,661
nhưng tôi không nghĩ cái này bị hỏng.

23046
22:01:35,661 --> 22:01:39,171
Nếu đúng như vậy thì nó sẽ không nói\thành công.

23047
22:01:39,172 --> 22:01:44,992
Tôi vừa thử gửi lại nên tôi\n

23048
22:01:44,991 --> 22:01:47,156
Ôi, lúc này tôi thực sự rất buồn.

23049
22:01:53,682 --> 22:01:57,521
DAVID: Tôi có thể kiểm tra\nspam, nhưng sau đó--

23050
22:01:57,521 --> 22:02:01,991
không chắc chắn chúng tôi muốn hiển thị thư rác ở đây\n

23051
22:02:13,751 --> 22:02:15,521
Wow, đó là một cú nhấp chuột mạo hiểm mà tôi lo lắng.

23052
22:02:15,521 --> 22:02:19,250
Được rồi, vậy là bạn đã đăng ký\n email mà tôi đã gửi

23053
22:02:19,250 --> 22:02:21,292
và nó không có bất kỳ thông tin thực tế nào trong đó.

23054
22:02:21,292 --> 22:02:23,262
Nhưng ngày trước điều đó\nsẽ xảy ra, bởi vì tôi

23055
22:02:23,262 --> 22:02:25,092
bao gồm tên\ncủa sinh viên và ký túc xá của họ

23056
22:02:25,092 --> 22:02:27,634
và tất cả các trường\nthông tin khác mà chúng tôi yêu cầu.

23057
22:02:27,634 --> 22:02:30,312
Vì vậy, chúng ta hãy xem nhanh\ncách mã đó có thể hoạt động.

23058
22:02:30,312 --> 22:02:33,522
Tôi đã phải định cấu hình Gmail\nin theo một cách nhất định để cho phép

23059
22:02:33,521 --> 22:02:36,191
họ gọi là gì, ứng dụng kém an toàn hơn khi sử dụng SMTP

23060
22:02:36,191 --> 22:02:38,591
đó là giao thức\nđược sử dụng cho email gửi đi.

23061
22:02:38,592 --> 22:02:42,960
Nhưng bên cạnh việc thiết lập những thứ này, chúng ta hãy\n

23062
22:02:42,960 --> 22:02:44,502
Nó thực sự khá đơn giản.

23063
22:02:44,501 --> 22:02:47,631
Trong lộ trình đăng ký của mình, tôi đã xác thực\n

23064
22:02:48,861 --> 22:02:52,761
Sau đó tôi đã xác nhận việc đăng ký\nở dưới đây, không có gì mới ở đó cả.

23065
22:02:52,762 --> 22:02:55,482
Tất cả những gì tôi làm là sử dụng hai dòng mã mới.

23066
22:02:55,482 --> 22:02:57,983
Và việc tự động hóa\nviệc gửi email thật dễ dàng.

23067
22:02:57,983 --> 22:02:59,691
Có vẻ như tôi đã làm\nit quá nhiều lần

23068
22:02:59,691 --> 22:03:01,601
đó là lý do tại sao nó lại rơi vào thư rác.

23069
22:03:01,601 --> 22:03:03,581
Tôi đã tạo một biến có tên là message.

23070
22:03:03,581 --> 22:03:06,981
Tôi đã sử dụng chức năng tin nhắn\nChắc hẳn tôi đã nhập từ cấp cao hơn

23071
22:03:08,092 --> 22:03:10,872
Rõ ràng đây là chủ đề\ndòng làm đối số đầu tiên.

23072
22:03:10,872 --> 22:03:15,192
Và đối số thứ hai là người nhận tham số\nname

23073
22:03:15,191 --> 22:03:18,682
trong đó lấy danh sách các email\n

23074
22:03:18,682 --> 22:03:21,042
Vì vậy, trong ngoặc, tôi chỉ\nnhập email của một người dùng

23075
22:03:21,042 --> 22:03:24,081
và sau đó gửi thư. gửi tin nhắn đó.

23076
22:03:24,081 --> 22:03:29,021
Vậy hãy cuộn ngược lên để xem có gì\n

23077
22:03:30,562 --> 22:03:33,792
Đúng, thư là cái này\ntôi có một biến

23078
22:03:33,792 --> 22:03:36,221
vì tôi đã làm theo\ntài liệu về thư viện này.

23079
22:03:36,221 --> 22:03:41,809
Bạn chỉ cần định cấu hình ứng dụng hiện tại của mình\n

23080
22:03:41,809 --> 22:03:43,601
Và nếu bạn nhìn lên đây\nbây giờ, ở dòng thứ bảy

23081
22:03:43,601 --> 22:03:46,751
đây là thư viện mới\ntừ thư Flask tôi đã nhập.

23082
22:03:46,751 --> 22:03:50,951
Thư viết hoa, Thư viết hoa, vậy nên\n

23083
22:03:52,452 --> 22:03:55,302
Vì vậy, một điều đơn giản như vậy cho dù bạn\n

23084
22:03:55,301 --> 22:03:56,831
bạn muốn đặt lại mật khẩu.

23085
22:03:56,831 --> 22:04:00,701
Việc tạo email\thực tế có thể dễ dàng như thế này

23086
22:04:00,702 --> 22:04:03,754
miễn là bạn đã cài đặt phần mềm cần thiết\naccess.

23087
22:04:03,754 --> 22:04:05,961
Và chỉ để làm rõ rằng\ntôi đã thêm thứ gì đó vào đây

23088
22:04:05,961 --> 22:04:09,101
hãy để tôi mở tệp require.txt\n của mình và thực sự, tôi

23089
22:04:09,101 --> 22:04:13,812
chuẩn bị sẵn cả Flask và\nFlask-mail.

23090
22:04:13,812 --> 22:04:16,812
Nhưng tôi đã chạy lệnh trước để thực sự làm điều đó.

23091
22:04:16,812 --> 22:04:22,082
Được rồi, bạn có câu hỏi nào về những ví dụ này ở đây không?

23092
22:04:23,441 --> 22:04:29,572
Vậy những phần khác thực sự có thể là gì\n

23093
22:04:29,572 --> 22:04:32,675
Hóa ra là một thành phần then chốt của hầu hết mọi trang web

23094
22:04:32,675 --> 22:04:34,842
ứng dụng ngày nay mà\nchúng tôi vẫn chưa đề cập tới

23095
22:04:34,842 --> 22:04:38,396
nhưng nó sẽ là một trong những thành tựu cuối cùng của chúng ta\n

23096
22:04:38,396 --> 22:04:41,201
Và một phiên thực sự là một tính năng bắt nguồn từ

23097
22:04:41,202 --> 22:04:43,842
từ tất cả những điều cơ bản mà chúng ta đã nói\nhôm nay và tuần trước

23098
22:04:43,842 --> 22:04:47,351
và phiên là thuật ngữ kỹ thuật cho\n

23099
22:04:47,351 --> 22:04:50,922
Khi bạn truy cập amazon.com và bắt đầu\n

23100
22:04:50,922 --> 22:04:53,605
họ theo dõi bạn từ\ntrang này sang trang khác.

23101
22:04:53,604 --> 22:04:56,021
Rất tiếc nếu bạn đóng trình duyệt của mình\nhãy quay lại vào ngày hôm sau

23102
22:04:56,021 --> 22:04:59,668
chúng thường vẫn là sản phẩm mua sắm của bạn\n

23103
22:04:59,668 --> 22:05:01,001
bởi vì họ muốn doanh nghiệp của bạn.

23104
22:05:01,001 --> 22:05:03,711
Họ không muốn bạn phải\nbắt đầu lại từ đầu vào ngày hôm sau.

23105
22:05:03,711 --> 22:05:07,482
Tương tự, ngày nay khi bạn đăng nhập vào bất kỳ trang web nào

23106
22:05:07,482 --> 22:05:11,292
ngay cả khi đó không phải là thứ thương mại điện tử\n

23107
22:05:11,292 --> 22:05:13,002
bạn và tôi không có thói quen đăng nhập

23108
22:05:13,001 --> 22:05:15,191
vào mọi trang chết tiệt\nchúng ta truy cập trên một trang web.

23109
22:05:15,191 --> 22:05:19,182
Thông thường, bạn đăng nhập một lần và sau đó\n

23110
22:05:19,182 --> 22:05:21,161
bạn vẫn đăng nhập vào trang web đó.

23111
22:05:21,161 --> 22:05:25,301
Vì vậy, bằng cách nào đó, trang web\nđang ghi nhớ rằng bạn đã đăng nhập.

23112
22:05:25,301 --> 22:05:27,889
Và điều đó đang được thực hiện\nbằng cách này được gọi là

23113
22:05:27,889 --> 22:05:29,682
một phiên, và có lẽ\na thuật ngữ quen thuộc hơn

23114
22:05:29,682 --> 22:05:32,789
mà bạn có thể biết và\nlo lắng về nó, được gọi là cookie.

23115
22:05:32,789 --> 22:05:35,122
Hãy tiếp tục và nghỉ ngơi thêm năm phút nữa tại đây.

23116
22:05:35,122 --> 22:05:37,414
Và khi chúng tôi quay lại, chúng tôi sẽ\nxem xét cookie, phiên

23117
22:05:40,952 --> 22:05:43,961
Vì vậy, lời hứa bây giờ là\nchúng ta sẽ triển khai

23118
22:05:43,961 --> 22:05:47,381
khái niệm này về một phiên đang diễn ra\n

23119
22:05:47,381 --> 22:05:50,262
họ đã đăng nhập và thậm chí còn triển khai\nnhững thứ như giỏ hàng.

23120
22:05:50,262 --> 22:05:54,642
Và mục tiêu bao quát ở đây\nis là xây dựng một ứng dụng

23121
22:05:54,642 --> 22:05:56,142
là, trích dẫn không trích dẫn, "trạng thái.

23122
22:05:56,142 --> 22:05:59,322
Một lần nữa, trạng thái đề cập đến thông tin,\n

23123
22:06:01,001 --> 22:06:05,711
Và trong bối cảnh này, sự tò mò\nis rằng về mặt kỹ thuật HTTP là

23124
22:06:07,271 --> 22:06:11,381
Sau khi bạn truy cập một URL,\nhttp://thứ gì đó, hãy nhấn Enter

23125
22:06:11,381 --> 22:06:14,471
trang web được tải xuống\ntrình duyệt của bạn, thế là xong.

23126
22:06:14,471 --> 22:06:17,471
Bạn có thể rút phích cắm khỏi Internet\nbạn có thể tắt Wi-Fi

23127
22:06:17,471 --> 22:06:19,991
nhưng bạn vẫn có trang web cục bộ.

23128
22:06:19,991 --> 22:06:23,171
Tuy nhiên, bằng cách nào đó chúng tôi muốn đảm bảo rằng vào lần tới bạn

23129
22:06:23,172 --> 22:06:25,822
nhấp vào một liên kết trên trang web đó,\nit sẽ không quên bạn là ai.

23130
22:06:25,822 --> 22:06:27,822
Hoặc sản phẩm tiếp theo bạn thêm\nvào giỏ hàng của mình

23131
22:06:27,822 --> 22:06:29,631
nó không quên những gì\nđã có ở đó.

23132
22:06:29,631 --> 22:06:32,861
Vì vậy bằng cách nào đó chúng tôi muốn\nlàm cho HTTP có trạng thái

23133
22:06:32,861 --> 22:06:36,191
và chúng tôi thực sự có thể làm điều này bằng cách sử dụng\n

23134
22:06:36,191 --> 22:06:40,902
Vì vậy, cụ thể thì đây là biểu mẫu bạn có thể\n

23135
22:06:42,491 --> 22:06:46,421
Và tôi hiếm khi nói vì hầu hết\n

23136
22:06:46,422 --> 22:06:49,452
bạn chỉ cần duy trì trạng thái đăng nhập, khá\nvô tận, trong trình duyệt của mình.

23137
22:06:49,452 --> 22:06:52,152
Và đó là vì Google\nha đã đưa ra lựa chọn có ý thức

23138
22:06:52,152 --> 22:06:55,862
cho bạn một phiên rất dài\nthời gian, có thể là một ngày, một tuần

23139
22:06:55,861 --> 22:06:57,611
một tháng, một năm, bởi vì\nhọ thực sự không

23140
22:06:57,611 --> 22:07:01,271
muốn gây thêm khó khăn khi sử dụng công cụ của họ\n

23141
22:07:01,271 --> 22:07:04,191
Ngược lại, có những ứng dụng\nkhác trong khuôn viên trường

23142
22:07:04,191 --> 22:07:07,031
bao gồm một số vùng CS50,\n

23143
22:07:07,032 --> 22:07:09,102
Bởi vì chúng tôi muốn\nđảm bảo rằng đó thực sự là bạn

23144
22:07:09,101 --> 22:07:13,042
truy cập trang web chứ không phải bạn cùng phòng\n

23145
22:07:13,042 --> 22:07:16,822
Vì vậy, sau khi bạn điền vào\nbiểu mẫu này, Google sẽ xử lý như thế nào sau đó

23146
22:07:16,822 --> 22:07:20,152
biết rằng bạn là bạn và\nngay cả khi bạn tải lại trang

23147
22:07:20,152 --> 22:07:22,911
hoặc mở tab thứ hai cho\ncùng tài khoản Gmail của bạn

23148
22:07:22,911 --> 22:07:26,668
làm sao họ biết bạn vẫn còn\n

23149
22:07:26,668 --> 22:07:29,001
Nào, hãy cùng tìm hiểu\nbên dưới những gì đang diễn ra.

23150
22:07:29,001 --> 22:07:32,451
Khi bạn đăng nhập vào Gmail,\nvề cơ bản, ban đầu bạn

23151
22:07:32,452 --> 22:07:35,182
hãy xem một biểu mẫu như thế này\nsử dụng yêu cầu GET.

23152
22:07:35,182 --> 22:07:37,851
Và trang web phản hồi\ngiống như chúng ta đã thấy tuần trước

23153
22:07:37,851 --> 22:07:39,271
với một số loại phản hồi HTTP.

23154
22:07:39,271 --> 22:07:41,391
Hy vọng 200 OK với mẫu đơn.

23155
22:07:41,392 --> 22:07:46,222
Trong khi đó, trang web\ncũng có thể phản hồi bằng tiêu đề HTTP

23156
22:07:46,221 --> 22:07:49,432
điều đó, tuần trước chúng tôi không quan tâm\nđến, tuần này, bây giờ chúng tôi quan tâm.

23157
22:07:49,432 --> 22:07:53,002
Bất cứ khi nào bạn truy cập một trang web,\nit là trường hợp rất phổ biến

23158
22:07:53,001 --> 22:07:56,072
rằng trang web đang đặt\na cookie trên máy tính của bạn.

23159
22:07:56,072 --> 22:07:58,672
Và bạn có thể thường biết\nrằng cookie có thể không tốt

23160
22:07:58,672 --> 22:08:03,412
và họ theo dõi bạn theo một cách nào đó, và\n

23161
22:08:03,411 --> 22:08:08,811
Không có cookie, bạn không thể triển khai\n

23162
22:08:10,342 --> 22:08:12,741
Thật không may, chúng cũng có thể\nđược sử dụng cho mục đích xấu

23163
22:08:12,741 --> 22:08:16,042
như theo dõi bạn trên mọi trang web và\n

23164
22:08:16,542 --> 22:08:18,471
Vì vậy, cái tốt đi kèm với cái xấu.

23165
22:08:18,471 --> 22:08:21,651
Nhưng nguyên tắc cơ bản dành cho\nus, nhà khoa học máy tính

23166
22:08:21,652 --> 22:08:24,622
tóm lại chỉ là các tiêu đề HTTP.

23167
22:08:24,622 --> 22:08:29,512
Một cookie thường là một con số lớn,\n

23168
22:08:29,512 --> 22:08:33,741
rằng máy chủ yêu cầu trình duyệt của bạn\n lưu trữ trong bộ nhớ, hoặc thậm chí

23169
22:08:35,402 --> 22:08:38,941
Vì vậy bạn có thể coi nó giống như một tập tin\n

23170
22:08:38,941 --> 22:08:43,012
Và lời hứa mà HTTP\n đưa ra là nếu một máy chủ đặt

23171
22:08:43,012 --> 22:08:45,982
một cookie trên máy tính của bạn,\nbạn sẽ đại diện

23172
22:08:45,982 --> 22:08:49,982
cùng một cookie hoặc cùng một\ngiá trị đó cho mọi yêu cầu tiếp theo.

23173
22:08:49,982 --> 22:08:51,862
Vì vậy, khi bạn truy cập\ntrang web như Gmail

23174
22:08:51,861 --> 22:08:55,611
họ đặt một cookie vào máy tính của bạn\nnhư thế này trong một số phiên

23175
22:08:55,611 --> 22:08:57,741
bằng giá trị, một số giá trị ngẫu nhiên dài.

23176
22:08:57,741 --> 22:09:00,072
Một, hai, ba, A, B,\nC, đại loại như thế.

23177
22:09:00,072 --> 22:09:04,491
Và khi bạn truy cập một trang khác\n

23178
22:09:04,491 --> 22:09:09,351
bạn gửi tiêu đề ngược lại, không phải\n

23179
22:09:09,351 --> 22:09:11,372
và bạn gửi cùng một giá trị.

23180
22:09:11,372 --> 22:09:13,779
Nó tương tự như việc đi đến\ncâu lạc bộ hoặc công viên giải trí

23181
22:09:13,778 --> 22:09:15,861
nơi bạn trả tiền một lần, bạn\ng qua cổng một lần

23182
22:09:15,861 --> 22:09:17,781
bạn sẽ được\nbảo mật kiểm tra một lần, và sau đó

23183
22:09:17,782 --> 22:09:22,672
họ thường coi như một con tem nhỏ\n

23184
22:09:22,672 --> 22:09:25,505
Và đối với bạn, xét về mặt hiệu quả,\n

23185
22:09:25,505 --> 22:09:27,839
hoặc muộn hơn vào buổi tối, bạn\ncó thể đưa tay ra.

23186
22:09:27,839 --> 22:09:29,452
Có lẽ bạn đã bị đóng dấu.

23187
22:09:29,452 --> 22:09:32,122
Họ đã-- bạn đã\đã thanh toán rồi, bạn đã

23188
22:09:32,122 --> 22:09:33,661
đã được tìm kiếm hoặc không có gì.

23189
22:09:33,661 --> 22:09:35,631
Và đây là loại vé theo dõi nhanh

23190
22:09:35,631 --> 22:09:37,461
trở lại câu lạc bộ, trở lại công viên.

23191
22:09:37,461 --> 22:09:41,241
Về cơ bản đó là điều mà\nookie đang làm cho bạn, nhờ đó

23192
22:09:41,241 --> 22:09:43,822
đó là một cách để nhắc nhở\ntrang web chúng ta đã thực hiện việc này

23193
22:09:43,822 --> 22:09:46,051
bạn đã hỏi tôi\ntên người dùng và mật khẩu của tôi.

23194
22:09:46,051 --> 22:09:48,531
Đây là con đường của tôi bây giờ đến và đi.

23195
22:09:48,532 --> 22:09:52,522
Bây giờ, không giống như dấu tay này,\n

23196
22:09:52,521 --> 22:09:55,131
hoặc bị sao chép hoặc lưu giữ\không trong nhiều ngày

23197
22:09:55,131 --> 22:09:59,941
những chiếc bánh quy này có vẻ thực sự lớn\n

23198
22:09:59,941 --> 22:10:02,661
Vì vậy, theo thống kê,\nkhông có cách nào khác

23199
22:10:02,661 --> 22:10:05,872
sẽ đoán cookie của bạn\n

23200
22:10:05,872 --> 22:10:08,872
xác suất rất thấp về mặt thống kê.

23201
22:10:08,872 --> 22:10:12,711
Nhưng tóm lại tất cả chỉ là thế này\n

23202
22:10:12,711 --> 22:10:16,771
để gửi đi\n những giá trị này theo cách này.

23203
22:10:16,771 --> 22:10:19,131
Vì vậy, khi chúng tôi thực sự\ndịch cái này sang mã

23204
22:10:19,131 --> 22:10:21,232
hãy làm điều gì đó như\na ứng dụng đăng nhập đơn giản.

23205
22:10:21,232 --> 22:10:24,351
Hãy để tôi đi vào một thư mục tôi đã tạo trước hôm nay có tên là đăng nhập.

23206
22:10:24,351 --> 22:10:28,922
Và hãy để tôi viết mã app.py và\nhãy xem ở đây.

23207
22:10:30,471 --> 22:10:31,911
Một vài điều mới lên hàng đầu.

23208
22:10:31,911 --> 22:10:36,801
Nếu tôi muốn có khả năng\n

23209
22:10:36,801 --> 22:10:40,611
và triển khai các phiên, tôi sẽ đi\n

23210
22:10:41,551 --> 22:10:44,572
Vì vậy, đây là một tính năng khác mà bạn nhận được miễn phí bằng cách sử dụng một khung

23211
22:10:44,572 --> 22:10:46,801
và không cần phải tự mình thực hiện\ntất cả việc này.

23212
22:10:46,801 --> 22:10:48,951
Và từ thư viện Flask\nsession, tôi sẽ

23213
22:10:48,952 --> 22:10:51,502
để nhập Phiên, viết hoa S. Tại sao?

23214
22:10:51,501 --> 22:10:53,751
Tôi sẽ định cấu hình\nphiên như sau.

23215
22:10:53,751 --> 22:10:56,751
Tóm lại, có nhiều\ncách khác nhau để triển khai phiên.

23216
22:10:56,751 --> 22:11:00,711
Máy chủ có thể lưu trữ những\nookie này trong cơ sở dữ liệu, trong một tệp

23217
22:11:00,711 --> 22:11:03,152
trong bộ nhớ, trong RAM, ở những nơi khác nữa.

23218
22:11:03,152 --> 22:11:07,982
Chúng tôi đang yêu cầu nó lưu trữ những thứ này\n

23219
22:11:07,982 --> 22:11:11,452
Vì vậy, trên thực tế, bất cứ khi nào bạn sử dụng phiên\n

23220
22:11:11,452 --> 22:11:15,292
thực ra bạn sẽ thấy một thư mục\n

23221
22:11:15,292 --> 22:11:17,842
về cơ bản là các\nookie

23222
22:11:17,842 --> 22:11:20,211
cho bất kỳ người dùng hoặc bạn bè\cũng như chính bạn nào đã từng

23223
22:11:20,211 --> 22:11:22,801
truy cập ứng dụng cụ thể của bạn.

23224
22:11:22,801 --> 22:11:24,561
Vì vậy tôi đang cài đặt nó để\nsử dụng hệ thống tập tin

23225
22:11:24,562 --> 22:11:26,770
và tôi không muốn chúng\nvĩnh viễn bởi vì tôi muốn

23226
22:11:26,770 --> 22:11:29,482
khi bạn đóng trình duyệt,\nphiên sẽ biến mất.

23227
22:11:29,482 --> 22:11:32,032
Chúng có thể được tạo ra để tồn tại vĩnh viễn và tồn tại lâu hơn nhiều.

23228
22:11:32,032 --> 22:11:34,222
Sau đó, tôi yêu cầu ứng dụng của mình hỗ trợ các phiên.

23229
22:11:35,902 --> 22:11:39,572
Hãy xem thực chất ứng dụng này có gì\n

23230
22:11:39,572 --> 22:11:44,902
Hãy để tôi đi tới cửa sổ terminal của tôi,\n

23231
22:11:49,202 --> 22:11:51,502
Hãy cho nó một giây để quay trở lại.

23232
22:11:51,501 --> 22:11:53,361
Hãy để tôi tiếp tục và mở URL của tôi.

23233
22:11:59,792 --> 22:12:02,226
Vì vậy, trang web này chỉ đơn giản là có một hình thức đăng nhập.

23234
22:12:02,226 --> 22:12:04,101
Không có mật khẩu,\nmặc dù tôi chắc chắn có thể

23235
22:12:04,101 --> 22:12:05,902
thêm nó và kiểm tra xem.

23236
22:12:07,411 --> 22:12:10,072
Vì vậy, tôi sẽ đăng nhập với tư cách\nchính mình, David, và nhấp vào Đăng nhập.

23237
22:12:10,072 --> 22:12:12,892
Và bây giờ hãy lưu ý rằng tôi hiện đang ở tuyến đường /đăng nhập.

23238
22:12:13,881 --> 22:12:16,206
Nếu tôi cố gắng đi tới\ntuyến đường mặc định, chỉ cần

23239
22:12:16,206 --> 22:12:18,831
dấu gạch chéo, đây là nơi hầu hết\ncác trang web hoạt động theo mặc định

23240
22:12:18,831 --> 22:12:21,771
nhận thấy rằng tôi\ng đã được chuyển hướng một cách kỳ diệu để đăng nhập.

23241
22:12:21,771 --> 22:12:24,921
Vì vậy, bằng cách nào đó, mã của tôi biết, này, nếu\n

23242
22:12:26,691 --> 22:12:29,301
Hãy để tôi nhập tên của tôi\nDavid và nhấp vào Đăng nhập.

23243
22:12:29,301 --> 22:12:32,106
Và bây giờ hãy chú ý rằng tôi đã quay lại dấu gạch chéo.

23244
22:12:32,107 --> 22:12:35,332
Chrome đang ẩn mình một cách khó chịu\n

23245
22:12:36,482 --> 22:12:39,232
Và bây giờ hãy chú ý rằng bạn\nare đăng nhập với tên David.

23246
22:12:39,892 --> 22:12:43,162
Điều thú vị là nếu tôi tải lại\ntrang, nó vẫn biết điều đó.

23247
22:12:43,161 --> 22:12:46,581
Nếu tôi tạo tab thứ hai và đi tới\n

23248
22:12:48,293 --> 22:12:50,001
Tôi có thể tiếp tục\nviệc này trong nhiều tab

23249
22:12:50,001 --> 22:12:53,721
nó vẫn sẽ nhớ tôi trên cả hai\n

23250
22:12:55,051 --> 22:13:00,141
Đặc biệt là khi tôi nhấp vào Đăng xuất,\n

23251
22:13:00,142 --> 22:13:01,792
Được rồi, hãy xem nó hoạt động thế nào.

23252
22:13:01,792 --> 22:13:03,741
Và đó là một số khối xây dựng cơ bản.

23253
22:13:03,741 --> 22:13:07,551
Trong /route của tôi, hãy chú ý rằng tôi có cái này.

23254
22:13:07,551 --> 22:13:12,421
Nếu không có tên trong phiên,\nchuyển hướng người dùng đến /login.

23255
22:13:12,422 --> 22:13:14,992
Vậy hai dòng này\ncùng nhau là những gì thực hiện

23256
22:13:14,991 --> 22:13:19,611
chuyển hướng tự động đó bằng cách sử dụng\nHTTP 301 hoặc 302 một cách tự động.

23257
22:13:19,611 --> 22:13:21,691
Nó được xử lý cho tôi\nvới hai dòng này.

23258
22:13:23,351 --> 22:13:25,101
Được rồi, chúng ta hãy đi xuống cái hang thỏ đó.

23259
22:13:29,991 --> 22:13:36,652
hãy để tôi xem trong thư mục mẫu\n của tôi để xem bản demo đăng nhập của tôi và xem

23260
22:13:40,042 --> 22:13:41,631
Được rồi, vậy chuyện gì đang xảy ra ở đây?

23261
22:13:41,631 --> 22:13:46,221
Tôi mở rộng bố cục.html,\nTôi có phần thân khối

23262
22:13:46,221 --> 22:13:47,961
và sau đó tôi có một số cú pháp khác.

23263
22:13:47,961 --> 22:13:50,504
Vì vậy, chúng tôi chưa thấy nội dung này,\nnhưng đó là nội dung về Jinja nhiều hơn,

23264
22:13:50,504 --> 22:13:52,221
một lần nữa, gần giống với Python.

23265
22:13:52,221 --> 22:13:55,311
Nếu có tên trong\nbiến phiên

23266
22:13:55,312 --> 22:14:00,082
thì nghĩa đen là bạn đã đăng nhập\n

23267
22:14:00,081 --> 22:14:04,641
Và rồi hãy để ý điều này, tôi có một điều đơn giản\n

23268
22:14:04,642 --> 22:14:07,312
Ngược lại, nếu không có\ntên trong phiên

23269
22:14:07,312 --> 22:14:11,122
thì có vẻ như nó nói rằng bạn không phải vậy\n

23270
22:14:11,122 --> 22:14:13,612
liên kết đến/đăng nhập và sau đó kết thúc khác.

23271
22:14:13,611 --> 22:14:16,221
Vì vậy, một lần nữa, Jinja\nkhông dựa vào thụt lề.

23272
22:14:16,221 --> 22:14:19,221
Hãy nhớ lại HTML và CSS không thực sự quan tâm đến việc thụt lề

23273
22:14:20,452 --> 22:14:24,022
Nhưng trong mã với Jinja,\nbạn cần những thẻ kết thúc này

23274
22:14:24,021 --> 22:14:26,872
khối kết thúc, kết thúc cho, kết thúc\nif, để làm cho siêu rõ ràng

23275
22:14:26,872 --> 22:14:29,092
rằng bạn đã xong với suy nghĩ đó.

23276
22:14:29,092 --> 22:14:32,601
Vì vậy phiên chỉ là biến\nma thuật mà bây giờ chúng ta

23277
22:14:32,601 --> 22:14:36,891
có quyền truy cập vì chúng tôi\nđã đưa hai dòng mã này vào

23278
22:14:36,892 --> 22:14:41,902
và những cái này xử lý toàn bộ việc đó\n

23279
22:14:41,902 --> 22:14:43,851
bằng một mã định danh khác, duy nhất.

23280
22:14:43,851 --> 22:14:46,521
Nếu tôi đặt không gian mã của mình\ncông khai và tôi cho phép tất cả các bạn

23281
22:14:46,521 --> 22:14:50,031
truy cập vào cùng một URL, tất cả\n

23282
22:14:50,032 --> 22:14:52,102
Tất cả các bạn có thể nhập tên\hiện tại của mình một cách riêng lẻ

23283
22:14:52,101 --> 22:14:56,092
tất cả đều đăng nhập tại cùng một URL\nsử dụng các phiên khác nhau.

23284
22:14:56,092 --> 22:14:59,332
Và trên thực tế, khi đó tôi sẽ thấy,\nnếu tôi vào cửa sổ terminal của mình

23285
22:14:59,331 --> 22:15:03,991
đây và thư mục đăng nhập của tôi, hãy chú ý\n

23286
22:15:03,991 --> 22:15:07,881
Và nếu tôi CD vào đó và gõ ls,\n

23287
22:15:07,881 --> 22:15:10,551
hoặc thực ra, tôi nghĩ tôi\nđã khởi động máy chủ hai lần.

23288
22:15:11,941 --> 22:15:14,691
Cuối cùng tôi sẽ có một\ntệp cho mỗi người trong số các bạn.

23289
22:15:14,691 --> 22:15:16,701
Và đó\nđiều tuyệt vời về các phiên

23290
22:15:16,702 --> 22:15:21,292
có phải nó tạo ra ảo giác\nvề dung lượng lưu trữ của mỗi người dùng.

23291
22:15:21,292 --> 22:15:25,622
Bên trong phiên của tôi là tên của tôi,\n

23292
22:15:26,482 --> 22:15:30,512
Và điều tương tự cũng sẽ áp dụng cho\n

23293
22:15:30,512 --> 22:15:32,211
Hãy xem cách đăng nhập hoạt động ở đây.

23294
22:15:32,211 --> 22:15:36,622
Lộ trình đăng nhập của tôi hỗ trợ cả GET và\n

23295
22:15:36,622 --> 22:15:41,192
Và hãy chú ý điều này, lộ trình đăng nhập này\n

23296
22:15:41,191 --> 22:15:45,394
Nếu người dùng truy cập được\nđịnh tuyến này qua POST, thì suy luận của tôi

23297
22:15:45,395 --> 22:15:47,062
là họ phải nộp một mẫu đơn.

23298
22:15:47,562 --> 22:15:50,991
Bởi vì đó là cách tôi sẽ làm\n

23299
22:15:50,991 --> 22:15:53,631
Và nếu họ đã gửi\nbiểu mẫu qua POST

23300
22:15:53,631 --> 22:15:56,691
Tôi sẽ lưu trữ, trong\nphiên, ở tên

23301
22:15:56,691 --> 22:15:59,091
chìa khóa, bất kể tên người đó là gì.

23302
22:15:59,092 --> 22:16:01,267
Và sau đó, tôi sẽ\nchuyển hướng chúng trở lại dấu gạch chéo.

23303
22:16:01,267 --> 22:16:04,352
Nếu không, tôi sẽ\ncho họ xem biểu mẫu đăng nhập.

23304
22:16:05,631 --> 22:16:08,961
Nếu tôi truy cập vào biểu mẫu đăng nhập\n này, nằm ở

23305
22:16:08,961 --> 22:16:12,861
theo nghĩa đen, gạch chéo đăng nhập, theo mặc định,\n

23306
22:16:14,721 --> 22:16:16,881
Và đó là lý do tại sao tôi nhìn thấy biểu mẫu.

23307
22:16:18,411 --> 22:16:22,311
Biểu mẫu, rất khéo léo,\ntự gửi vào chính nó

23308
22:16:22,312 --> 22:16:26,991
giống như một lộ trình/đăng nhập gửi\nvào chính nó, /đăng nhập

23309
22:16:26,991 --> 22:16:29,581
nhưng nó sử dụng POST khi\nbạn gửi biểu mẫu.

23310
22:16:29,581 --> 22:16:33,711
Và đây là một cách hay để có một cái\n

23311
22:16:36,142 --> 22:16:40,652
Khi tôi vừa ghé thăm /đăng nhập\n

23312
22:16:40,652 --> 22:16:45,741
Nhưng nếu tôi gửi biểu mẫu thì đây\n

23313
22:16:45,741 --> 22:16:49,732
và điều này chỉ giúp tôi tránh việc phải có\n

23314
22:16:50,301 --> 22:16:55,402
Tôi chỉ có thể có một tuyến đường\nxử lý cả GET và POST.

23315
22:16:57,182 --> 22:16:58,792
Vâng, nó đơn giản như thế này.

23316
22:16:58,792 --> 22:17:01,221
Thay đổi bất kỳ tên nào\nis trong phiên thành

23317
22:17:01,221 --> 22:17:05,451
không có, đây là phiên bản null của Python,\n

23318
22:17:06,081 --> 22:17:12,152
Bởi vì bây giờ, trong index.html, tôi sẽ\n

23319
22:17:13,471 --> 22:17:16,921
Và vì vậy tôi sẽ thông báo cho người dùng\thay vào đó, bạn chưa đăng nhập.

23320
22:17:18,375 --> 22:17:20,542
Tôi muốn nói đơn giản như\nnhư thế này, mặc dù tôi nhận ra

23321
22:17:20,542 --> 22:17:22,402
đây là một loạt các bước liên quan.

23322
22:17:22,402 --> 22:17:25,581
Đây là bản chất của mọi\ntrang web trên Internet

23323
22:17:25,581 --> 22:17:26,951
có tên người dùng và mật khẩu.

23324
22:17:26,952 --> 22:17:30,202
Và chúng ta bỏ qua bước đặt tên mật khẩu cho\n

23325
22:17:30,202 --> 22:17:34,612
nhưng đây là cách mọi trang web ra\n

23326
22:17:34,611 --> 22:17:37,221
Và cách thức hoạt động\cuối cùng của nó là ngay khi

23327
22:17:37,221 --> 22:17:41,001
như bạn sử dụng trong các dòng Python\nnhư thế này và các dòng như thế này

23328
22:17:41,001 --> 22:17:45,141
Bình đảm nhận việc đóng dấu\n

23329
22:17:45,142 --> 22:17:50,392
và bất cứ khi nào Flask thấy\nookie tương tự quay trở lại từ người dùng

23330
22:17:50,392 --> 22:17:53,632
nó lấy tập tin\n thích hợp từ thư mục đó

23331
22:17:53,631 --> 22:17:56,042
tải nó vào biến toàn cục\nsession

23332
22:17:56,042 --> 22:18:01,012
để mã của bạn bây giờ là duy nhất\nđối với người dùng đó và tên của họ.

23333
22:18:01,012 --> 22:18:03,922
Hãy làm một ví dụ khác\nvới các phiên ở đây

23334
22:18:03,922 --> 22:18:06,652
điều đó sẽ cho thấy cách chúng ta có thể sử dụng\nnhững thứ này cho giỏ hàng ngay bây giờ.

23335
22:18:06,652 --> 22:18:09,142
Hãy để tôi đi vào ví dụ về cửa hàng ở đây.

23336
22:18:09,142 --> 22:18:10,972
Hãy để tôi tiếp tục\nchạy cái này trước.

23337
22:18:10,971 --> 22:18:16,851
Nếu tôi chạy store trong cùng\ntab của mình và quay lại đây

23338
22:18:16,851 --> 22:18:19,881
chúng ta sẽ thấy một trang web thương mại\ne rất xấu

23339
22:18:19,881 --> 22:18:21,771
chỉ bán bảy cuốn sách khác nhau ở đây.

23340
22:18:21,771 --> 22:18:26,258
Nhưng mỗi cuốn sách này đều có một nút\n

23341
22:18:26,259 --> 22:18:28,342
Được rồi,\nnhững cuốn sách này đến từ đâu?

23342
22:18:29,361 --> 22:18:32,751
Hãy để tôi đi vào cửa sổ terminal của tôi một lần nữa.

23343
22:18:32,751 --> 22:18:35,991
Hãy để tôi đi vào ví dụ này,\nđược gọi là cửa hàng

23344
22:18:35,991 --> 22:18:40,911
và để tôi mở ra về\nindex dot ht-- rất tiếc.

23345
22:18:40,911 --> 22:18:48,381
Hãy mở chỉ mục,\nthế nào, books.html

23346
22:18:48,381 --> 22:18:50,671
là mặc định, không phải chỉ mục lần này.

23347
22:18:50,672 --> 22:18:55,461
Vì vậy nếu tôi nhìn vào đây, hãy chú ý rằng\ntuyến đường mà chúng ta vừa thấy

23348
22:18:55,461 --> 22:19:00,172
sử dụng vòng lặp for trong Jinja để lặp\n

23349
22:19:00,172 --> 22:19:03,532
và nó xuất ra, trong thẻ H2\n, tiêu đề của cuốn sách

23350
22:19:03,532 --> 22:19:05,722
và sau đó là một trong những hình thức khác.

23351
22:19:08,072 --> 22:19:11,991
Hãy tiếp tục và mở app.py,\n

23352
22:19:11,991 --> 22:19:13,432
chuyện gì đang xảy ra vậy.

23353
22:19:13,432 --> 22:19:16,851
Lưu ý rằng tệp này đang\nimport hỗ trợ phiên.

23354
22:19:16,851 --> 22:19:19,851
Nó đang định cấu hình các phiên\nở dưới đây, nhưng nó cũng

23355
22:19:19,851 --> 22:19:22,292
kết nối với tệp store.db.

23356
22:19:23,842 --> 22:19:29,362
Và hãy chú ý điều này, trong /route,\nTôi đang chọn ngôi sao từ sách

23357
22:19:29,361 --> 22:19:31,641
nó sẽ cung cấp cho tôi\na danh sách các từ điển

23358
22:19:31,642 --> 22:19:33,652
mỗi trong số đó đại diện cho một hàng sách.

23359
22:19:33,652 --> 22:19:37,881
Và tôi sẽ chuyển qua danh sách\n đó

23360
22:19:37,881 --> 22:19:41,601
đó là lý do vì sao vòng lặp for này hoạt động như vậy.

23361
22:19:41,601 --> 22:19:43,281
Hãy nhìn vào cơ sở dữ liệu thực tế này.

23362
22:19:43,282 --> 22:19:48,472
Hãy để tôi tăng cửa sổ terminal\n

23363
22:19:50,881 --> 22:19:55,531
Đó là một cuốn sách-- đó là một cái bàn có tên\n

23364
22:19:55,532 --> 22:19:58,552
Hãy chọn dấu sao\ntừ dấu chấm phẩy của sách.

23365
22:19:58,551 --> 22:20:01,311
Có bảy cuốn sách,\mỗi cuốn có một ID duy nhất.

23366
22:20:01,312 --> 22:20:03,241
Và bạn có thể thấy điều này sẽ đi đến đâu.

23367
22:20:03,241 --> 22:20:06,801
Nếu tôi đi tới giao diện người dùng và nhìn\na vào từng nút này

23368
22:20:06,801 --> 22:20:11,961
để thêm vào giỏ hàng, giống như Amazon\n

23369
22:20:13,312 --> 22:20:15,264
Và điều kỳ diệu ở đây,\ngiống như việc hủy đăng ký

23370
22:20:15,264 --> 22:20:17,182
mặc dù lúc đó tôi đã không\nlàm nổi bật nó

23371
22:20:17,182 --> 22:20:19,342
có một loại đầu vào\nof khác cho phép

23372
22:20:19,342 --> 22:20:23,241
bạn chỉ định một giá trị mà không có\n

23373
22:20:23,241 --> 22:20:26,031
Thay vì gõ bằng\nvăn bản hoặc gõ bằng gửi

23374
22:20:26,032 --> 22:20:30,992
loại bằng ẩn sẽ đặt giá trị vào\n

23375
22:20:30,991 --> 22:20:34,101
Vì vậy, đó là cách tôi nói rằng\ný tưởng của cuốn sách này là một

23376
22:20:34,101 --> 22:20:38,312
ý tưởng của cuốn sách này là hai, ý tưởng\n

23377
22:20:38,312 --> 22:20:40,882
Và sau đó, mỗi biểu mẫu này\nsẽ được gửi

23378
22:20:40,881 --> 22:20:45,842
vào /cart bằng POST và điều đó sẽ\n

23379
22:20:46,592 --> 22:20:48,622
Hãy để tôi nhấp vào một hoặc hai trong số này.

23380
22:20:48,622 --> 22:20:51,592
Hãy thêm cuốn sách đầu tiên, thêm vào giỏ hàng.

23381
22:20:52,642 --> 22:20:54,922
Lưu ý thay đổi tuyến đường của tôi thành /cart.

23382
22:20:54,922 --> 22:20:58,882
Được rồi, hãy quay lại và\nhãy thêm cuốn sách số hai.

23383
22:20:59,872 --> 22:21:02,872
Và hãy chuyển sang cuốn\thứ bảy, Bảo bối Tử thần

23384
22:21:02,872 --> 22:21:05,612
và bây giờ chúng ta có cả ba cuốn sách ở đây.

23385
22:21:05,611 --> 22:21:09,291
Vậy tuyến đường giỏ hàng làm gì tại /cart?

23386
22:21:10,042 --> 22:21:15,351
Nếu tôi quay lại cửa sổ terminal của mình,\n

23387
22:21:15,351 --> 22:21:17,721
có rất nhiều điều đang diễn ra\nở đây, nhưng hãy xem.

23388
22:21:17,721 --> 22:21:21,292
Vì vậy, tuyến /cart\nhỗ trợ cả GET hoặc POST

23389
22:21:21,292 --> 22:21:24,892
đó là một cách hay để\nhợp nhất mọi thứ thành một URL.

23390
22:21:24,892 --> 22:21:26,792
Được rồi, điều này thật thú vị.

23391
22:21:26,792 --> 22:21:30,945
Nếu không có khóa, quote\nunquote, "cart" trong phiên

23392
22:21:30,945 --> 22:21:32,612
về mặt kỹ thuật chúng tôi chưa thấy cú pháp này.

23393
22:21:32,611 --> 22:21:36,771
Nhưng tóm lại, những dòng này\n

23394
22:21:37,982 --> 22:21:43,161
Nó đảm bảo rằng có một chiếc xe đẩy\n

23395
22:21:43,161 --> 22:21:45,741
và theo mặc định, nó\nsẽ là một danh sách trống.

23396
22:21:46,282 --> 22:21:48,282
Điều đó chỉ có nghĩa là bạn có\nan giỏ hàng trống.

23397
22:21:48,282 --> 22:21:55,612
Nhưng nếu người dùng truy cập tuyến đường này qua\n

23398
22:21:55,611 --> 22:21:59,241
họ không làm hỏng biểu mẫu trong bất kỳ\n nào

23399
22:21:59,241 --> 22:22:02,691
họ đã đưa cho tôi một ID hợp lệ, sau đó\ntôi sẽ sử dụng cú pháp này.

23400
22:22:02,691 --> 22:22:05,542
Nếu giỏ khung phiên là một danh sách--

23401
22:22:05,542 --> 22:22:07,846
nhớ lại từ vài tuần trước\na rằng dấu chấm đó chỉ nối thêm

23402
22:22:07,846 --> 22:22:08,971
thêm một cái gì đó vào danh sách.

23403
22:22:08,971 --> 22:22:13,201
Vì vậy tôi sẽ thêm ID vào\n

23404
22:22:13,202 --> 22:22:18,612
Mặt khác, nếu người dùng ở /cart\n

23405
22:22:18,611 --> 22:22:22,091
Chọn ngôi sao từ những cuốn sách có ID.

23406
22:22:22,092 --> 22:22:24,932
Và đây có thể là cú pháp\nbạn nhớ lại từ Pset 6.

23407
22:22:24,932 --> 22:22:27,542
Nó cho phép bạn tìm\nnhiều ID cùng một lúc

23408
22:22:27,542 --> 22:22:29,762
bởi vì nếu tôi có một danh sách phiên--

23409
22:22:29,762 --> 22:22:34,232
danh sách ID trong giỏ hàng của mình, tôi không thể lấy tất cả những cuốn sách đó cùng một lúc.

23410
22:22:34,232 --> 22:22:36,932
Câu chuyện dài quá,\nchuyện gì đã xảy ra ở đây vậy?

23411
22:22:36,932 --> 22:22:42,932
Tôi đang cất sách vào xe đẩy\n

23412
22:22:42,932 --> 22:22:45,792
Trình duyệt của tôi đang gửi đi gửi lại cùng một con tem\nhand

23413
22:22:45,792 --> 22:22:48,911
đó là lý do tại sao trang web này biết điều đó\n

23414
22:22:48,911 --> 22:22:50,701
và không phải bạn hay không phải Carter hay không phải Emma.

23415
22:22:50,702 --> 22:22:54,002
Thật vậy, nếu tất cả chúng ta đều ghé thăm\n

23416
22:22:54,001 --> 22:22:56,791
và cho phép điều đó, thì chúng ta sẽ có ảo tưởng của riêng mình

23417
22:22:58,411 --> 22:23:00,902
Và mỗi chiếc xe đó,\trong thực tế, sẽ chỉ

23418
22:23:00,902 --> 22:23:04,682
được lưu trữ trong thư mục Flask\nsession này trên máy chủ

23419
22:23:04,682 --> 22:23:06,482
để máy chủ\ncó thể theo dõi từng

23420
22:23:06,482 --> 22:23:09,452
trong số chúng ta đang sử dụng lại những giá trị\nookie này đang được

23421
22:23:09,452 --> 22:23:13,182
được gửi qua lại thông qua các tiêu đề này.

23422
22:23:13,682 --> 22:23:15,991
Tôi biết thế là nhiều,\nnhưng một lần nữa, chỉ là

23423
22:23:15,991 --> 22:23:19,471
cách Python mới\nchỉ tận dụng những HTTP đó

23424
22:23:19,471 --> 22:23:22,121
tiêu đề từ tuần trước một cách thông minh.

23425
22:23:22,122 --> 22:23:26,101
Bạn có câu hỏi nào trước khi chúng ta xem\n bộ ví dụ cuối cùng không?

23426
22:23:27,410 --> 22:23:31,322
KHÁN GIẢ: [KHÔNG NGHE ĐƯỢC] hiểu cách\n

23427
22:23:31,322 --> 22:23:34,744
Nó sử dụng [KHÔNG NGHE ĐƯỢC] như thế nào,\nlàm thế nào để bạn thay đổi [KHÔNG NGHE ĐƯỢC]??

23428
22:23:34,744 --> 22:23:39,145
Bởi vì để sử dụng dấu chấm GET\nrequest [KHÔNG NGHE ĐƯỢC] bằng

23429
22:23:39,145 --> 22:23:43,081
phải có một\ntrao đổi trong [KHÔNG NGHE ĐƯỢC]..

23430
22:23:43,081 --> 22:23:46,292
DAVID: Vậy tôi nghĩ anh đang thắc mắc về việc sử dụng GET

23431
22:23:46,292 --> 22:23:48,461
và POST trong cùng một chức năng.

23432
22:23:48,461 --> 22:23:52,982
Vì vậy, đây chỉ là một\thẩm mỹ tốt đẹp, nếu bạn muốn.

23433
22:23:52,982 --> 22:23:56,432
Nếu tôi phải có\ncác tuyến riêng biệt cho GET và POST, ý tôi là

23434
22:23:56,432 --> 22:23:59,191
theo nghĩa đen nó có thể có nghĩa là tôi cần\nsố tuyến đường trong tệp của mình nhiều gấp đôi.

23435
22:23:59,191 --> 22:24:01,441
Và nó bắt đầu hơi khó chịu một chút.

23436
22:24:01,441 --> 22:24:04,182
Và ngày nay, về mặt\ntrải nghiệm người dùng cũng vậy

23437
22:24:04,182 --> 22:24:08,161
điều này có lẽ chỉ hấp dẫn với\n

23438
22:24:09,452 --> 22:24:11,461
Bạn không muốn có\nnhiều từ trong URL

23439
22:24:11,461 --> 22:24:14,922
thật tuyệt nếu các URL đẹp và\n

23440
22:24:14,922 --> 22:24:21,032
Thật tuyệt nếu tôi có thể tập trung tất cả\n

23441
22:24:21,032 --> 22:24:25,652
chỉ và không có trong nhiều tuyến,\none cho GET, một cho POST.

23442
22:24:25,652 --> 22:24:30,012
Tôi hơi khó tính,\nnhưng việc này thường được thực hiện ở đây.

23443
22:24:30,012 --> 22:24:34,622
Vậy ý nghĩa của đoạn mã này\nlà tuyến đường này, chức năng này

23444
22:24:34,622 --> 22:24:38,222
từ nay trở đi sẽ hỗ trợ cả yêu cầu\nGET và yêu cầu POST.

23445
22:24:38,221 --> 22:24:42,211
Nhưng sau đó tôi cần phân biệt giữa\n

23446
22:24:42,211 --> 22:24:44,881
Bởi vì nếu đó là yêu cầu GET,\ntôi muốn hiển thị giỏ hàng.

23447
22:24:44,881 --> 22:24:47,342
Nếu đó là yêu cầu POST, tôi\nmuốn cập nhật giỏ hàng.

23448
22:24:47,342 --> 22:24:51,542
Và cách đơn giản nhất để làm điều đó\n

23449
22:24:51,542 --> 22:24:54,991
Trong biến yêu cầu mà chúng ta\nimport từ Flask ở trên

23450
22:24:54,991 --> 22:24:57,842
bạn có thể kiểm tra\nloại yêu cầu hiện tại là gì.

23451
22:24:57,842 --> 22:25:00,932
Đó có phải là GET, là POST hay\nis là một thứ gì đó hoàn toàn khác?

23452
22:25:02,581 --> 22:25:07,652
Nếu đó là POST thì điều đó có nghĩa là vì\n

23453
22:25:07,652 --> 22:25:10,922
mà người dùng đã nhấp vào\nnút Thêm vào giỏ hàng.

23454
22:25:10,922 --> 22:25:16,112
Ngược lại, nếu nó không phải là POST thì đó là\n

23455
22:25:16,111 --> 22:25:20,371
Sau đó, tôi chỉ muốn cho người dùng thấy nội dung của giỏ hàng

23456
22:25:20,372 --> 22:25:21,881
và tôi sử dụng những dòng này để thay thế.

23457
22:25:21,881 --> 22:25:25,682
Vì vậy đó chỉ là một cách để tránh gặp phải\n

23458
22:25:26,191 --> 22:25:29,101
Bạn có thể kết hợp chúng miễn là bạn có tấm séc như thế này.

23459
22:25:29,101 --> 22:25:35,432
Nếu tôi thực sự muốn trở nên thông thái, tôi\n

23460
22:25:38,012 --> 22:25:40,592
Điều này sẽ đối xứng hơn,\nnhưng nó không thực sự cần thiết

23461
22:25:40,592 --> 22:25:43,512
bởi vì tôi biết chỉ có hai khả năng.

23462
22:25:46,092 --> 22:25:48,902
Được rồi, hãy làm một\nbộ ví dụ cuối cùng ở đây

23463
22:25:48,902 --> 22:25:51,092
điều đó sẽ kết hợp\nnhững tính năng cuối cùng

23464
22:25:51,092 --> 22:25:53,521
cùng với thứ gì đó\nmà bạn có thể thấy

23465
22:25:53,521 --> 22:25:56,373
khá thường xuyên trong các ứng dụng thực tế.

23466
22:25:56,373 --> 22:25:58,081
Và điều đó, tốt hơn\cũng không tệ hơn, bây giờ là

23467
22:25:58,081 --> 22:26:01,421
sẽ liên quan đến việc buộc lại\nmột số JavaScript từ tuần trước.

23468
22:26:01,422 --> 22:26:03,422
Mục tiêu của những ví dụ này không phải là

23469
22:26:03,422 --> 22:26:06,805
nhất thiết phải làm chủ được cách bản thân bạn\n

23470
22:26:06,804 --> 22:26:09,721
mã, mã JavaScript, nhưng chỉ\n

23471
22:26:09,721 --> 22:26:11,051
những ngôn ngữ khác nhau này hoạt động.

23472
22:26:11,051 --> 22:26:13,441
Vì vậy đối với những dự án\ncuối cùng, đặc biệt nếu bạn

23473
22:26:13,441 --> 22:26:16,921
muốn thêm chức năng JavaScript,\n

23474
22:26:16,922 --> 22:26:20,101
ít nhất bạn cũng có\nbộ xương cốt của một hình mẫu tinh thần về cách

23475
22:26:20,101 --> 22:26:22,542
bạn có thể liên kết các ngôn ngữ này lại với nhau.

23476
22:26:22,542 --> 22:26:26,131
Mặc dù trọng tâm của chúng tôi nhìn chung là\n

23477
22:26:26,131 --> 22:26:28,322
hơn trên JavaScript từ tuần trước.

23478
22:26:28,322 --> 22:26:33,422
Hãy để tôi tiếp tục và mở ra một ví dụ\n

23479
22:26:35,021 --> 22:26:39,092
Và hãy để tôi truy cập URL của tôi ở đây và\n

23480
22:26:39,092 --> 22:26:44,432
như mặc định. Việc này chỉ đơn giản\n

23481
22:26:44,432 --> 22:26:47,461
Chúng ta hãy xem HTML\nvừa được gửi tới trình duyệt của tôi.

23482
22:26:47,461 --> 22:26:49,572
Được rồi, không có nhiều chuyện xảy ra ở đây cả.

23483
22:26:49,572 --> 22:26:52,682
Vậy nên có một biểu mẫu có\nhành động là /search.

23484
22:26:52,682 --> 22:26:54,482
Nó sẽ gửi qua GET.

23485
22:26:54,482 --> 22:26:58,902
Nó sẽ sử dụng tham số q, chỉ\n

23486
22:26:58,902 --> 22:27:01,872
Vì vậy, biểu mẫu này thực sự trông giống\nbiểu mẫu Google mà chúng tôi đã thực hiện tuần trước.

23487
22:27:01,872 --> 22:27:03,752
Vì vậy, hãy xem những gì xảy ra ở đây.

23488
22:27:03,751 --> 22:27:06,151
Hãy để tôi tìm kiếm một cái gì đó như con mèo.

23489
22:27:09,581 --> 22:27:12,042
được rồi, vậy ra đây thực sự là một tập tin khá quen thuộc.

23490
22:27:12,042 --> 22:27:16,232
Những gì tôi đã tiến hành và làm là tôi đã\n

23491
22:27:16,232 --> 22:27:19,052
từ vài tuần trước\nkhi chúng tôi giới thiệu SQL lần đầu tiên

23492
22:27:19,051 --> 22:27:21,601
và tôi đã tải chúng vào\ndemo này để bạn có thể tìm kiếm

23493
22:27:21,601 --> 22:27:23,411
theo từ khóa cho bất kỳ từ nào bạn muốn.

23494
22:27:24,512 --> 22:27:27,661
Nếu chúng ta làm điều này một lần nữa, chúng ta\n

23495
22:27:27,661 --> 22:27:32,861
có chứa D-O-G, dog, như một\nchuỗi con ở đâu đó, v.v.

23496
22:27:32,861 --> 22:27:34,891
Vì vậy, đây là cách\ntruyền thống để thực hiện việc này.

23497
22:27:34,892 --> 22:27:40,502
Giống như trong Google, nó sử dụng\n/search?q=cat, q=dog, v.v.

23498
22:27:41,381 --> 22:27:45,432
Chà, chúng ta hãy\nxem nhanh app.py tại đây.

23499
22:27:45,432 --> 22:27:50,702
Hãy để tôi đi vào ví dụ số 0\nở đây, hiển thị số 0 và mở ra

23500
22:27:50,702 --> 22:27:53,222
app.py và xem chuyện gì đang xảy ra.

23501
22:27:54,881 --> 22:27:57,542
Đây là biểu mẫu, đó\nlà cách chúng tôi bắt đầu ngày hôm nay.

23502
22:27:57,542 --> 22:28:00,017
Và đây là lộ trình /search.

23503
22:28:00,017 --> 22:28:01,142
Chà, chuyện gì đang xảy ra ở đây vậy?

23504
22:28:01,142 --> 22:28:02,832
Điều này có một chút thú vị.

23505
22:28:02,831 --> 22:28:06,031
Vì vậy, trước tiên tôi chọn toàn bộ\ncác chương trình bằng cách thực hiện việc này.

23506
22:28:06,032 --> 22:28:10,652
Chọn ngôi sao từ các chương trình, trong đó\ntiêu đề giống như dấu chấm hỏi.

23507
22:28:10,652 --> 22:28:15,331
Và sau đó tôi đang sử dụng một số dấu hiệu\nphần trăm từ SQL

23508
22:28:15,331 --> 22:28:17,792
ở cả bên trái và bên phải\nvà tôi đang cắm

23509
22:28:17,792 --> 22:28:20,211
bất kể thông tin đầu vào của người dùng là gì cho q.

23510
22:28:20,211 --> 22:28:22,801
Nếu tôi không dùng like và\nthay vào đó tôi dùng bằng

23511
22:28:22,801 --> 22:28:25,891
Tôi có thể bỏ những\ndấu ngoặc nhọn này, những dấu phần trăm này

23512
22:28:25,892 --> 22:28:29,522
nhưng sau đó nó sẽ phải là một màn trình diễn\n

23513
22:28:29,521 --> 22:28:32,221
nó giống mèo hay giống chó.

23514
22:28:32,221 --> 22:28:35,792
Toàn bộ dòng này trả về cho tôi một\n

23515
22:28:35,792 --> 22:28:38,682
đại diện cho một chương trình trong cơ sở dữ liệu.

23516
22:28:38,682 --> 22:28:41,971
Và sau đó, tôi sẽ chuyển tất cả những thứ đó\n

23517
22:28:41,971 --> 22:28:45,771
Vì vậy chúng ta hãy đi theo\nmẩu bánh mì đó, hãy mở ra hiển thị dấu chấm--

23518
22:28:48,152 --> 22:28:50,331
Được rồi, đây\nlà lúc việc tạo khuôn mẫu trở nên thú vị.

23519
22:28:50,331 --> 22:28:53,031
Vì vậy, tôi vừa trả lại hàng trăm\no kết quả, có thể

23520
22:28:53,032 --> 22:28:56,512
nhưng điều duy nhất tôi\noxuất ra là một danh sách không có thứ tự

23521
22:28:56,512 --> 22:29:00,592
và sử dụng thẻ Jinja for\nloop và li có chứa

23522
22:29:00,592 --> 22:29:02,506
tiêu đề của mỗi chương trình đó.

23523
22:29:02,506 --> 22:29:04,881
Và chỉ để chứng minh rằng đây thực sự là một tập dữ liệu quen thuộc

23524
22:29:04,881 --> 22:29:09,801
và thực ra tôi đã đơn giản hóa nó một chút,\n

23525
22:29:09,801 --> 22:29:14,091
Tôi đã vứt bỏ tất cả những thứ khác như\n

23526
22:29:14,092 --> 22:29:18,832
và ví dụ như tôi chỉ có\nchọn ngôi sao từ các chương trình

23527
22:29:18,831 --> 22:29:21,201
giới hạn 10, chỉ để chúng ta có thể thấy 10 trong số đó.

23528
22:29:21,202 --> 22:29:23,572
Có 10 chương trình\ntừ cơ sở dữ liệu đó.

23529
22:29:23,572 --> 22:29:25,982
Vậy đó là tất cả những gì\ntrong cơ sở dữ liệu.

23530
22:29:25,982 --> 22:29:29,572
Vì vậy, có vẻ như đây là một\nứng dụng web khá đơn giản.

23531
22:29:29,572 --> 22:29:31,607
Nó sử dụng GET, nó gửi\nit đến máy chủ

23532
22:29:31,607 --> 22:29:33,982
máy chủ đưa ra phản hồi\nvà phản hồi đó, sau đó

23533
22:29:33,982 --> 22:29:38,752
trông như thế này, nó rất lớn\n

23534
22:29:40,461 --> 22:29:44,131
Nhưng mọi thứ khác\n đều đến từ một bố cục.html.

23535
22:29:44,131 --> 22:29:46,771
Tất cả nội dung ở\ntrên cùng và ở dưới cùng.

23536
22:29:46,771 --> 22:29:50,781
Được rồi, tuy nhiên hiện nay, chúng ta\n

23537
22:29:50,782 --> 22:29:53,482
Và bạn bắt đầu nhập nội dung nào đó\nvà bạn không cần phải nhấn Gửi

23538
22:29:53,482 --> 22:29:56,357
bạn không cần phải bấm vào nút,\n

23539
22:29:56,357 --> 22:29:58,711
Các ứng dụng web ngày nay\na động hơn nhiều.

23540
22:29:58,711 --> 22:30:01,891
Vì vậy, chúng ta hãy xem\nphiên bản này của thứ này.

23541
22:30:01,892 --> 22:30:07,792
Hãy để tôi vào phần hiển thị\nvà đóng các tab trước đó của tôi

23542
22:30:09,902 --> 22:30:14,601
Và nó gần như giống nhau, nhưng\n

23543
22:30:14,601 --> 22:30:16,625
Tôi đang tải lại biểu mẫu,\nhiện tại không có nút nào.

23544
22:30:16,625 --> 22:30:18,292
Vì vậy, nhu cầu về nút gửi đã không còn nữa.

23545
22:30:18,292 --> 22:30:20,312
Tôi muốn triển khai tính năng tự động hoàn thành ngay bây giờ.

23546
22:30:20,312 --> 22:30:22,912
Vì vậy hãy tiếp tục và\nnhập C. OK, có

23547
22:30:22,911 --> 22:30:25,881
mỗi chương trình bắt đầu\nvới C. A, đều có

23548
22:30:25,881 --> 22:30:27,861
đúng hơn là mọi chương trình đều có C-A trong đó.

23549
22:30:27,861 --> 22:30:31,101
T, có mọi chương trình có C-A-T trong đó.

23550
22:30:31,101 --> 22:30:34,911
Tôi có thể bắt đầu lại và làm điều đó,\n

23551
22:30:34,911 --> 22:30:38,811
Và lưu ý rằng URL của tôi không bao giờ thay đổi,\nkhông có đường dẫn /search

23552
22:30:40,012 --> 22:30:43,652
Với mỗi lần nhấn phím, nó\ntìm kiếm đi tìm lại nhiều lần.

23553
22:30:43,652 --> 22:30:46,282
Đó là một trải nghiệm người dùng, trải nghiệm người dùng tuyệt vời\nvì nó mang lại hiệu quả ngay lập tức.

23554
22:30:46,282 --> 22:30:48,532
Đây là những gì người dùng\nquen dùng ngày nay.

23555
22:30:48,532 --> 22:30:53,392
Nhưng nếu tôi nhìn vào mã nguồn\n

23556
22:30:53,392 --> 22:30:58,615
theo mặc định chỉ có một UL trống nhưng\n

23557
22:30:58,615 --> 22:31:00,032
Vì vậy, hãy xem những gì đang xảy ra ở đây.

23558
22:31:00,032 --> 22:31:03,512
Mã JavaScript này\nis đang thực hiện như sau.

23559
22:31:03,512 --> 22:31:06,472
Hãy để tôi phóng to thêm một chút.

23560
22:31:06,471 --> 22:31:10,853
Mã JavaScript này được\nchọn đầu tiên với bộ chọn truy vấn

23561
22:31:10,854 --> 22:31:13,562
mà bạn đã sử dụng vào tuần trước,\n

23562
22:31:13,562 --> 22:31:15,502
vậy là chỉ nhận được hộp văn bản.

23563
22:31:15,501 --> 22:31:19,136
Sau đó, nó sẽ thêm một trình xử lý sự kiện\n

23564
22:31:19,137 --> 22:31:21,262
Chúng ta đã không nói về điều này\ntuần trước, nhưng theo nghĩa đen thì

23565
22:31:21,262 --> 22:31:23,362
khi bạn cung cấp bất kỳ\nloại thông tin đầu vào nào bằng cách nhập

23566
22:31:23,361 --> 22:31:27,861
bằng cách dán, bằng bất kỳ cơ chế giao diện\nngười dùng nào khác

23567
22:31:27,861 --> 22:31:29,671
nó kích hoạt một sự kiện gọi là đầu vào.

23568
22:31:29,672 --> 22:31:31,732
Tương tự như bấm phím hoặc nhấn phím lên.

23569
22:31:31,732 --> 22:31:35,542
Sau đó tôi có một chức năng, đừng lo lắng\n

23570
22:31:35,542 --> 22:31:37,244
Vậy thì tôi phải làm gì bên trong này?

23571
22:31:37,244 --> 22:31:39,202
Được rồi, đây là\nmới và đây là phần

23572
22:31:39,202 --> 22:31:41,872
chúng ta hãy chỉ tập trung vào\nideas chứ không phải cú pháp.

23573
22:31:41,872 --> 22:31:43,762
JavaScript, ngày nay,\nđi kèm với một hàm

23574
22:31:43,762 --> 22:31:48,051
được gọi là tìm nạp cho phép bạn\n

23575
22:31:48,051 --> 22:31:49,861
mà không cần tải lại toàn bộ trang.

23576
22:31:49,861 --> 22:31:52,371
Bạn có thể bí mật\nthực hiện việc đó bên trong trang.

23577
22:31:53,691 --> 22:31:59,031
gạch chéo dấu chấm hỏi tìm kiếm q bằng\n

23578
22:31:59,032 --> 22:32:03,082
Khi tôi nhận được phản hồi, tôi muốn\n

23579
22:32:03,081 --> 22:32:05,331
và lưu trữ nó trong một biến gọi là shows.

23580
22:32:05,331 --> 22:32:08,001
Và tôi đang cố tình nhảy quanh, bỏ qua những từ đặc biệt

23581
22:32:08,001 --> 22:32:11,361
giống như chờ đợi và chờ đợi ở đây, nhưng đối với\n

23582
22:32:11,361 --> 22:32:14,601
Đã có phản hồi từ\n

23583
22:32:14,601 --> 22:32:16,432
lưu trữ nó trong một biến gọi là shows.

23584
22:32:17,691 --> 22:32:22,461
Tôi đang sử dụng bộ chọn truy vấn để chọn\n

23585
22:32:22,461 --> 22:32:26,721
và tôi đang thay đổi HTML bên trong của nó\nđể bằng với các chương trình

23586
22:32:29,572 --> 22:32:32,402
Một lần nữa, đây là nơi các công cụ dành cho nhà phát triển khá mạnh mẽ.

23587
22:32:32,402 --> 22:32:36,652
Hãy để tôi tiếp tục và tải lại\ntrang này để loại bỏ mọi thứ.

23588
22:32:36,652 --> 22:32:39,952
Và bây giờ hãy để tôi mở ra kiểm tra.

23589
22:32:39,952 --> 22:32:43,292
Hãy để tôi đi tới tab Mạng và\n

23590
22:32:43,292 --> 22:32:44,542
giữa trình duyệt của tôi và máy chủ.

23591
22:32:44,542 --> 22:32:49,221
Tôi sẽ tìm kiếm C. Lưu ý rằng\n

23592
22:32:54,202 --> 22:32:57,812
Vậy là tôi thậm chí còn chưa ăn hết con mèo của mình\n

23593
22:32:57,812 --> 22:33:02,662
Có rất nhiều tiêu đề phản hồi, nhưng hãy\n

23594
22:33:02,661 --> 22:33:07,311
Đây thực sự là phản hồi từ\n

23595
22:33:07,312 --> 22:33:10,372
Không có UL, không có HTML, không\ntiêu đề, không có nội dung, không có gì cả.

23596
22:33:11,452 --> 22:33:12,961
Và chúng tôi thực sự có thể mô phỏng điều này.

23597
22:33:12,961 --> 22:33:17,122
Hãy để tôi truy cập theo cách thủ công\ncùng một URL đó, q=c, Enter.

23598
22:33:17,122 --> 22:33:19,131
Chúng ta sắp quay lại--

23599
22:33:20,572 --> 22:33:25,432
gạch chéo tìm kiếm q bằng c, chúng ta là\n

23600
22:33:25,432 --> 22:33:27,892
mà nếu tôi xem nguồn thì\nnó thậm chí không phải là một trang web hoàn chỉnh.

23601
22:33:27,892 --> 22:33:31,312
Trình duyệt đang cố hiển thị nó cho tôi\n

23602
22:33:31,312 --> 22:33:33,862
nhưng nó thực sự chỉ là một phần HTML.

23603
22:33:33,861 --> 22:33:36,471
Nhưng điều đó thật hoàn hảo,\nvì đây thực sự là

23604
22:33:36,471 --> 22:33:39,381
những gì về cơ bản tôi muốn mã\nPython của tôi sao chép và dán

23605
22:33:39,381 --> 22:33:42,471
vào thẻ UL trống.

23606
22:33:42,471 --> 22:33:46,822
Và đó chính là điều mà JavaScript\ncode này đang thực hiện ở đây.

23607
22:33:46,822 --> 22:33:51,111
Khi nó nhận được phản hồi từ\n

23608
22:33:51,111 --> 22:33:56,131
để cắm tất cả những li đó vào UL sau khi thực tế.

23609
22:33:56,131 --> 22:33:58,491
Một lần nữa, thay đổi cái gọi là dom.

23610
22:33:58,491 --> 22:34:01,461
Nhưng có một cách tốt hơn một chút\n

23611
22:34:02,932 --> 22:34:07,252
Bởi vì nếu bạn có một trăm buổi biểu diễn hoặc\n

23612
22:34:08,211 --> 22:34:10,851
Tại sao tôi cần gửi tất cả những thẻ HTML ngu ngốc này?

23613
22:34:10,851 --> 22:34:13,952
Tại sao tôi không tạo những thứ đó\nkhi tôi đã sẵn sàng tạo chúng?

23614
22:34:13,952 --> 22:34:15,682
Vâng, đây là sự khởi sắc cuối cùng.

23615
22:34:15,682 --> 22:34:18,232
Bất cứ khi nào tạo một ứng dụng web ngày nay

23616
22:34:18,232 --> 22:34:22,402
nơi máy khách và máy chủ tiếp tục nói chuyện\n

23617
22:34:22,402 --> 22:34:25,191
Gmail thực hiện điều này, theo đúng nghĩa đen\nmọi ứng dụng thú vị

23618
22:34:25,191 --> 22:34:27,531
ngày nay bạn tải trang\n một lần và sau đó nó

23619
22:34:27,532 --> 22:34:29,302
tiếp tục tương tác\nvới bạn mà không có bạn

23620
22:34:29,301 --> 22:34:31,971
tải lại hoặc phải thay đổi URL.

23621
22:34:31,971 --> 22:34:36,471
Thực tế chúng ta hãy sử dụng một định dạng có tên\n

23622
22:34:36,471 --> 22:34:39,561
nghĩa là chỉ có một\ntốt hơn, hiệu quả hơn, tốt hơn

23623
22:34:39,562 --> 22:34:42,152
cách được thiết kế để gửi cùng một dữ liệu.

23624
22:34:42,152 --> 22:34:46,432
Bây giờ tôi sẽ tham gia chương trình\nhai và chạy Flask.

23625
22:34:46,432 --> 22:34:48,172
Và tôi sẽ quay lại\ntrang của tôi ở đây.

23626
22:34:48,172 --> 22:34:52,522
Giao diện người dùng hoàn toàn giống nhau,\n

23627
22:34:52,521 --> 22:34:56,551
Đây là C, C-A, C-A-T, v.v.

23628
22:34:56,551 --> 22:34:59,031
Nhưng bây giờ hãy xem điều gì sẽ quay trở lại.

23629
22:34:59,032 --> 22:35:09,152
Nếu tôi truy cập /search?q=cat, Enter, thông báo\n

23630
22:35:09,152 --> 22:35:12,622
Nhưng việc nó\nnhỏ gọn như vậy thực sự là một điều tốt.

23631
22:35:12,622 --> 22:35:16,372
Điều này thực sự sẽ-- hãy để\n

23632
22:35:17,452 --> 22:35:20,752
Đây là cái được gọi là\nKý hiệu đối tượngJavaScript.

23633
22:35:20,751 --> 22:35:26,541
Trong JavaScript, một góc-- một hình vuông\n

23634
22:35:26,542 --> 22:35:32,542
Trong JavaScript, dấu ngoặc nhọn cho biết\n

23635
22:35:36,782 --> 22:35:42,772
Đúng, bây giờ bạn có thể nhớ lại điều đó\n

23636
22:35:42,771 --> 22:35:45,122
ký hiệu sử dụng dấu hai chấm như thế này.

23637
22:35:45,122 --> 22:35:48,711
Câu chuyện dài quá, khó hiểu\nas, điều này dành cho bạn và tôi

23638
22:35:48,711 --> 22:35:52,072
và không thân thiện với con người lắm,\nit lại rất thân thiện với máy móc.

23639
22:35:52,072 --> 22:35:55,792
Bởi vì với mọi\ntiêu đề trong cơ sở dữ liệu đó

23640
22:35:55,792 --> 22:36:01,562
Tôi lấy lại ID và tiêu đề của nó,\n

23641
22:36:01,562 --> 22:36:05,632
Và đây là một định dạng rất chung chung\n

23642
22:36:05,631 --> 22:36:07,101
giao diện, có thể quay trở lại với bạn.

23643
22:36:07,101 --> 22:36:09,141
Và đây là cách hoạt động của các API ngày nay.

23644
22:36:09,142 --> 22:36:13,882
Bạn lấy lại dữ liệu văn bản rất thô ở định dạng này, định dạng JSON

23645
22:36:13,881 --> 22:36:17,601
và sau đó bạn có thể viết mã\thực sự biến thành lập trình

23646
22:36:17,601 --> 22:36:22,292
dữ liệu JSON đó sang bất kỳ ngôn ngữ nào\nbạn muốn, chẳng hạn như HTML.

23647
22:36:22,292 --> 22:36:25,252
Đây là phiên bản\nthứ ba và cuối cùng của chương trình này.

23648
22:36:29,631 --> 22:36:32,452
Sau đó, khi tôi nhận được thông tin đầu vào,\nhãy gọi hàm này.

23649
22:36:32,452 --> 22:36:38,991
Tôi lấy dấu gạch chéo tìm kiếm q bằng bất cứ thứ gì\n

23650
22:36:38,991 --> 22:36:41,955
Sau đó tôi đợi phản hồi,\nnhưng thay vì nhận được tin nhắn

23651
22:36:41,955 --> 22:36:44,872
Tôi đang gọi hàm này là hàm khác\n

23652
22:36:44,872 --> 22:36:47,092
được gọi là JSON, nó chỉ phân tích cú pháp đó.

23653
22:36:47,092 --> 22:36:51,232
Nó biến nó thành một cuốn từ điển đối với tôi,\n

23654
22:36:51,232 --> 22:36:53,572
và lưu trữ nó trong một\nbiến được gọi là shows.

23655
22:36:53,572 --> 22:36:57,831
Và đây là nơi bạn bắt đầu thấy\n

23656
22:36:57,831 --> 22:37:01,161
Hãy để tôi khởi tạo một biến có tên\n

23657
22:37:01,161 --> 22:37:03,961
sử dụng dấu ngoặc đơn, nhưng tôi\ncũng có thể sử dụng dấu ngoặc kép.

23658
22:37:03,961 --> 22:37:06,232
Đây là cú pháp JavaScript cho một vòng lặp.

23659
22:37:06,232 --> 22:37:10,101
Hãy để tôi lặp lại mọi\nID trong danh sách của chương trình

23660
22:37:10,101 --> 22:37:13,881
mà tôi vừa quay lại máy chủ,\nmột khối dữ liệu JSON lớn.

23661
22:37:13,881 --> 22:37:19,191
Hãy để tôi tạo một biến tên là\n

23662
22:37:19,191 --> 22:37:21,652
tiêu đề của chương trình tại ID đó.

23663
22:37:21,652 --> 22:37:23,661
Nhưng vì những lý do mà chúng ta sẽ\nquay lại, hãy để tôi

23664
22:37:23,661 --> 22:37:25,581
thay thế một vài nhân vật đáng sợ.

23665
22:37:25,581 --> 22:37:31,671
Sau đó để tôi tự động thêm vào này\n

23666
22:37:33,232 --> 22:37:35,991
Và cuối cùng,\nsau vòng lặp for này

23667
22:37:35,991 --> 22:37:42,081
hãy để tôi cập nhật các UL trong HTML của chúng ta thành\n

23668
22:37:42,081 --> 22:37:44,661
Vì vậy, tóm lại, đừng lo lắng\nquá nhiều về cú pháp

23669
22:37:44,661 --> 22:37:47,119
bởi vì bạn sẽ không cần sử dụng\ncái này trừ khi bạn bắt đầu chơi

23670
22:37:47,119 --> 22:37:49,231
với các tính năng nâng cao hơn khá sớm.

23671
22:37:49,232 --> 22:37:51,202
Nhưng điều chúng tôi đang làm là,\nvới JavaScript, chúng tôi

23672
22:37:51,202 --> 22:37:54,122
tạo ra một chuỗi HTML ngày càng lớn hơn\nand lớn hơn

23673
22:37:54,122 --> 22:37:57,562
chứa tất cả các dấu ngoặc mở,\n

23674
22:37:57,562 --> 22:38:00,922
nhưng chúng tôi chỉ lấy dữ liệu\nraw từ máy chủ.

23675
22:38:00,922 --> 22:38:02,932
Và trên thực tế, trong\nbài toán tập hợp chín, bạn

23676
22:38:02,932 --> 22:38:06,652
sẽ sử dụng thế giới thực thứ ba\n

23677
22:38:06,652 --> 22:38:08,092
giao diện mà bạn đăng ký.

23678
22:38:08,092 --> 22:38:10,851
Dữ liệu bạn sắp lấy\ntừ API đó không phải là dữ liệu

23679
22:38:10,851 --> 22:38:14,301
sẽ là tiêu đề chương trình, nhưng\thực ra là giá cổ phiếu và cổ phiếu

23680
22:38:14,301 --> 22:38:17,042
ký hiệu cổ phiếu và giá cuối cùng--

23681
22:38:17,042 --> 22:38:19,072
tại thời điểm cổ phiếu\nđược mua hoặc bán lần cuối

23682
22:38:19,072 --> 22:38:21,880
và bạn sẽ lấy lại\ndữ liệu đó ở định dạng JSON.

23683
22:38:21,880 --> 22:38:24,922
Và bạn sẽ viết một chút\n

23684
22:38:24,922 --> 22:38:27,992
tới HTML cần thiết trên trang.

23685
22:38:27,991 --> 22:38:31,281
Vì vậy, kết quả cuối cùng ở đây\ntheo nghĩa đen là loại tự động hoàn thành

23686
22:38:31,282 --> 22:38:33,652
mà bạn và tôi nhìn thấy và\ncoi như điều hiển nhiên mỗi ngày

23687
22:38:33,652 --> 22:38:35,812
và đó cuối cùng là cách nó hoạt động.

23688
22:38:35,812 --> 22:38:39,442
HTML và CSS được sử dụng để trình bày\ndữ liệu, cái gọi là chế độ xem của bạn.

23689
22:38:39,441 --> 22:38:43,861
Python có thể được sử dụng để gửi hoặc\n

23690
22:38:43,861 --> 22:38:46,131
Và cuối cùng, JavaScript\nis sẽ được sử dụng

23691
22:38:46,131 --> 22:38:48,519
để làm cho mọi thứ trở nên năng động và có tính tương tác.

23692
22:38:48,519 --> 22:38:50,601
Vì vậy tôi biết đó là cả\ncác khối xây dựng

23693
22:38:50,601 --> 22:38:53,394
nhưng toàn bộ vấn đề đã được đặt ra\n

23694
22:38:53,394 --> 22:38:55,911
tạo tiền đề cho một\ndự án cuối cùng rất thành công.

23695
22:38:55,911 --> 22:38:58,161
Tại sao chúng ta không tiếp tục và\nkết thúc ở đó, rồi chúng ta sẽ xem

23696
22:38:58,161 --> 22:39:01,372
bạn lần cuối cùng vào tuần tới để có biểu tượng cảm xúc.


