1 00:00:00,000 --> 00:00:02,270 >> [Review: แบบทดสอบ 1] 2 00:00:02,270 --> 00:00:04,620 [อาลี Nahm, Oreoluwa Barbarinsa ลูคัสตาร็อบโบว์] [ฮาร์วาร์มหาวิทยาลัย] 3 00:00:04,620 --> 00:00:07,660 [นี้เป็น CS50.] [CS50.TV] 4 00:00:07,660 --> 00:00:11,610 [ลูคัสตา] ยินดีต้อนรับทุกท่าน นี่คือการทบทวนเพื่อการตอบคำถามที่ 1 5 00:00:11,610 --> 00:00:15,040 เช่นเดียวกับการปฏิเสธความรับผิดชอบนี้ - ผมหมายความว่าเรากำลังจะพยายามที่จะครอบคลุม 6 00:00:15,040 --> 00:00:17,770 วัสดุมากที่สุดเท่าที่เป็นไปได้ แต่ที่ไม่ได้หมายความว่า 7 00:00:17,770 --> 00:00:20,780 เรากำลังจะครอบคลุมทุกสิ่งที่สามารถในการตอบคำถามที่ 1 8 00:00:20,780 --> 00:00:25,270 เพื่อให้แน่ใจว่าคุณยังจะดูที่การบรรยายส่วนทุกอย่างที่คุณสามารถ 9 00:00:25,270 --> 00:00:28,240 คำถามที่ 1 เป็นไปได้ในวันพุธที่วันพุธ 10 00:00:28,240 --> 00:00:33,800 เพื่อให้แน่ใจว่าการศึกษา มันเป็นไปได้สวยมากเช่นเดียวกับการทดสอบครั้งแรก 11 00:00:33,800 --> 00:00:36,390 เกี่ยวกับรูปแบบของมัน แต่ก็อาจเป็นไปได้ยากมาก 12 00:00:36,390 --> 00:00:39,600 อย่างน้อยเมื่อปีที่แล้วผมเอา 50, ฉันคิดว่ามันเป็นสิ่งที่ยากมาก 13 00:00:39,600 --> 00:00:42,410 ดังนั้นการศึกษาจำนวนมาก 14 00:00:42,410 --> 00:00:45,190 >> ฉันจะครอบคลุมโครงสร้างข้อมูลและการเข้ารหัส Huffman 15 00:00:45,190 --> 00:00:47,910 นี่คือสิ่งที่คนจำนวนมากคิดว่าเป็นที่ซับซ้อน 16 00:00:47,910 --> 00:00:51,930 แต่ฉันจะพยายามที่จะทำให้มันเป็นไปอย่างง่ายดาย 17 00:00:51,930 --> 00:00:56,330 แรกของทุกสิ่งที่เราต้องการพวกคุณจะรู้ว่าสำหรับการตอบคำถามที่ 1 คือการ 18 00:00:56,330 --> 00:01:00,970 เข้าใจคำอธิบายแนวความคิดของแต่ละโครงสร้างข้อมูลที่ผมจะนำเสนอ 19 00:01:00,970 --> 00:01:03,960 นั่นหมายความว่าคุณไม่จำเป็นต้องจริง 20 00:01:03,960 --> 00:01:07,020 ใช้ตารางแฮชในการตอบคำถามของคุณ 1 21 00:01:07,020 --> 00:01:10,250 เราไม่ต้องการให้คุณที่จะใช้ตารางแฮชทั้งบางทีเราจะพยายาม 22 00:01:10,250 --> 00:01:13,090 ที่จะทำให้คุณใช้ฟังก์ชั่นบางอย่าง 23 00:01:13,090 --> 00:01:16,940 การดำเนินงานที่พบมากที่สุด แต่เราจะไม่ให้คุณใช้ทุกอย่าง 24 00:01:16,940 --> 00:01:21,010 ดังนั้นจึงเป็นสิ่งสำคัญที่คุณเข้าใจแนวคิดที่อยู่เบื้องหลังโครงสร้างข้อมูลแต่ละ 25 00:01:21,010 --> 00:01:23,510 และยังให้คุณสามารถที่จะรหัสใน C 26 00:01:23,510 --> 00:01:27,880 เพียงแค่การดำเนินงานที่พบมากที่สุดที่พวกเขามีโครงสร้างข้อมูลแต่ละ 27 00:01:27,880 --> 00:01:30,090 และยังสามารถตรวจสอบตัวชี้และ structs, 28 00:01:30,090 --> 00:01:33,470 เพราะพวกเขาปรากฏมากในโครงสร้างข้อมูลเหล่านี้ 29 00:01:33,470 --> 00:01:37,380 รายการ >> แรกที่เชื่อมโยง รายการที่เชื่อมโยงเป็นจริงคล้ายกับอาร์เรย์ 30 00:01:37,380 --> 00:01:39,930 แต่ความแตกต่างระหว่างรายการที่เชื่อมโยงและอาเรย์, 31 00:01:39,930 --> 00:01:45,160 แรกของทั้งหมดคือรายการที่เชื่อมโยงมีขนาดความยืดหยุ่นมาก 32 00:01:45,160 --> 00:01:50,060 ในขณะที่ในอาร์เรย์ที่คุณต้องเลือกอย่างใดอย่างหนึ่งที่มีขนาดใหญ่มากสำหรับอาร์เรย์ 33 00:01:50,060 --> 00:01:53,710 เพื่อให้คุณรู้ว่าคุณจะสามารถที่จะเก็บข้อมูลทั้งหมดของคุณในแถวที่ 34 00:01:53,710 --> 00:01:59,370 หรือคุณต้องใช้ malloc ที่จะมีระยะเวลาที่มีความยืดหยุ่นของอาร์เรย์ 35 00:01:59,370 --> 00:02:03,680 ในรายการที่เชื่อมโยงเป็นเรื่องง่ายมากที่จะได้รับเพียงแค่องค์ประกอบเพิ่มเติม 36 00:02:03,680 --> 00:02:07,210 ใส่องค์ประกอบมากขึ้นในรายการที่เชื่อมโยงหรือลบองค์ประกอบ 37 00:02:07,210 --> 00:02:09,370 และอันที่จริงถ้าคุณไม่ต้องการรายการที่เชื่อมโยงที่จะเรียงลำดับ 38 00:02:09,370 --> 00:02:13,950 คุณสามารถค้นหาและลบองค์ประกอบในเวลาคงที่ 39 00:02:13,950 --> 00:02:16,800 ดังนั้น O (1) เวลาจึงเป็นความสะดวกสบายมาก 40 00:02:16,800 --> 00:02:20,660 คุณเพียงแค่จะต้องระมัดระวังที่จะจำไว้เสมอเพื่อ malloc และฟรีโหนด, 41 00:02:20,660 --> 00:02:25,510 เพียงเพราะถ้าคุณทำไม่ได้คุณจะมีการรั่วไหลของหน่วยความจำ 42 00:02:25,510 --> 00:02:31,480 รายการเชื่อมโยงเพื่อ - นิยามของโหนดเป็นเช่นเดียวกับสิ่งที่เรามีอยู่ที่นั่น 43 00:02:31,480 --> 00:02:35,110 ฉันใส่ int n, แต่คุณสามารถจัดเก็บข้อมูลที่คุณต้องการ 44 00:02:35,110 --> 00:02:37,280 ดังนั้นหากคุณต้องการที่จะเก็บสตริงก็ปรับ 45 00:02:37,280 --> 00:02:41,690 ถ้าคุณต้องการที่จะเก็บ struct ก็ปรับสองสิ่งที่คุณต้องการ 46 00:02:41,690 --> 00:02:44,630 ฉันเพียงแค่ใส่ int n ตัวอย่างที่นี่ 47 00:02:44,630 --> 00:02:46,800 และคุณมีตัวชี้ไปยังโหนดถั​​ดไป 48 00:02:46,800 --> 00:02:51,940 ดังนั้นโดยทั่วไปรายการที่เชื่อมโยงมีข้อมูลบางส่วนและจากนั้นชี้ไปยังโหนดถั​​ดไป 49 00:02:51,940 --> 00:02:56,710 ถ้ามันเป็นองค์ประกอบสุดท้ายในรายการที่เชื่อมโยงก็จะชี้ไปที่ NULL 50 00:02:56,710 --> 00:02:59,060 ดังนั้นนี่คือตัวอย่างของรายการที่เชื่อมโยง 51 00:02:59,250 --> 00:03:05,960 >> Okay ดังนั้นตอนนี้เรามาดูสิ่งที่เราควรทำอย่างไรถ้าฉันต้องการแทรกองค์ประกอบในรายการที่เชื่อมโยง 52 00:03:05,960 --> 00:03:08,810 ขั้นแรกให้ใส่ฟังก์ชั่นจะเป็นชนิดเป็นโมฆะ 53 00:03:08,810 --> 00:03:11,350 เพราะผมไม่ต้องการที่จะกลับอะไร 54 00:03:11,350 --> 00:03:14,200 และฉันจะใช้ int เป็นอาร์กิวเมนต์ 55 00:03:14,200 --> 00:03:17,090 เพราะผมต้องการที่จะรู้ว่าสิ่งที่ฉันต้องการที่จะแทรก 56 00:03:17,090 --> 00:03:21,840 ดังนั้นสิ่งที่เป็นสิ่งแรกที่ฉันควรทำอย่างไร ดีฉันควร malloc ใน newnode, 57 00:03:21,840 --> 00:03:24,240 เพื่อให้เป็นบรรทัดแรก 58 00:03:24,240 --> 00:03:27,580 ฉันเพียงแค่การสร้างโหนดใหม่จะใส่ในรายการที่เชื่อมโยง 59 00:03:27,580 --> 00:03:32,360 ดังนั้นสิ่งที่ฉันจะทำอย่างไร ดีเรารู้ว่าในการใช้งานของเราในรายการที่เชื่อมโยง 60 00:03:32,360 --> 00:03:38,180 ในชั้นเรียนของเรามักจะใส่หัวเป็นตัวแปรทั่วโลก 61 00:03:38,180 --> 00:03:41,800 ดังนั้นสิ่งที่เราสามารถทำได้คือการเปลี่ยนหัว 62 00:03:41,800 --> 00:03:44,300 ฉันจะทำให้โหนดใหม่นี้เป็นหัวหน้าใหม่ 63 00:03:44,300 --> 00:03:46,670 และก็จะชี้ไปที่หัวก่อนหน้านี้ 64 00:03:46,670 --> 00:03:50,390 วิธีที่เราสามารถทำเช่นนั้น สิ่งแรกที่ผมต้องทำ 65 00:03:50,390 --> 00:03:54,770 คือการเปลี่ยน 'n' ในโหนดใหม่สู่ 66 00:03:54,770 --> 00:03:57,530 ซึ่งได้รับการส่งผ่านไปยังฟังก์ชั่น 67 00:03:57,530 --> 00:04:01,050 แล้ว newnode ต่อไปจะเป็นหัว 68 00:04:01,050 --> 00:04:05,800 หัวเป็นไปได้ newnode ดังนั้นจึงเป็นเรื่องง่ายสวย 69 00:04:05,800 --> 00:04:10,090 สำหรับการลบโหนดที่เราสามารถทำมันได้เช่น - 70 00:04:10,090 --> 00:04:14,790 วิธีหนึ่งที่เราจะทำคือการพูดว่า 71 00:04:14,790 --> 00:04:18,160 โอเคถ้าผมต้องการที่จะลบเช่น, 3, 72 00:04:18,160 --> 00:04:24,850 สิ่งที่ผมจะทำคือเพียงแค่ชี้โหนดก่อนหน้า 73 00:04:24,850 --> 00:04:27,580 ไปโหนดถั​​ดไปจาก 3 74 00:04:27,580 --> 00:04:29,400 ดังนั้นผมก็จะทำสิ่งที่ต้องการที่ 75 00:04:29,400 --> 00:04:33,400 แต่สิ่งที่เป็นปัญหากับการทำว่า? 76 00:04:33,400 --> 00:04:37,400 ฉันมีหน่วยความจำรั่วดังนั้นผมจึงไม่ได้มีการเข้าถึงไปยังหมายเลข 3 อีกต่อไป 77 00:04:37,400 --> 00:04:42,480 ปัญหาเกี่ยวกับการที่เป็นที่ฉันไม่ได้ไปเพื่อให้สามารถที่จะเป็นอิสระโหนดที่ 78 00:04:42,480 --> 00:04:45,360 ฉันจะมีหน่วยความจำรั่วและ (อ่านไม่ออก) จะเกลียดฉัน 79 00:04:45,360 --> 00:04:49,370 ดังนั้นแทนที่จะทำเช่นนั้นผมอาจจะมีตัวชี้ชั่วคราว 80 00:04:49,370 --> 00:04:53,210 ดังนั้นผมจึงใส่ชั่วคราว มันเป็นไปที่จะชี้ไปยังโหนดที่ฉันต้องการที่จะลบ 81 00:04:53,210 --> 00:04:58,170 แล้วฉันจะย้ายโหนดก่อนหน้านี้เพื่อชี้ไปที่โหนดถั​​ดไป 82 00:04:58,170 --> 00:05:00,390 ของโหนดที่ฉันต้องการที่จะลบ 83 00:05:00,390 --> 00:05:02,730 และในที่สุดผมสามารถฟรีตัวชี้ 84 00:05:02,730 --> 00:05:07,480 ฉันต้องปลดปล่อยตัวชี้ที่ฉันสร้างขึ้นที่นั่นหรือไม่ 85 00:05:07,480 --> 00:05:09,560 ฉันไม่จำเป็นต้องเพียงเพราะ - 86 00:05:09,560 --> 00:05:13,430 ความแตกต่างคือโหนดนี้ถูกสร้างโดยใช้ malloc, 87 00:05:13,430 --> 00:05:17,280 ดังนั้นจึงเป็นเรื่องในกองขณะที่หนึ่งนี้มีการประกาศเช่นเดียวกับสวิทช์โมฆะในกอง 88 00:05:17,280 --> 00:05:20,000 ดังนั้นผมจึงไม่จำเป็นต้องเป็นอิสระ 89 00:05:20,000 --> 00:05:22,030 เอาล่ะ >> ดังนั้นตอนนี้เราจะมาพูดคุยเกี่ยวกับกอง 90 00:05:22,030 --> 00:05:24,680 กองอยู่ที่ตรงไปตรงสวย 91 00:05:24,680 --> 00:05:29,540 เราได้กองและรอคิวอยู่ในระดับเพียงแค่ใช้อาร์เรย์ 92 00:05:29,540 --> 00:05:32,820 แต่คุณควรจะคุ้นเคย - เพียงแค่จะตระหนักถึง 93 00:05:32,820 --> 00:05:40,740 ที่คุณยังสามารถทำกองอยู่ในคิวใช้รายการการเชื่อมโยงเช่นกัน 94 00:05:40,740 --> 00:05:44,460 ดังนั้นหากคุณมีอาร์เรย์สิ่งที่จะเป็นกองหรือไม่ 95 00:05:44,460 --> 00:05:46,810 สแต็คเป็นครั้งแรกจะต้องมีขนาด 96 00:05:46,810 --> 00:05:49,950 คุณมีการจัดเก็บสิ่งที่เป็นขนาดของสแต็คที่คุณมีในขณะนี้ 97 00:05:49,950 --> 00:05:52,980 และคุณจะมีอาร์เรย์ในกรณีของตัวเลขนี้ 98 00:05:52,980 --> 00:05:55,120 แต่ถ้าคุณต้องการที่จะสามารถอาร์เรย์ 99 00:05:55,120 --> 00:06:00,380 ของสตริงอาร์เรย์ของโครงสร้างสิ่งที่คุณต้องการในการจัดเก็บ 100 00:06:00,380 --> 00:06:03,240 เกี่ยวกับสแต็ค: ความแตกต่างระหว่างกองและรายการที่เชื่อมโยง 101 00:06:03,240 --> 00:06:08,590 ที่อยู่ในกองคุณมีการเข้าถึงองค์ประกอบสุดท้ายที่ถูกขังอยู่ในกองเท่านั้น 102 00:06:08,590 --> 00:06:11,770 มันเรียกว่าสุดท้ายในครั้งแรกออก 103 00:06:11,770 --> 00:06:15,090 เช่นเดียวกับที่คุณมีสแต็คของถาด, 104 00:06:15,090 --> 00:06:17,670 ถ้าคุณใส่ถาดด้านบนของกองที่ 105 00:06:17,670 --> 00:06:22,670 คุณต้องเอาถาดที่แรกที่จะมีการเข้าถึงถาดอื่น ๆ 106 00:06:22,670 --> 00:06:26,310 มันเป็นสิ่งเดียวกันกับกอง 107 00:06:26,310 --> 00:06:31,220 ดังนั้นถ้าผมต้องการที่จะยกตัวอย่างเช่นการเพิ่มองค์ประกอบไปยังกองสิ่งที่ฉันควรทำอย่างไร 108 00:06:31,220 --> 00:06:34,070 มันเรียกว่าการผลักดันและก็ตรงไปตรงสวย 109 00:06:34,070 --> 00:06:37,130 สิ่งแรกที่คุณต้องทำคือการตรวจสอบถ้าขนาดของสแต็ค 110 00:06:37,130 --> 00:06:40,150 ไม่ได้มากกว่าหรือเท่ากับความจุของสแต็ค 111 00:06:40,150 --> 00:06:45,810 เพราะถ้าคุณอยู่แล้วกับความสามารถเต็มรูปแบบที่คุณไม่สามารถเพิ่มอะไรอีก 112 00:06:45,810 --> 00:06:51,140 แล้วถ้าไม่ได้คุณก็ต้องเพิ่มองค์ประกอบไปยังกอง 113 00:06:51,140 --> 00:06:54,530 และในที่สุดเพิ่มขนาด ดังนั้นจึงเป็นเรื่องตรงไปตรงสวย 114 00:06:54,530 --> 00:06:57,140 ดังนั้นฉันเพียงแค่เพิ่มจำนวน 2 115 00:06:57,140 --> 00:07:00,350 และถ้าผมต้องการที่จะปรากฏซึ่งหมายความว่าฉันต้องการที่จะลบ 116 00:07:00,350 --> 00:07:03,870 องค์ประกอบสุดท้ายที่ถูกเพิ่มเข้ามาและกลับค่าขององค์ประกอบที่ 117 00:07:03,870 --> 00:07:09,180 สิ่งแรกที่ผมต้องตรวจสอบว่าสแต็คไม่ว่างเปล่า 118 00:07:09,180 --> 00:07:11,510 เพราะถ้ามันว่างเปล่าฉันไม่สามารถกลับอะไร 119 00:07:11,510 --> 00:07:14,820 ในกรณีที่ผมกลับ -1 120 00:07:14,820 --> 00:07:18,960 มิฉะนั้นฉันจะพร่องขนาดของข้อมูลจำเพาะที่ 121 00:07:18,960 --> 00:07:22,510 และกลับตัวเลข (s.size) 122 00:07:22,510 --> 00:07:27,230 ทำไมฉันไม่พร่องขนาดและแล้วกลับ s.size? 123 00:07:27,230 --> 00:07:30,930 มันเป็นเพราะในกรณีนี้สเปคมีขนาด 4 124 00:07:30,930 --> 00:07:33,810 และผมต้องการที่จะกลับไปที่สี่องค์ประกอบใช่ไหม 125 00:07:33,810 --> 00:07:36,030 แต่สิ่งที่เป็นดัชนีขององค์ประกอบที่สี่คืออะไร สาม 126 00:07:36,030 --> 00:07:44,510 เพราะผมไม่ขนาด - เป็นไปได้ 3 ผมก็สามารถกลับ s.numbers (s.size) 127 00:07:44,510 --> 00:07:48,410 เพราะมันเป็น 3 จึงเป็นเพียงดัชนี 128 00:07:48,410 --> 00:07:50,380 >> ตอนนี้คิว คิวจะสวยมากในสิ่งเดียวกัน 129 00:07:50,380 --> 00:07:54,950 ความแตกต่างเพียงอย่างเดียวคือแทนที่จะต้องผ่านในครั้งแรกออก 130 00:07:54,950 --> 00:07:57,480 คุณมีครั้งแรกในครั้งแรกออก 131 00:07:57,480 --> 00:07:59,460 อาจถ้าคุณกำลังรอคอยที่จะไปคอนเสิร์ต 132 00:07:59,460 --> 00:08:04,260 คุณจะไม่ได้มีความสุขถ้าคุณมีกองแทนคิว 133 00:08:04,260 --> 00:08:07,730 เป็นคนสุดท้ายที่จะมาจะเป็นคนแรกที่จะเข้าสู่คอนเสิร์ต 134 00:08:07,730 --> 00:08:09,760 คุณอาจจะไม่ได้มีความสุข 135 00:08:09,760 --> 00:08:15,020 ในคิวเป็นคนแรกที่จะได้รับในยังเป็นคนแรกที่จะได้รับการออก 136 00:08:15,020 --> 00:08:18,720 ดังนั้นในความหมายของคิวที่นอกเหนือจากที่มีขนาดในอาร์เรย์ 137 00:08:18,720 --> 00:08:23,360 คุณยังต้องมีหัวซึ่งเป็นดัชนีที่หัวของสแต็ค 138 00:08:23,360 --> 00:08:29,000 ดังนั้นองค์ประกอบแรกในตอนนี้ 139 00:08:29,000 --> 00:08:32,710 enqueue เป็นสิ่งเดียวกับที่ผลักดันให้กอง 140 00:08:32,710 --> 00:08:34,980 ถ้าคุณได้ไร้เดียงสามากคุณก็จะพูดว่า 141 00:08:34,980 --> 00:08:39,289 ดีฉันก็สามารถทำตรงสิ่งเดียวกับผมสำหรับการผลักดัน 142 00:08:39,289 --> 00:08:44,030 ฉันสามารถตรวจสอบว่ามันไม่ได้เกินความจุ 143 00:08:44,030 --> 00:08:48,760 ถ้าเป็นผมกลับเท็จอย่างอื่นผมก็สามารถส่งออกค่าใหม่ 144 00:08:48,760 --> 00:08:50,630 แล้วเพิ่มขนาด 145 00:08:50,630 --> 00:08:52,750 แต่เหตุผลนี้เป็นที่ไม่ถูกต้อง 146 00:08:52,750 --> 00:08:55,010 ลองมาดูตัวอย่างนี้ 147 00:08:55,010 --> 00:08:57,020 ฉันพยายามที่จะ enqueue พวงของสิ่งที่ 148 00:08:57,020 --> 00:08:58,390 แล้วฉันจะ dequeue และ enqueue 149 00:08:58,390 --> 00:09:00,550 มีจำนวนมากของคำสั่ง แต่มันง่ายมาก 150 00:09:00,550 --> 00:09:04,790 ฉันจะ enqueue 5 เพื่อเพิ่ม 5 และ 7 151 00:09:04,790 --> 00:09:09,310 1, 4, 6, และจากนั้นผมต้องการที่จะ dequeue บางสิ่งบางอย่าง 152 00:09:09,310 --> 00:09:12,000 ซึ่งหมายความว่าฉันจะเอาองค์ประกอบแรก 153 00:09:12,000 --> 00:09:14,640 ดังนั้นฉันจะลบหมายเลข 3 ใช่ไหม 154 00:09:14,640 --> 00:09:17,320 องค์ประกอบแรก ถูก 155 00:09:17,320 --> 00:09:21,450 ตอนนี้ถ้าฉันพยายามที่จะ enqueue สิ่งอื่นสิ่งที่จะเกิดขึ้นได้อย่างไร 156 00:09:21,450 --> 00:09:24,290 ตามที่การดำเนินงานของฉัน 157 00:09:24,290 --> 00:09:31,040 ผมจะใส่หมายเลขถัดไปใน q.size ดัชนี 158 00:09:31,040 --> 00:09:35,140 ในกรณีนี้ขนาดคือ 8, 159 00:09:35,140 --> 00:09:38,640 ดังนั้นดัชนีที่ 8 จะได้รับสิทธิที่นี่ในตำแหน่งสุดท้าย 160 00:09:38,640 --> 00:09:43,900 ถ้าฉันพยายามที่จะ enqueue 1 ที่นี่ผมจะเขียนทับตำแหน่งสุดท้าย 161 00:09:43,900 --> 00:09:45,870 จำนวน 1 ซึ่งเป็นสิ่งที่ผิดอย่างสมบูรณ์ 162 00:09:45,870 --> 00:09:49,870 สิ่งที่ฉันต้องการจะทำคือการห่อรอบและไปที่ตำแหน่งแรก 163 00:09:49,870 --> 00:09:52,870 บางทีคุณก็จะบอกว่าดีฉันเพียงแค่มีการตรวจสอบ 164 00:09:52,870 --> 00:09:55,600 ถ้าจริงผมสามารถนำสิ่งที่มี 165 00:09:55,600 --> 00:09:58,560 ถ้าไม่ผมก็บอกว่าโอ้เต็มกำลังการผลิตใหม่ 166 00:09:58,560 --> 00:10:02,010 เป็นจริงความจุ - 1, และคุณไม่สามารถใส่องค์ประกอบที่มี 167 00:10:02,010 --> 00:10:06,150 แต่สิ่งที่เป็นปัญหาได้หรือไม่ ปัญหาคือว่าถ้าฉันเพียงแค่ dequeue ทุกอย่างที่นี่ 168 00:10:06,150 --> 00:10:08,240 แล้วฉันพยายามที่จะเพิ่มอย่างอื่นมันก็จะพูดว่า 169 00:10:08,240 --> 00:10:11,210 ดีคุณอยู่ที่ความจุเต็มซึ่งเป็น 0 170 00:10:11,210 --> 00:10:13,620 ดังนั้นคิวของคุณจะหายไป 171 00:10:13,620 --> 00:10:16,990 คุณต้องห่อรอบและวิธีการห่อรอบ 172 00:10:16,990 --> 00:10:22,040 ที่พวกคุณได้เรียนรู้ใน psets มีวิสัยทัศน์และอื่น ๆ ที่ใช้ mod 173 00:10:22,040 --> 00:10:29,090 คุณสามารถทดลองใช้งานได้ที่บ้านจะเข้าใจว่าทำไมคุณจะทำ q.size + q.head 174 00:10:29,090 --> 00:10:31,080 ความจุ mod แต่ถ้าคุณตรวจสอบที่นี่ 175 00:10:31,080 --> 00:10:34,760 เราจะเห็นว่ามันทำงาน 176 00:10:34,760 --> 00:10:37,760 ดังนั้นในตัวอย่างที่ผ่านมา q.size 8 177 00:10:37,760 --> 00:10:47,590 และหัวเป็น 1 เพราะมันเป็นตำแหน่งนี้ที่นี่ของอาร์เรย์ 178 00:10:47,590 --> 00:10:51,970 ดังนั้นมันจะเป็น 8 + 1, 9 ความจุ Mod 9 จะเป็น 0 179 00:10:51,970 --> 00:10:56,640 มันจะไปที่ดัชนี 0 เราจะอยู่ในตำแหน่งที่เหมาะสม 180 00:10:56,640 --> 00:10:59,750 แล้วลองคิวที่บ้าน 181 00:10:59,750 --> 00:11:04,950 บางสิ่งที่สำคัญพยายามที่จะเข้าใจความแตกต่างระหว่างสแต็คและคิว 182 00:11:04,950 --> 00:11:11,620 ที่บ้านพยายามที่จะได้รับความคุ้นเคยกับการใช้ enqueue, dequeue ดัน, และป๊อป 183 00:11:11,620 --> 00:11:16,560 และยังเข้าใจเมื่อคุณจะใช้ในแต่ละของพวกเขา 184 00:11:16,560 --> 00:11:22,830 >> เพื่อขอผ่อนคลายเป็นเวลา 10 วินาทีมีพวงของ Pokemons 185 00:11:22,830 --> 00:11:26,080 และตอนนี้ขอกลับไปยังโครงสร้างข้อมูล 186 00:11:26,080 --> 00:11:29,770 ตารางแฮช ผู้คนจำนวนมากได้รับการกลัวของตารางแฮช 187 00:11:29,770 --> 00:11:33,650 ปัญหาในการตั้งค่า 6 ตรวจสอบการสะกด 188 00:11:33,650 --> 00:11:35,980 ตารางแฮชและพยายามที่คนจำนวนมากได้กลัวของพวกเขา 189 00:11:35,980 --> 00:11:38,540 พวกเขาคิดว่าพวกเขากำลังดังนั้นยากที่จะเข้าใจ ใช่? 190 00:11:38,540 --> 00:11:41,490 [ร็อบโบว์] ปัญหาชุดที่ 5 >> ปัญหาชุด 5 ใช่ ขอบคุณร็อบ 191 00:11:41,490 --> 00:11:43,370 ใช่ หกเป็นหอบ n 'พัฟใช่ 192 00:11:43,370 --> 00:11:49,340 ปัญหาชุดที่ 5 ได้รับการตรวจสอบการสะกดและคุณต้องใช้อย่างใดอย่างหนึ่งตารางแฮชหรือลอง 193 00:11:49,340 --> 00:11:55,360 ผู้คนจำนวนมากคิดว่าพวกเขาเป็นสุดยากที่จะเข้าใจ แต่พวกเขากำลังจริงง่ายๆสวย 194 00:11:55,360 --> 00:12:01,290 คืออะไรตารางแฮชโดยทั่วไป? ตารางแฮชเป็น array ของรายการเชื่อมโยง 195 00:12:01,290 --> 00:12:06,730 ข้อแตกต่างระหว่างอาร์เรย์และตารางแฮช 196 00:12:06,730 --> 00:12:09,730 ที่อยู่ในตารางแฮชที่คุณมีสิ่งที่เรียกว่าฟังก์ชันแฮช 197 00:12:09,730 --> 00:12:12,080 ฟังก์ชันแฮชคืออะไร 198 00:12:12,080 --> 00:12:13,970 ผมไม่ทราบว่าถ้าพวกคุณสามารถอ่านที่นี่ 199 00:12:13,970 --> 00:12:16,090 นี่คือตัวอย่างของตารางแฮช 200 00:12:16,090 --> 00:12:19,220 ดังนั้นคุณจะเห็นว่าคุณมีอาร์เรย์ที่มี 31 องค์ประกอบ 201 00:12:19,220 --> 00:12:22,440 และสิ่งที่เราทำในตารางแฮชจะมีฟังก์ชันแฮช 202 00:12:22,440 --> 00:12:26,660 ที่เป็นไปในการแปลที่สำคัญแต่ละ int ดัชนี 203 00:12:26,660 --> 00:12:31,740 ถ้ายกตัวอย่างเช่นถ้าผมต้องการที่จะเลือกสำหรับบีแฮร์ริสัน 204 00:12:31,740 --> 00:12:34,190 ฉันจะใส่บีแฮร์ริสันในฟังก์ชันแฮชของฉัน 205 00:12:34,190 --> 00:12:36,960 และฟังก์ชันแฮชจะกลับมา 24 206 00:12:36,960 --> 00:12:40,930 ดังนั้นฉันรู้ว่าฉันต้องการเก็บบีแฮร์ริสันใน 24 207 00:12:40,930 --> 00:12:46,580 เพื่อให้เป็นความแตกต่างระหว่างการมีเพียงแค่อาร์เรย์และมีตารางแฮช 208 00:12:46,580 --> 00:12:48,740 ในตารางแฮชคุณจะมีฟังก์ชั่นที่จะบอกคุณ 209 00:12:48,740 --> 00:12:54,740 ที่ในการจัดเก็บข้อมูลที่คุณต้องการเก็บ 210 00:12:54,740 --> 00:12:57,040 สำหรับฟังก์ชันแฮชที่คุณต้องการที่จะมองหาฟังก์ชันแฮช 211 00:12:57,040 --> 00:13:00,600 ที่กำหนดและมีการกระจาย 212 00:13:00,600 --> 00:13:07,810 ในขณะที่คุณสามารถดูที่นี่คุณจะเห็นว่าจำนวนมากของข้อมูลที่ผมอยากจะเก็บเป็นจริง 19 213 00:13:07,810 --> 00:13:12,470 แทนการใช้ 31 และ 30 และ 29 ซึ่งเป็นฟรีทั้งหมด 214 00:13:12,470 --> 00:13:16,920 ดังนั้นฟังก์ชันแฮชที่ผมใช้ก็ไม่ได้เป็นอย่างดีกระจาย 215 00:13:16,920 --> 00:13:20,710 เมื่อเราพูดกันกระจายก็หมายความว่าเราต้องการที่จะมี 216 00:13:20,710 --> 00:13:26,520 ประมาณอย่างน้อย 1 หรือ 2 สำหรับแต่ละ - 217 00:13:26,520 --> 00:13:32,190 เช่นความแตกต่างของ 1 หรือ 2 สำหรับแต่ละดัชนีในอาร์เรย์ 218 00:13:32,190 --> 00:13:43,950 คุณต้องการที่จะมีประมาณจำนวนเดียวกันขององค์ประกอบในรายการที่เชื่อมโยงในแต่ละแถว 219 00:13:43,950 --> 00:13:48,600 และมันก็เป็นเรื่องง่ายที่จะตรวจสอบว่าเป็นที่ถูกต้องในตารางแฮชให้ดูเป็นตารางแฮช 220 00:13:48,600 --> 00:13:51,770 >> แล้วต้นไม้ นี้เป็นต้นไม้ 221 00:13:51,770 --> 00:13:56,400 ต้นไม้ในวิทยาศาสตร์คอมพิวเตอร์คว่ำลงด้วยเหตุผลบางอย่าง 222 00:13:56,400 --> 00:14:00,150 ดังนั้นที่นี่คุณมีรากของต้นไม้และใบไม้ 223 00:14:00,150 --> 00:14:05,630 คุณก็ควรจะรู้ว่าศัพท์เฉพาะสำหรับผู้ปกครองและเด็ก 224 00:14:05,630 --> 00:14:12,880 แต่ละโหนดมีลูกของตนซึ่งเป็นโหนดที่อยู่ด้านล่างของผู้ปกครอง 225 00:14:12,880 --> 00:14:19,660 ดังนั้นสำหรับตัวอย่างเช่น 2 เป็นไปได้ของผู้ปกครองเป็นเวลา 3 และเด็กอื่น ๆ มีสิทธิ 226 00:14:19,660 --> 00:14:25,290 3 ในขณะที่เป็นไปได้ของผู้ปกครองเป็นเวลา 1 และเด็กคนอื่น ๆ ที่จะมี 227 00:14:25,290 --> 00:14:29,990 และ 1 เป็นไปได้เด็ก 3 และอื่น ๆ 228 00:14:29,990 --> 00:14:34,610 เรามีสิ่งที่น่าสนใจอื่น ๆ อีกมากมายที่เรียกว่าต้นไม้ค้นหาไบนารี 229 00:14:34,610 --> 00:14:39,040 ในการที่ค่าทั้งหมดที่อยู่ด้านขวาของโหนด 230 00:14:39,040 --> 00:14:41,660 เป็นไปได้ทางด้านขวาที่นี่ - ด้านขวา 231 00:14:41,660 --> 00:14:46,780 จะเป็นองค์ประกอบที่ยิ่งใหญ่กว่าในราก 232 00:14:46,780 --> 00:14:49,780 ดังนั้นถ้าฉันมีจำนวน 5 ที่นี่องค์ประกอบทั้งหมดที่อยู่ด้านขวา 233 00:14:49,780 --> 00:14:51,940 เป็นไปได้มากขึ้นกว่า 5 และทางซ้าย 234 00:14:51,940 --> 00:14:56,770 องค์ประกอบทั้งหมดที่เป็นไปได้น้อยกว่า 5 235 00:14:56,770 --> 00:14:58,780 นี่คือเหตุผลที่มีประโยชน์ 236 00:14:58,780 --> 00:15:01,660 ดีถ้าผมต้องการที่จะตรวจสอบว่าหมายเลข 7 ที่นี่ตัวอย่างเช่น 237 00:15:01,660 --> 00:15:05,960 ผมเพิ่งไปที่ 5 ครั้งแรกและฉันจะเห็นคือ 7 มากหรือน้อยกว่า 5? 238 00:15:05,960 --> 00:15:09,540 มันเป็นมากขึ้นดังนั้นฉันรู้ว่ามันเป็นไปได้ที่จะอยู่ทางด้านขวาของต้นไม้ 239 00:15:09,540 --> 00:15:13,980 ดังนั้นผมจึงมีสิ่งที่น้อยมากที่จะมองไปที่ 240 00:15:13,980 --> 00:15:19,520 ในการดำเนินการของต้นไม้ค้นหาแบบไบนารีโหนดฉันแค่จะต้องมีข้อมูล 241 00:15:19,520 --> 00:15:21,750 เพื่อ int n; คุณยังอาจมีสตริง 242 00:15:21,750 --> 00:15:23,630 หรือสิ่งที่คุณต้องการ 243 00:15:23,630 --> 00:15:28,100 คุณเพียงแค่จะต้องระมัดระวังเกี่ยวกับการกำหนดสิ่งที่เป็นมากขึ้นสิ่งที่เป็นน้อย 244 00:15:28,100 --> 00:15:30,390 ดังนั้นถ้าคุณมีสตริงตัวอย่างเช่นคุณสามารถกำหนด 245 00:15:30,390 --> 00:15:34,690 ว่าสิ่งเหล่านั้นทั้งหมดที่อยู่ด้านขวาจะมีความยาวขนาดใหญ่ 246 00:15:34,690 --> 00:15:40,940 ด้านซ้ายจะมีความยาวที่ลดลงจึงเป็นจริงขึ้นอยู่กับคุณ 247 00:15:40,940 --> 00:15:44,930 >> ฉันสามารถใช้วิธีหา BST? 248 00:15:44,930 --> 00:15:47,840 สิ่งแรกที่เราจะต้องทำคือการตรวจสอบถ้ารากเป็นโมฆะ 249 00:15:47,840 --> 00:15:50,920 ถ้าเป็นโมฆะก็หมายความว่าสิ่งที่ไม่ได้มี 250 00:15:50,920 --> 00:15:53,330 เพราะคุณไม่ได้มีต้นไม้ใช่ไหม 251 00:15:53,330 --> 00:15:55,790 ดังนั้นผมจึงกลับเท็จ 252 00:15:55,790 --> 00:15:58,740 มิฉะนั้นฉันจะตรวจสอบว่าเป็นจำนวนที่มากขึ้น 253 00:15:58,740 --> 00:16:01,720 กว่ามูลค่าในราก 254 00:16:01,720 --> 00:16:04,250 ฉันจะพยายามที่จะหาองค์ประกอบทางด้านขวา 255 00:16:04,250 --> 00:16:08,590 ของต้นไม้ 256 00:16:08,590 --> 00:16:11,310 คุณจะเห็นว่าฉันใช้เรียกซ้ำตัวเองที่นี่ 257 00:16:11,310 --> 00:16:14,150 แล้วถ้ามันน้อยกว่าที่ฉันจะไปดูที่ด้านซ้าย 258 00:16:14,150 --> 00:16:18,330 และในที่สุดมิฉะนั้นถ้ามันไม่ได้น้อยหรือไม่ได้มากขึ้น 259 00:16:18,330 --> 00:16:20,660 มันหมายถึงว่ามันเป็นค่าตัวของมันเอง 260 00:16:20,660 --> 00:16:23,010 ดังนั้นฉันเพิ่งกลับจริง 261 00:16:23,010 --> 00:16:26,360 คุณสามารถดูที่นี่ที่ผมใช้ในกรณีที่ถ้าหาก 262 00:16:26,360 --> 00:16:30,820 และจำไว้ว่าในการตอบคำถาม 0, เรามีปัญหาที่มีถ้าถ้าหาก, 263 00:16:30,820 --> 00:16:32,780 และคุณควรจะหาขาดประสิทธิภาพ 264 00:16:32,780 --> 00:16:35,180 และขาดประสิทธิภาพก็คือการที่คุณใช้ในกรณีที่ 265 00:16:35,180 --> 00:16:39,060 คุณควรจะได้ใช้ในกรณีอื่นถ้าหากอื่นและอื่น 266 00:16:39,060 --> 00:16:44,240 ดังนั้นฉันจึงควรใช้อย่างอื่นถ้าและอื่นถ้าและอื่นที่นี่ 267 00:16:44,240 --> 00:16:46,200 ไม่มีใคร - ใช่? 268 00:16:46,200 --> 00:16:51,140 [พูดนักศึกษาไม่ได้ยิน] 269 00:16:51,140 --> 00:16:53,480 นั่นดูวิเศษมาก ดังนั้นเธอจึงบอกว่ามันไม่ได้เรื่อง 270 00:16:53,480 --> 00:16:55,930 เพียงเพราะความไร้ประสิทธิภาพที่เราเคยมีมาก่อน 271 00:16:55,930 --> 00:16:59,550 ก็คือว่าเพราะบางทีถ้าเงื่อนไขบางอย่างเป็นที่น่าพอใจ 272 00:16:59,550 --> 00:17:03,570 เพื่อให้คุณได้ดำเนินการกระทำ แต่แล้วคุณก็จะตรวจสอบทุกเงื่อนไขอื่น ๆ 273 00:17:03,570 --> 00:17:06,319 แต่ในกรณีนี้มันกลับทันทีเพื่อให้มันไม่ได้เรื่อง 274 00:17:06,319 --> 00:17:09,220 ดังนั้นคุณจึงไม่จำเป็นต้องใช้อย่างอื่นถ้า 275 00:17:09,220 --> 00:17:11,740 >> และสุดท้ายขอพูดคุยเกี่ยวกับการพยายาม 276 00:17:11,740 --> 00:17:13,800 ซึ่งเป็นที่ชื่นชอบของทุกคน 277 00:17:13,800 --> 00:17:15,980 ลองเป็นต้นไม้แห่งอาร์เรย์ 278 00:17:15,980 --> 00:17:20,369 มันรวดเร็วมากในการค้นหาค่า แต่จะใช้จำนวนมากของหน่วยความจำ 279 00:17:20,369 --> 00:17:22,530 และก็มักจะกรองคำดังนั้นเมื่อคุณ 280 00:17:22,530 --> 00:17:27,920 ต้องการที่จะใช้ตัวอย่างเช่นผมไม่ทราบเช่นสมุดโทรศัพท์ในโทรศัพท์ของคุณ 281 00:17:27,920 --> 00:17:30,440 และคุณต้องการเพื่อให้สามารถพิมพ์ B 282 00:17:30,440 --> 00:17:32,510 และก็มีชื่อของคนที่มีบี 283 00:17:32,510 --> 00:17:37,960 มันง่ายมากที่จะใช้ว่าการใช้ลองยกตัวอย่างเช่น 284 00:17:37,960 --> 00:17:39,820 วิธีการทำคุณกำหนดโหนดในลองหรือไม่ 285 00:17:39,820 --> 00:17:43,910 คุณเพียงแค่ต้องมีบูลที่เป็นไปได้ is_word 286 00:17:43,910 --> 00:17:48,660 ที่แสดงถึงว่าการใช้ตัวอักษรทั้งหมดก่อนที่โหนดที่ 287 00:17:48,660 --> 00:17:51,920 คุณมีความสามารถที่จะสร้างคำ 288 00:17:51,920 --> 00:17:57,230 แล้วคุณจะมีอาร์เรย์ของตัวชี้ไปยังโหนด 289 00:17:57,230 --> 00:18:03,120 คุณจะเห็นว่าเรามีอาร์เรย์ของโหนดแม่ดังนั้นโหนด * อาร์เรย์ ใช่? 290 00:18:03,120 --> 00:18:06,050 ดังนั้นเรามาดูวิธีที่จะทำงาน สำหรับตรวจสอบการสะกด, 291 00:18:06,050 --> 00:18:08,230 เรามีอาร์เรย์ขององค์ประกอบ 27, 292 00:18:08,230 --> 00:18:12,150 เพราะเรามีตัวอักษรทั้งหมดรวมทั้งเครื่องหมายวรรคตอน 293 00:18:12,150 --> 00:18:17,800 ก่อนที่นี่ฉันแค่จะใช้ 2 เพราะผมต้องการที่จะสามารถที่จะเขียนบนกระดาน 294 00:18:17,800 --> 00:18:20,230 ถูก ดังนั้นนี่คือตัวอย่างของความพยายาม 295 00:18:20,230 --> 00:18:25,600 ถ้าฉันเพียงแค่กำหนดโหนดแรกผมจะมีอาร์เรย์ของ 2 องค์ประกอบ 296 00:18:25,600 --> 00:18:29,290 ที่มี 2 ตัวชี้ไปยังโมฆะดังนั้นฉันเพียงแค่ใส่ '' และ 'b' 297 00:18:29,290 --> 00:18:32,430 และฉันจะมีบูลที่ระบุว่า is_word 298 00:18:32,430 --> 00:18:34,420 มันจะเป็นเท็จสำหรับคนแรก 299 00:18:34,420 --> 00:18:37,370 เพียงเพราะก่อนที่คุณจะไม่ได้มีตัวอักษรใด 300 00:18:37,370 --> 00:18:40,900 ดังนั้นคำว่าว่างไม่ได้เป็นคำ ดังนั้นจึงเป็นเท็จ 301 00:18:40,900 --> 00:18:46,320 ถ้าผมต้องการที่จะเพิ่ม '' ในพจนานุกรมนี้สิ่งที่ผมจะต้องทำอย่างไร 302 00:18:46,320 --> 00:18:49,760 ฉันก็จะต้อง malloc โหนดใหม่สำหรับ '' 303 00:18:49,760 --> 00:18:54,630 แล้วเพิ่มคำที่เป็นจริง 304 00:18:54,630 --> 00:19:00,180 ดังนั้นมันก็แสดงให้เห็นว่ามี '' เป็นไปได้จริง ทำให้รู้สึก 305 00:19:00,180 --> 00:19:04,120 แล้วถ้าผมต้องการที่จะเพิ่ม 'ba' ฉันจะต้อง malloc 1 สำหรับ 'b' 306 00:19:04,120 --> 00:19:07,550 แล้วฉันจะตั้งค่าบูลีนเท็จ 307 00:19:07,550 --> 00:19:10,160 เพราะ 'b' ด้วยตัวเองไม่ได้เป็นคำ 308 00:19:10,160 --> 00:19:13,010 แล้วฉันจะ malloc อีกคนหนึ่งสำหรับ '' ดังนั้น 'ba' 309 00:19:13,010 --> 00:19:16,290 แล้วฉันจะตั้งขึ้นเป็นคำที่เป็นจริง 310 00:19:16,290 --> 00:19:18,950 เพราะ 'ba' เป็นคำที่ 311 00:19:18,950 --> 00:19:21,910 แล้วถ้าผมต้องการดูว่า 'b' ในพจนานุกรมนี้ 312 00:19:21,910 --> 00:19:26,730 ฉันสามารถไปที่คนแรก 'b' ฉันลงไปและฉันมองไปที่เป็นคำและกล่าวเท็จ 313 00:19:26,730 --> 00:19:30,110 ดังนั้นจึงไม่เป็นคำ ถ้าผมต้องการที่จะตรวจสอบ 'ba' 314 00:19:30,110 --> 00:19:38,010 ผมไปคนแรก, 'b' และจากนั้นไปที่ '' และฉันเห็นจริงจึงเป็นคำ ทำให้รู้สึก 315 00:19:38,010 --> 00:19:41,950 ผู้คนจำนวนมากได้รับการสับสนโดยพยายาม ไม่ได้หรือไม่ 316 00:19:41,950 --> 00:19:44,740 >> สุดท้าย Huffman เข้ารหัส Huffman เข้ารหัสเป็นประโยชน์อย่างมาก 317 00:19:44,740 --> 00:19:47,550 เพื่อบัน​​ทึกความทรงจำและบีบอัดไฟล์ข้อความ 318 00:19:47,550 --> 00:19:52,270 เพียงเพราะหลายครั้งที่คุณใช้ '' และ 'e',​​ ตัวอย่างเช่น 319 00:19:52,270 --> 00:19:57,710 ในเอกสารของคุณ แต่ผมไม่ทราบว่าพวกคุณใช้ 'q' หรือ 'ซี' เป็นมาก 320 00:19:57,710 --> 00:20:02,040 มีเพียง 1 ไบต์สำหรับทุกตัวอักษรเดียว 321 00:20:02,040 --> 00:20:08,520 ทุกเดียว - 256 ตัวอักษรที่เรามีในตาราง ASCII ไม่เหมาะสมมาก 322 00:20:08,520 --> 00:20:11,410 เพียงเพราะมีบางตัวละครที่คุณใช้มากขึ้น 323 00:20:11,410 --> 00:20:15,180 ดังนั้นคุณอาจจะใช้หน่วยความจำน้อยลงสำหรับผู้ที่ 324 00:20:15,180 --> 00:20:17,560 ฉันจะใช้วิธีการเข้ารหัส Huffman? 325 00:20:17,560 --> 00:20:20,010 ที่เราต้องทำต้นไม้ Huffman 326 00:20:20,010 --> 00:20:23,370  ต้นไม้ Huffman มีโหนด 327 00:20:23,370 --> 00:20:27,760 ที่มีสัญลักษณ์ที่เป็นไปได้เช่น ',' ',' b ',' c ', จดหมาย, 328 00:20:27,760 --> 00:20:32,990 สิ่งที่ตัวอักษรที่คุณมีความถี่ที่เป็นความถี่ที่คำที่ปรากฏในข้อความที่เป็น 329 00:20:32,990 --> 00:20:36,280 ที่คุณได้รับการสร้างต้นไม้ Huffman สำหรับ 330 00:20:36,280 --> 00:20:41,800 แล้วโหนดที่จะชี้ไปทางด้านซ้ายของต้นไม้ Huffman 331 00:20:41,800 --> 00:20:47,210 และโหนดที่จะชี้ไปทางขวาอีก ดังนั้นเช่นเดียวกับต้นไม้ 332 00:20:47,210 --> 00:20:49,440 คุณจะสร้างต้นไม้ Huffman? 333 00:20:49,440 --> 00:20:54,020 คุณกำลังจะได้รับ 2 โหนดที่มีความถี่ต่ำสุด 334 00:20:54,020 --> 00:20:56,490 หากคุณมีผูกที่คุณกำลังจะไปรับ 2 โหนด 335 00:20:56,490 --> 00:20:59,870 ที่มีค่าต่ำสุด ASCII ได้เป็นอย่างดี 336 00:20:59,870 --> 00:21:02,420 แล้วคุณกำลังจะสร้างต้นไม้ใหม่จากผู้ที่ 2 โหนด 337 00:21:02,420 --> 00:21:08,030 ที่กำลังจะมีความถี่ในการรวมกันในโหนดแม่ 338 00:21:08,030 --> 00:21:13,240 แล้วคุณจะเอาเด็ก 2 คนจากป่า 339 00:21:13,240 --> 00:21:15,570 และแทนที่ด้วยผู้ปกครอง 340 00:21:15,570 --> 00:21:18,930 และคุณกำลังจะทำซ้ำจนกว่าคุณจะมีเพียง 1 ต้นไม้ในป่า 341 00:21:18,930 --> 00:21:23,840 ดังนั้นเรามาดูวิธีการที่คุณจะทำต้นไม้ Huffman เพื่อ ZAMYLA 342 00:21:23,840 --> 00:21:29,220 คุณสามารถดูได้ที่นี่ที่ตัวอักษรทั้งหมดมีความถี่ 1 ยกเว้นสำหรับ ''; ที่มีความถี่ 2 343 00:21:29,220 --> 00:21:34,090 ดังนั้นผมจึงสร้างโหนดสำหรับตัวอักษรทั้งหมดที่ฉันใส่ในคำสั่งของค่า ASCII และความถี่ 344 00:21:34,090 --> 00:21:40,090 ดังนั้นถ้าผมต้องการที่จะสร้างต้นไม้ครั้งแรกก็จะอยู่กับ 'L' และ 'M' 345 00:21:40,090 --> 00:21:43,100 ดังนั้นจึงเป็นที่นี่ ความถี่ของคู่ที่ 2 จะเป็น 346 00:21:43,100 --> 00:21:49,470 เพราะมันเป็น 1 + 1 แล้วต่อไป 2 ที่มีความถี่ต่ำสุด 'Y' และ 'Z' 347 00:21:49,470 --> 00:21:53,180 และจากนั้นฉันมีทั้งหมดของพวกเขาถูก - มีความถี่ของ 2 348 00:21:53,180 --> 00:22:00,470 ดังนั้นคนที่เป็นคนที่มีค่า ASCII ต่ำสุดสำหรับหนึ่งต่อไปหรือไม่ 349 00:22:00,470 --> 00:22:04,830 'A' และ 'L' ดังนั้นผมจึงสร้างโหนดใหม่ 350 00:22:04,830 --> 00:22:09,930 และในที่สุดก็ถึงที่ 4 และ 2 ดังนั้น 2 เป็นไปได้ทางด้านซ้าย 351 00:22:09,930 --> 00:22:12,430 และนี่คือต้นไม้ Huffman 352 00:22:12,430 --> 00:22:16,060 แล้วถ้าผมต้องการที่จะเขียนข้อความบางอย่าง 353 00:22:16,060 --> 00:22:24,440 เช่นเลขฐานสองแปลงเป็นข้อความโดยใช้ต้นไม้ Huffman เป็นเรื่องง่ายมาก 354 00:22:24,440 --> 00:22:30,220 ตัวอย่างเช่นถ้าผมบอกว่าจะย้ายไปอยู่ด้านซ้ายเป็น 0 และจะย้ายไปอยู่ด้านขวาเป็น 1 355 00:22:30,220 --> 00:22:32,410 คืออะไรที่จะเป็นตัวแทน 356 00:22:32,410 --> 00:22:35,530 ดังนั้นเช่น 1, 1 ดังนั้นที่ถูกต้องเหมาะสม 357 00:22:35,530 --> 00:22:40,370 แล้ว 0, ซ้ายเพื่อจะเป็น L แล้ว 1, 0, 0 358 00:22:40,370 --> 00:22:43,950 ดังนั้น 1, 0 ดังนั้นเพียงแค่ 1, 0, 'A' 359 00:22:43,950 --> 00:22:47,540 แล้ว 0, 1, ดังนั้น 'Z' 360 00:22:47,540 --> 00:22:52,170 แล้ว 1, 0, 0 - ไม่ 361 00:22:52,170 --> 00:22:56,780 0, 0 จะเป็น 'Y' ดังนั้นขี้เกียจ 362 00:22:56,780 --> 00:23:06,060 เพื่อให้ทุกอย่างสำหรับฉันร็อบจะใช้เวลามากกว่า 363 00:23:06,060 --> 00:23:08,400 >> [ร็อบโบว์] ดังนั้นสัปดาห์ 7 สิ่งที่ 364 00:23:08,400 --> 00:23:11,390 เรามีมากไปกว่าอย่างรวดเร็วจริงๆ 365 00:23:11,390 --> 00:23:13,430 ผู้ประกอบการค่าบิต, หน่วยความจำล้น 366 00:23:13,430 --> 00:23:16,760 ห้องสมุด CS50 แล้ว HTML, HTTP, CSS 367 00:23:16,760 --> 00:23:20,990 ในเช่น 15 ถึง 20 นาที 368 00:23:20,990 --> 00:23:24,330 ผู้ประกอบการค่าบิต มี 6 เป็นของพวกเขาว่าคุณจำเป็นต้องรู้ 369 00:23:24,330 --> 00:23:31,200 บิตและบิตหรือ XOR กะซ้ายกะที่ถูกต้องและไม่ได้ 370 00:23:31,200 --> 00:23:35,420 เปลี่ยนที่ถูกต้องและไม่ได้คุณแทบจะไม่ได้เห็นในการบรรยายที่ 371 00:23:35,420 --> 00:23:40,480 เราจะไปกว่าได้อย่างรวดเร็วที่นี่ แต่มันเป็นเรื่องดีที่จะรู้ว่าเหล่านี้เป็น 6 ที่มีอยู่ 372 00:23:40,480 --> 00:23:45,070 โปรดจำไว้ว่าผู้ประกอบการค่าที่เหมาะสมเป็นเช่นเมื่อคุณทำ 3 + 4 373 00:23:45,070 --> 00:23:49,420 คุณยังไม่ได้จัดการกับไบนารีของ 3 และ 4 374 00:23:49,420 --> 00:23:56,550 ค่าที่เหมาะสมกับผู้ประกอบการที่คุณเป็นจริงที่เกี่ยวข้องกับบุคคลบิตของตัวเลขที่ 3 และ 4 375 00:23:56,550 --> 00:23:59,120 >> ดังนั้นคนแรกที่เราจะบอกว่าเป็นค่าที่เหมาะสมไม่ได้ 376 00:23:59,120 --> 00:24:02,340 และทั้งหมดมันไม่สามารถพลิกบิตทั้งหมด 377 00:24:02,340 --> 00:24:05,500 ดังนั้นที่นี่ถ้าคุณกำลังเขียนใน C คุณจะไม่เขียนมัน 378 00:24:05,500 --> 00:24:09,380 เป็น ~ 11011 หรือสิ่งที่คุณจะเขียนมันชอบ ~ 4 379 00:24:09,380 --> 00:24:12,970 และแล้วมันจะพลิกแทน binary จาก 4 380 00:24:12,970 --> 00:24:24,800 ดังนั้นที่นี่, ~ ของเลขฐานสองบาง 1101101 เป็นไปได้ว่าพลิกทุก 1 ถึง 0 และทั้งหมดของ 0 ถึง 1 381 00:24:24,800 --> 00:24:27,600 ขณะที่ผมบอกว่ามีการใช้งานบ่อยของนี้ 382 00:24:27,600 --> 00:24:30,830 และเราจะเห็นมันในบิตเป็นเหมือนที่เราต้องการให้เกิดขึ้นกับบางส่วนจำนวน 383 00:24:30,830 --> 00:24:35,460 ที่ทุกบิตเป็น 1 ยกเว้นหนึ่งของพวกเขา 384 00:24:35,460 --> 00:24:38,560 ดังนั้นมันจะง่ายในการแสดงจำนวน 385 00:24:38,560 --> 00:24:40,630 ที่เพียงแค่บิตเดียวที่มีการตั้งค่า 386 00:24:40,630 --> 00:24:44,650 แล้วนำ ~ ของมันดังนั้นทุกบิตอื่น ๆ จะถูกตั้งค่ายกเว้นหนึ่งที่ 387 00:24:44,650 --> 00:24:50,300 ดังนั้นนั่นคือสิ่งที่เรากำลังจะใช้มากขึ้นในบิต 388 00:24:50,300 --> 00:24:58,220 >> Bitwise หรือ ที่นี่ 2 เลขฐานสองและ 2 ตัวเลขเหล่านี้ 389 00:24:58,220 --> 00:25:00,780 เป็นตัวแทนสวยเนื่องจากพวกเขาเป็นตัวแทนของทุกคนที่เป็นไปได้ 390 00:25:00,780 --> 00:25:07,290 การรวมกันของบิตคุณอาจจำเป็นต้องดำเนินการใน 391 00:25:07,290 --> 00:25:13,540 ที่นี่เมื่อฉัน or'd แต่ละบิตเรากำลังจะเปรียบเทียบตรงลง 392 00:25:13,540 --> 00:25:15,410 ดังนั้นทางด้านซ้ายเรามี 1 และ 1 393 00:25:15,410 --> 00:25:20,510 เมื่อฉันค่าบิต | เหล่านั้นสิ่งที่ฉันจะได้รับ หนึ่ง 394 00:25:20,510 --> 00:25:25,320 จากนั้นค่าบิต | 0 และ 1 จะให้ผมหรือเปล่า หนึ่ง 395 00:25:25,320 --> 00:25:27,840 บิต 1 และ 0 เป็นไปได้ในสิ่งเดียวกันอย่างใดอย่างหนึ่ง 396 00:25:27,840 --> 00:25:31,880 บิต 0 | 0 จะให้ฉัน 0 397 00:25:31,880 --> 00:25:37,300 ดังนั้นกรณีเดียวที่ฉันจะได้รับ 0 ใน 0 | 0 กรณี 398 00:25:37,300 --> 00:25:40,020 และคุณอาจจะคิดว่าเช่นเดียวกับ ORS เชิงตรรกะของคุณ 399 00:25:40,020 --> 00:25:44,830 ดังนั้นหากคุณคิดว่าการที่ 1 เป็นจริงและเป็นเท็จ 0 สิ่งเดียวกันกับที่นี่ 400 00:25:44,830 --> 00:25:50,040 ดังนั้นความจริงที่แท้จริงหรือเป็นความจริง; จริงหรือเท็จเป็นจริง 401 00:25:50,040 --> 00:25:57,150 เท็จหรือจริงก็เป็นความจริงเท็จหรือเท็จเป็นสิ่งเดียวที่ผิดพลาดจริง 402 00:25:57,150 --> 00:26:00,100 นี่คือตัวอย่างที่คุณควรรู้คือ 403 00:26:00,100 --> 00:26:05,160 เป็นตัวอย่างที่ดีงามของผู้ประกอบการเมื่อมีการใช้ค่าบิต 404 00:26:05,160 --> 00:26:08,660 นี่ถ้าเราหรือทุน 'A' ด้วย OX20, 405 00:26:08,660 --> 00:26:11,830 และเราจะดูที่เหล่านี้เป็นครั้งที่สองที่เราได้รับบางสิ่งบางอย่าง 406 00:26:11,830 --> 00:26:16,020 และถ้าเราหรือตัวพิมพ์เล็ก 'กับ OX20 เราได้รับบางสิ่งบางอย่าง 407 00:26:16,020 --> 00:26:26,750 จึงขอดึงตาราง ASCII 408 00:26:26,750 --> 00:26:34,000 ถูก ที่นี่เราจะเห็นว่า 'A' เป็น - 409 00:26:34,000 --> 00:26:36,920 ที่นี่เรามี 'A' เป็นทศนิยม 65 410 00:26:36,920 --> 00:26:45,120 แต่ฉันจะไปกับเลขฐานสิบหกซึ่งเป็น Ox41 411 00:26:45,120 --> 00:26:48,280 สวยแน่ใจว่าเราเห็นว่ามันอยู่ในชั้นเรียน ผมคิดว่าเราเห็นว่ามันอยู่ในชั้นเรียน 412 00:26:48,280 --> 00:26:52,730 ว่ามันเป็นเรื่องง่ายสวยที่จะแปลงจากเลขฐานสิบหกกับเลขฐานสอง 413 00:26:52,730 --> 00:26:55,280 ดังนั้นที่นี่ถ้าผมต้องการที่จะใส่ลงไปใน 4 ไบนารี 414 00:26:55,280 --> 00:26:59,550 ที่เพิ่งจะได้รับ 0100 415 00:26:59,550 --> 00:27:03,620 นี้เป็นสถานที่ 1 ของสถ​​านที่ 2 ที่ 4 ดังนั้นนี้คือ 4 416 00:27:03,620 --> 00:27:08,550 จากนั้นฉันก็สามารถแยก 1 เป็นเลขฐานสองซึ่งเป็นไปได้ 0001 417 00:27:08,550 --> 00:27:14,280 และอื่น ๆ นี้จะเป็นตัวแทนของ 'A' ในไบนารี 418 00:27:14,280 --> 00:27:22,720 การพิมพ์เล็ก '' ก็ตอนนี้ไปได้ Ox61, 419 00:27:22,720 --> 00:27:27,050 ที่แยกเหล่านี้ขึ้นเป็นไบนารีของดังนั้น 6 - 420 00:27:27,050 --> 00:27:37,830 ลองทำจริงมัน - คือไม่มียางลบ? ยางลบ 421 00:27:37,830 --> 00:27:48,220 Ox61 ดังนั้นการแยก 6 เป็นเลขฐานสองเป็นไปได้ 0 + 4 + 2 + 0 422 00:27:48,220 --> 00:27:54,610 และแยก 1 เป็นไปได้ 0001 423 00:27:54,610 --> 00:27:56,520 มองไปที่ความแตกต่างระหว่าง 2 เหล่านี้ 424 00:27:56,520 --> 00:28:04,250 เราจะเห็นว่าแตกต่างระหว่างตัวพิมพ์เล็กและทุน 'A' เป็นบิตเดียวนี้ 425 00:28:04,250 --> 00:28:11,810 ดังนั้นกลับไปที่นี่มา - ไม่เป็นไร 426 00:28:11,810 --> 00:28:15,920 กลับมาที่นี่ถ้าเรามองสิ่งที่บิต OX20 คือ 427 00:28:15,920 --> 00:28:22,210 แยกเพื่อ OX20 เป็นไบนารีของ 428 00:28:22,210 --> 00:28:27,310 คือ 0010, 0000 429 00:28:27,310 --> 00:28:33,470 OX20, บิตเท่านั้นที่ถูกตั้งเป็นบิตที่เรามีความกังวลกับเรื่องนี้ 430 00:28:33,470 --> 00:28:38,210 กับการสลับไปมาระหว่างเมืองหลวงและตัวพิมพ์เล็ก '' 431 00:28:38,210 --> 00:28:47,610 ถ้าผมหรือ 'A' ซึ่งเป็นหนึ่งในนี้ '' 432 00:28:47,610 --> 00:28:50,580 ถ้าผมหรือ 'กับ OX20, 433 00:28:50,580 --> 00:28:53,490 สิ่งที่ฉันจะได้รับ 434 00:28:53,490 --> 00:28:58,960 [นักศึกษาไม่ได้ยิน] >> ตัวพิมพ์เล็ก '' เพราะมันจะพลิกบิตนี้ 1 435 00:28:58,960 --> 00:29:04,170 และถ้าผมหรือ 'กับ OX20 สิ่งที่ฉันจะได้รับ 436 00:29:04,170 --> 00:29:08,780 ตัวพิมพ์เล็กเพราะเพียงแค่ oring 'กับ OX20, 437 00:29:08,780 --> 00:29:14,580 ฉันแค่จะ oring บิตเดียวนี้เพื่อที่ 1 มันมีอยู่แล้ว 1 ดังนั้นมันไม่สำคัญ 438 00:29:14,580 --> 00:29:17,960 ดังนั้นเราจึงได้รับ '' และ '' 439 00:29:17,960 --> 00:29:24,820 >> Bitwise และ อีกครั้งเราสามารถคิดว่านี้เป็นของเราคู่ตรรกะและ 440 00:29:24,820 --> 00:29:28,180 ที่ด้านซ้ายของเรามีความจริงและความจริง 441 00:29:28,180 --> 00:29:31,160 มันจะเป็นความจริงและสำหรับทุกกรณีที่ 442 00:29:31,160 --> 00:29:36,270 เท็จและจริงหรือจริงและเท็จหรือเท็จและเท็จ 443 00:29:36,270 --> 00:29:38,550 ไม่มีสิ่งเหล่านั้นเป็นจริง 444 00:29:38,550 --> 00:29:44,170 ดังนั้นสิ่งที่เราจบลงด้วยการ 1000 445 00:29:44,170 --> 00:29:48,830 ดังนั้นตอนนี้ที่นี่ที่นี่เป็นที่ที่ผมเคยใช้บิตเชื่อถือไม่ได้ 446 00:29:48,830 --> 00:29:52,230 ที่เรามี OX20 447 00:29:52,230 --> 00:29:54,350 ดังนั้นนี่คือ OX20 448 00:29:54,350 --> 00:29:59,570 ตอนนี้สิ่งที่ฉันต้องการจะทำบิตของ ~ OX20 449 00:29:59,570 --> 00:30:03,600 ที่จะพลิกบิตทั้งหมด 450 00:30:03,600 --> 00:30:09,330 ดังนั้นผมจึงมี 1101 1111 451 00:30:09,330 --> 00:30:18,940 และอื่น ๆ '' anded ด้วย ~ OX20 จะให้ฉันอะไร 452 00:30:18,940 --> 00:30:22,430 บิตเท่านั้นเราต้องการจริงๆที่จะคิดเกี่ยวกับการเป็นหนึ่งในนี้ 453 00:30:22,430 --> 00:30:26,020 ตั้งแต่ถ้าทั้งหมดของบิตเหล่านี้จะถูกตั้งค่าเป็น 1 454 00:30:26,020 --> 00:30:29,000 แล้วเราจะได้รับสิ่งที่ 'A' เป็น 455 00:30:29,000 --> 00:30:31,260 ยกเว้นอาจจะเป็นสิ่งที่บิตนี้เป็น 456 00:30:31,260 --> 00:30:34,460 เพราะถ้ามันเป็นที่ 1, ตอนนี้ก็จะได้รับการตั้งค่าให้เป็น 0, 457 00:30:34,460 --> 00:30:39,810 เพราะสิ่งนี้คือ anded กับเรื่องนี้เป็นไปได้ 0 458 00:30:39,810 --> 00:30:43,280 ดังนั้นสิ่งที่ 'A' และ ~ OX20 จะให้ผมหรือเปล่า 459 00:30:43,280 --> 00:30:48,200 [นักเรียนตอบไม่ได้ยิน] >> และสิ่งที่ 'a' และ - มัน 'A' 460 00:30:48,200 --> 00:30:52,170 และเป็นสิ่งที่ '' & ~ OX20 จะให้ผมหรือเปล่า 461 00:30:52,170 --> 00:30:56,720 'เอ' เพราะนี่คือปัจจุบัน 1 462 00:30:56,720 --> 00:30:59,570 anding ด้วย 0 จะทำให้มันเป็น 0, 463 00:30:59,570 --> 00:31:02,530 และตอนนี้เรากำลังจะได้รับ 'A' 464 00:31:02,530 --> 00:31:06,600 >> ทั้งสองเป็น ',' และสุดท้าย แต่ไม่น้อยประเภทนี้ 465 00:31:06,600 --> 00:31:10,830 เรามี XOR มันเป็นอย่างมากเช่นหรือ 466 00:31:10,830 --> 00:31:14,400 ยกเว้นว่ามันจะหมายถึงเฉพาะหรือ 467 00:31:14,400 --> 00:31:18,420 นี้เป็นเหมือนสิ่งที่คุณมักจะคิดว่าเป็นหรือในโลกแห่งความเป็นจริง 468 00:31:18,420 --> 00:31:23,190 เพื่อให้คุณทำอย่างใดอย่าง 'x' หรือ 'y' แต่ไม่ใช่ทั้งสอง 469 00:31:23,190 --> 00:31:28,700 ที่นี่ 1 ^ 1 เป็นไปได้ 0 470 00:31:28,700 --> 00:31:33,650 เพราะความจริงนี้เป็น - มันไม่ทำงานเช่นกันกับตรรกะความจริงและเท็จ 471 00:31:33,650 --> 00:31:37,150 เป็นค่าที่เหมาะสมและและหรือทำ 472 00:31:37,150 --> 00:31:40,100 แต่จริง ^ จริงเป็นเท็จ 473 00:31:40,100 --> 00:31:44,810 เพราะเราเพียง แต่ต้องการที่จะกลับจริงถ้ามีเพียงหนึ่งของพวกเขาเป็นความจริง 474 00:31:44,810 --> 00:31:50,950 ดังนั้น 1 ^ 1 0 สิ่งที่เกี่ยวกับ 0 ^ 1? 475 00:31:50,950 --> 00:31:56,010 1 1 ^ 0 1 0 ^ 0 0 476 00:31:56,010 --> 00:32:03,890 ดังนั้นภายใต้สถานการณ์ทั้งหมด 0 บิต 0 สิ่งที่เป็นไปได้ 0 477 00:32:03,890 --> 00:32:10,270 1 บิต 0 หรือบางสิ่งบางอย่างบิต 0 1 478 00:32:10,270 --> 00:32:14,660 ถ้ามัน | ^ หรือมันจะเป็น 1 และถ้ามันและมันจะเป็น 0 479 00:32:14,660 --> 00:32:20,850 และกรณีเดียวที่ 1 บิตที่ 1 ไม่ได้เป็น 1 จะมี แต่เพียงผู้เดียวหรือ 480 00:32:20,850 --> 00:32:24,580 ที่ 0110 481 00:32:24,580 --> 00:32:36,520 ดังนั้นที่นี่ตอนนี้ใช้ XOR - เพื่อให้เรากลับไปที่ 20 482 00:32:36,520 --> 00:32:43,480 '' ^ OX20 เป็น 2 บิตเหล่านี้เรากำลังเปรียบเทียบ 483 00:32:43,480 --> 00:32:50,020 ดังนั้น 1 ^ 0 จะให้ฉันสิ่งที่ได้หรือไม่ อย่างใดอย่างหนึ่ง 484 00:32:50,020 --> 00:32:58,430 '' ^ OX20 จะให้ผมหรือเปล่า พิมพ์เล็ก 485 00:32:58,430 --> 00:33:04,010 '' ^ OX20 จะให้ผมหรือเปล่า ทุนเอ 486 00:33:04,010 --> 00:33:09,310 เพราะสิ่งนี้จะทำ XORing นี้กับ OX20 487 00:33:09,310 --> 00:33:15,380 อย่างมีประสิทธิภาพพลิกสิ่งที่บิตนี้เป็น 488 00:33:15,380 --> 00:33:21,240 ถ้าเป็น 0 มันตอนนี้จะกลายเป็น 1 489 00:33:21,240 --> 00:33:26,160 ตั้งแต่นี้เป็น 1, 1 ^ 1 0 490 00:33:26,160 --> 00:33:33,280 ดังนั้นเรา 'ได้กลายเป็น' A 'และเรา' A 'ได้กลายเป็น' ' 491 00:33:33,280 --> 00:33:36,910 ดังนั้น XOR เป็นวิธีที่สะดวกจริงๆเพียงพลิกกรณี 492 00:33:36,910 --> 00:33:39,960 คุณเพียงแค่ต้องการที่จะย้ำกว่าสตริงของตัวอักษร 493 00:33:39,960 --> 00:33:44,330 และสลับกรณีของทุกตัวอักษรเดียว 494 00:33:44,330 --> 00:33:50,680 คุณเพียงแค่ทุกอย่าง XOR ด้วย OX20 495 00:33:50,680 --> 00:33:55,220 กะ >> ตอนนี้เราได้ทิ้งไว้ กะที่เหลือเป็นเพียงการไปโดยทั่วไป 496 00:33:55,220 --> 00:34:01,250 ผลักดันทั้งหมดของตัวเลขลงหรือไปทางซ้ายและใส่ 0 อยู่เบื้องหลังพวกเขา 497 00:34:01,250 --> 00:34:05,550 ดังนั้นที่นี่เรามี 00001101 498 00:34:05,550 --> 00:34:08,560 เราจะผลักดัน 3 0 ในจากด้านขวา 499 00:34:08,560 --> 00:34:13,580 และเราได้รับ 01101000 500 00:34:13,580 --> 00:34:16,380 ในแง่ nonbinary, 501 00:34:16,380 --> 00:34:24,699 เราจะเห็นว่าที่จริงการซื้อขาย 13 ซ้ายขยับตัวด้วย 3 ซึ่งช่วยให้เรามี 104 502 00:34:24,699 --> 00:34:32,530 ขยับซ้ายดังนั้นเราดูที่นี่ << x y เป็นพื้น x * 2 ^ y 503 00:34:32,530 --> 00:34:40,139 13 * 2 ^ 3, 2 ^ 3 คือ 8 ดังนั้น 13 * 8 104 504 00:34:40,139 --> 00:34:45,679 หากคุณเพียงแค่คิดเกี่ยวกับไบนารีโดยทั่วไปว่าแต่ละหลัก 505 00:34:45,679 --> 00:34:49,530 ถ้าเราเริ่มต้นจากทางด้านขวาก็เป็นสถานที่ 1 แล้วสถานที่ 2 แล้วสถานที่ 4 506 00:34:49,530 --> 00:34:51,330 ดังนั้นโดยการผลักดันใน 0 จากด้านขวา 507 00:34:51,330 --> 00:34:55,080 เรากำลังผลักดันสิ่งที่อยู่ในสถานที่ 4 ไปยังสถานที่ 8 ของ 508 00:34:55,080 --> 00:34:57,920 และสิ่งที่อยู่ในสถานที่ 8 ไปยังสถานที่ 16 ของ 509 00:34:57,920 --> 00:35:01,280 แต่ละกะเพียงแค่คูณด้วย 2 ใช่? 510 00:35:01,280 --> 00:35:05,210 [นักศึกษา] จะเกิดอะไรขึ้นถ้าคุณเปลี่ยนโดย 5? 511 00:35:05,210 --> 00:35:10,790 [โบว์] หากคุณขยับลง 5 คุณก็จะสูญเสียหลัก 512 00:35:10,790 --> 00:35:15,410 หลีกเลี่ยงไม่ได้ก็เป็นสิ่งเดียวกัน เช่นจำนวนเต็มมีเพียง 32 บิต 513 00:35:15,410 --> 00:35:20,750 ดังนั้นถ้าคุณเพิ่ม 2 จำนวนเต็มใหญ่จริงๆมันก็ไม่พอดีกับจำนวนเต็ม 514 00:35:20,750 --> 00:35:23,660 ดังนั้นมันจึงเป็นสิ่งเดียวกันที่นี่ หากคุณขยับลง 5, 515 00:35:23,660 --> 00:35:25,650 เราก็จะสูญเสียหนึ่งที่ 516 00:35:25,650 --> 00:35:28,820 และที่เป็นชนิดของสิ่งที่ฉันหมายถึงโดย "ประมาณ" 517 00:35:28,820 --> 00:35:37,470 ซึ่งถ้าคุณเปลี่ยนไกลเกินไปคุณจะสูญเสียบิต 518 00:35:37,470 --> 00:35:39,830 >> กะขวาจะเป็นตรงข้าม 519 00:35:39,830 --> 00:35:43,090 ที่เรากำลังจะผลัก 0 ปิดท้ายที่ 520 00:35:43,090 --> 00:35:48,400 และสำหรับวัตถุประสงค์ของเรากรอก 0 จากทางด้านซ้าย 521 00:35:48,400 --> 00:35:52,910 ดังนั้นการทำเช่นนี้เรากำลังกลับโดยทั่วไปสิ่งที่เราได้ทำมาแล้ว 522 00:35:52,910 --> 00:35:57,780 และเราจะเห็นว่าทั้งสาม 0 ด้านขวาได้ลดลงเพียงแค่ปิด 523 00:35:57,780 --> 00:36:02,020 และเราได้ผลัก 1101 ตลอดทางไปทางขวา 524 00:36:02,020 --> 00:36:08,380 นี้จะทำ 104 >> 3 ซึ่งเป็นที่มีประสิทธิภาพ x / y ^ 2 525 00:36:08,380 --> 00:36:11,200 ดังนั้นตอนนี้ที่นี่เป็นความคิดที่คล้ายกัน 526 00:36:11,200 --> 00:36:18,720 ทำไมมันจึงเป็นเพียงแค่ประมาณ x / y ^ 2 และไม่จริง x / 2 ^ Y? 527 00:36:18,720 --> 00:36:22,240 เพราะถ้าผมได้ขยับตัวโดย 4 ผมจะได้หายไป 1 528 00:36:22,240 --> 00:36:25,950 โดยทั่วไปสิ่งที่คุณคิดว่าเพียงแค่คิดว่าการแบ่งจำนวนเต็มทั่วไป 529 00:36:25,950 --> 00:36:31,070 ดังนั้นเช่น 5/2 คือ 2 มันไม่ใช่ 2.5 530 00:36:31,070 --> 00:36:35,000 มันเป็นความคิดเดียวกันที่นี่ เมื่อเราหารด้วย 2 531 00:36:35,000 --> 00:36:39,910 เราจะสูญเสียบิตแปลกไปพร้อมกัน 532 00:36:39,910 --> 00:36:43,870 ดังนั้นตอนนี้ - นั่นมันสำหรับค่าที่เหมาะสม นั่นคือทั้งหมดที่คุณจำเป็นต้องรู้ 533 00:36:43,870 --> 00:36:46,340 จำได้ว่ากรณีการใช้งานที่เราเห็นในชั้นเรียน 534 00:36:46,340 --> 00:36:49,340 เช่นหน้ากากบิตเป็นประโยชน์สำหรับผู้ประกอบการบิต, 535 00:36:49,340 --> 00:36:53,220 หรือคุณใช้พวกเขาสำหรับมาสก์บิต 536 00:36:53,220 --> 00:36:58,620 ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กแปลงเป็นตัวอย่างแม่บทสวย 537 00:36:58,620 --> 00:37:01,640 >> เอาล่ะเพื่อโจมตี buffer ล้น 538 00:37:01,640 --> 00:37:05,110 ทุกคนจำสิ่งที่ผิดกับฟังก์ชั่นนี้ 539 00:37:05,110 --> 00:37:10,140 แจ้งเราประกาศอาร์เรย์ของ 12 ไบต์, 12 ตัวอักษร, 540 00:37:10,140 --> 00:37:18,510 แล้วเราก็คัดลอกลงในบัฟเฟอร์ของเราจาก 12 ตัวอักษรบาร์สตริงทั้งหมด 541 00:37:18,510 --> 00:37:25,080 ดังนั้นสิ่งที่เป็นปัญหาอยู่ที่นี่ 542 00:37:25,080 --> 00:37:32,270 จำนวนมายากล 12 สวยมากทันทีควรปรากฏออกมาเป็น - ทำไม 12? 543 00:37:32,270 --> 00:37:35,050 ถ้าแถบเกิดขึ้นเป็นกว่า 12 ตัวอักษร? 544 00:37:35,050 --> 00:37:41,200 สิ่งที่ถ้าบาร์ล้านของตัวละคร? 545 00:37:41,200 --> 00:37:46,010 นี่เป็นปัญหา memcpy ถ้าแถบยาวพอ 546 00:37:46,010 --> 00:37:50,330 มันก็จะสมบูรณ์ - 'c', 'c' ไม่สนใจว่ามันเป็นเพียง 12 ตัวอักษร; 547 00:37:50,330 --> 00:37:53,280 'c' ไม่สนใจว่ามันไม่สามารถใส่ไบต์ที่หลาย 548 00:37:53,280 --> 00:37:58,250 มันก็จะเป็นการเขียนทับถ่าน, 12 ไบต์ที่เราได้จัดสรรสำหรับมัน 549 00:37:58,250 --> 00:38:01,830 และทุกอย่างที่ผ่านมามันอยู่ในหน่วยความจำที่ไม่จริงเป็นบัฟเฟอร์ที่ 550 00:38:01,830 --> 00:38:06,520 กับสิ่งที่บาร์สตริงเป็น 551 00:38:06,520 --> 00:38:09,780 ดังนั้นนี้คือภาพที่เราเห็นในชั้นเรียน 552 00:38:09,780 --> 00:38:12,220 ที่เราได้สแต็คของเราเติบโตขึ้น 553 00:38:12,220 --> 00:38:16,040 คุณควรจะใช้ในการภาพเหล่านี้หรือได้รับคุ้นเคยกับพวกเขาอีกครั้ง 554 00:38:16,040 --> 00:38:21,260 เรามีสแต็คของเราเติบโตขึ้นมาอยู่หน่วยความจำเริ่มต้นที่ 0 ที่ด้านบน 555 00:38:21,260 --> 00:38:26,270 และเจริญเติบโตได้ลงไปที่ชอบที่ 4 พันล้านที่ด้านล่าง 556 00:38:26,270 --> 00:38:28,820 เรามีอาร์เรย์ของเรา 'c' ในบางส่วนของหน่วยความจำ 557 00:38:28,820 --> 00:38:32,260 แล้วเรามีตัวชี้บาร์ของเราที่จะต้องอยู่ภายใต้มัน 558 00:38:32,260 --> 00:38:38,720 และแล้วเราก็มีตัวชี้กรอบนี้ถูกบันทึกไว้ในที่อยู่ผู้ส่งของเราและกองประจำผู้ปกครองของเรา 559 00:38:38,720 --> 00:38:40,800 จำสิ่งที่อยู่ผู้ส่งคืออะไร 560 00:38:40,800 --> 00:38:45,360 ก็เมื่อสายหลัก foo ฟังก์ชันเรียกบาร์ฟังก์ชั่น 561 00:38:45,360 --> 00:38:48,100 หลีกเลี่ยงไม่ได้ผลตอบแทนที่บาร์ 562 00:38:48,100 --> 00:38:52,610 ดังนั้นเมื่อบาร์ผลตอบแทนที่พวกเขาต้องการที่จะรู้ว่ามันจะกลับไปที่ foo เรียกมันว่า 563 00:38:52,610 --> 00:39:01,360 ดังนั้นที่อยู่ผู้ส่งที่อยู่ของฟังก์ชั่นที่ว่ามันมีที่จะกลับไปเมื่อกลับมาทำงาน 564 00:39:01,360 --> 00:39:05,830 เหตุผลที่สำคัญสำหรับการโจมตีหน่วยความจำล้นเป็นเพราะสะดวก 565 00:39:05,830 --> 00:39:09,580 แฮกเกอร์ต้องการเปลี่ยนที่อยู่ผู้ส่งว่า 566 00:39:09,580 --> 00:39:14,950 แทนการที่จะกลับไป foo, ฉันจะกลับไปที่ใดก็ตามที่แฮกเกอร์ต้องการให้ผมกลับไปที่ 567 00:39:14,950 --> 00:39:17,760 และสะดวกที่แฮกเกอร์มักต้องการที่จะกลับไปที่ 568 00:39:17,760 --> 00:39:22,400 คือจุดเริ่มต้นของ buffer ที่เรามี แต่เดิม 569 00:39:22,400 --> 00:39:26,170 เพื่อแจ้งให้ทราบอีกครั้งลิตเติ้ลอินเดีย 570 00:39:26,170 --> 00:39:28,490 เครื่องใช้เป็นตัวอย่างของระบบที่ลิตเติ้ลอินเดีย, 571 00:39:28,490 --> 00:39:34,140 ดังนั้นจำนวนเต็มหรือตัวชี้จะถูกเก็บไว้ด้วยไบต์กลับ 572 00:39:34,140 --> 00:39:38,980 ดังนั้นที่นี่เราจะเห็น - นี้คืออะไร ใช่ 573 00:39:38,980 --> 00:39:45,660 เราเห็น Ox80, OxC0, Ox35, OxO8 574 00:39:45,660 --> 00:39:48,250 จำเลขฐานสิบหกหรือไม่ 575 00:39:48,250 --> 00:39:50,640 เราจะไม่กลับเลขฐานสิบหกในลิตเติ้ลอินเดีย 576 00:39:50,640 --> 00:39:56,110 เพราะ 2 หลักเลขฐานสิบหกทำขึ้น byte เดียวและเรากลับไบต์ 577 00:39:56,110 --> 00:40:00,300 นั่นเป็นเหตุผลที่เราไม่ได้จัดเก็บเหมือน 80530CO8 578 00:40:00,300 --> 00:40:07,520 เราเก็บแทนแต่ละคู่ 2 หลักเริ่มต้นจากทางด้านขวา 579 00:40:07,520 --> 00:40:10,880 อยู่ที่หมายถึงที่อยู่ของการเริ่มต้น 580 00:40:10,880 --> 00:40:15,190 ของ buffer ของเราที่เราต้องการจริงที่จะคัดลอกลงในสถานที่แรก 581 00:40:15,190 --> 00:40:19,230 ด้วยเหตุผลที่ว่ามีประโยชน์เป็นเพราะสิ่งที่ถ้าโจมตี 582 00:40:19,230 --> 00:40:24,100 ที่เกิดขึ้นกับแทนการมีสายที่เป็นเพียง 583 00:40:24,100 --> 00:40:27,060 สตริงไม่เป็นอันตรายเช่นชื่อหรือสิ่งที่พวกเขา 584 00:40:27,060 --> 00:40:33,900 สิ่งที่ถ้าแทนสตริงที่มีเพียงโค้ดบาง 585 00:40:33,900 --> 00:40:38,610 ที่ไม่สิ่งที่พวกเขาอยากให้มันทำอะไรได้บ้าง 586 00:40:38,610 --> 00:40:45,630 ดังนั้นพวกเขาจึงสามารถ - ฉันไม่สามารถคิดของรหัสเย็นใด 587 00:40:45,630 --> 00:40:47,780 มันอาจจะเป็นอะไร แต่ รหัสใด ๆ ที่ร้ายแรง 588 00:40:47,780 --> 00:40:51,440 หากพวกเขาต้องการที่พวกเขาก็สามารถทำสิ่งที่ผิดพลาด SEG แต่ที่จะไม่มีจุดหมาย 589 00:40:51,440 --> 00:40:54,950 พวกเขามักจะทำมันจะตัดระบบของคุณ 590 00:40:54,950 --> 00:40:59,930 เอาล่ะ >> ห้องสมุด CS50 591 00:40:59,930 --> 00:41:04,800 นี้เป็นพื้น GetInt, getString ทุกฟังก์ชั่นที่เราจัดเตรียมไว้สำหรับคุณ 592 00:41:04,800 --> 00:41:10,630 ดังนั้นเราจึงมีสตริง char * และที่เป็นนามธรรมที่เราพัดออกไป 593 00:41:10,630 --> 00:41:12,450 ในบางจุดในช่วงปิดเทอม 594 00:41:12,450 --> 00:41:18,220 โปรดจำไว้ว่าสตริงเป็นเพียงอาร์เรย์ของตัวอักษร 595 00:41:18,220 --> 00:41:23,240 ดังนั้นที่นี่เราเห็นรุ่นย่อของ getString 596 00:41:23,240 --> 00:41:25,920 คุณควรมองย้อนกลับไปที่มันต้องจำไว้ว่ามันใช้งานจริง 597 00:41:25,920 --> 00:41:30,950 รายละเอียดที่สำคัญจะแจ้งให้ทราบว่าเราได้รับในตัวเดียวในเวลา 598 00:41:30,950 --> 00:41:34,570 จากมาตรฐานซึ่งเป็นเช่นเดียวกับเราพิมพ์ที่แป้นพิมพ์ 599 00:41:34,570 --> 00:41:37,890 ดังนั้นตัวเดียวได้ตลอดเวลาและถ้าเราได้รับตัวอักษรมากเกินไป 600 00:41:37,890 --> 00:41:40,580 ดังนั้นหาก 1 + n มีค่ามากกว่าความจุ 601 00:41:40,580 --> 00:41:44,140 แล้วเราต้องเพิ่มความจุของบัฟเฟอร์ของเรา 602 00:41:44,140 --> 00:41:47,780 ดังนั้นที่นี่เรากำลังเพิ่มขนาดของ buffer ของเรา 603 00:41:47,780 --> 00:41:51,840 และที่ช่วยให้เกิดเราแทรกอักขระลงในบัฟเฟอร์ของเรา 604 00:41:51,840 --> 00:41:56,220 จนกว่าเราจะได้รับการขึ้นบรรทัดใหม่หรือจุดสิ้นสุดของแฟ้มหรืออะไรก็ตาม 605 00:41:56,220 --> 00:41:59,380 ซึ่งในกรณีที่เรากำลังทำกับสตริงแล้ว getString จริง 606 00:41:59,380 --> 00:42:05,120 ลดขนาดหน่วยความจำเช่นถ้าเราจัดสรรหน่วยความจำมากเกินไปมันจะกลับไปและหดตัวลงเล็กน้อย 607 00:42:05,120 --> 00:42:08,830 ดังนั้นเราจึงไม่ได้แสดงให้เห็นว่า แต่แนวคิดหลักคือ 608 00:42:08,830 --> 00:42:11,960 จะมีการอ่านได้ในตัวเดียวในเวลา 609 00:42:11,960 --> 00:42:17,140 มันไม่สามารถอ่านเพียงแค่ในสิ่งทั้งหมดในครั้งเดียว 610 00:42:17,140 --> 00:42:19,550 เพราะกันชนของพวกเขาเป็นเพียงที่มีขนาดบาง 611 00:42:19,550 --> 00:42:26,590 ดังนั้นถ้าสายที่มันพยายามที่จะแทรกลงในบัฟเฟอร์มีขนาดใหญ่เกินไปแล้วมันจะล้น 612 00:42:26,590 --> 00:42:28,940 ดังนั้นที่นี่เราป้องกันไม่ให้เพียงการอ่านในตัวเดียว 613 00:42:28,940 --> 00:42:33,750 ในเวลาและการเติบโตเมื่อใดก็ตามที่เราจำเป็นต้อง 614 00:42:33,750 --> 00:42:40,270 ดังนั้น GetInt และอื่น ๆ ฟังก์ชั่นห้องสมุด CS50 มักจะใช้ getString 615 00:42:40,270 --> 00:42:42,310 ในการใช้งานของพวกเขา 616 00:42:42,310 --> 00:42:45,370 ดังนั้นผมจึงเน้นสิ่งที่สำคัญที่นี่ 617 00:42:45,370 --> 00:42:49,460 มันเรียกร้องที่จะได้รับ getString สตริง 618 00:42:49,460 --> 00:42:51,710 หาก getString ล้มเหลวที่จะกลับหน่วยความจำ 619 00:42:51,710 --> 00:42:54,270 จำไว้ว่าสิ่งที่ getString mallocs ดังนั้นเมื่อใดก็ตามที่คุณโทร getString 620 00:42:54,270 --> 00:42:57,820 คุณไม่ควร (อ่านไม่ออก) ฟรีสตริงที่คุณได้ที่ 621 00:42:57,820 --> 00:43:02,870 ดังนั้นที่นี่ถ้ามันล้มเหลวในการ malloc สิ่งที่เรากลับ INT_MAX เป็นเพียงธงที่ 622 00:43:02,870 --> 00:43:05,650 เดี๋ยวก่อนเราไม่ได้จริงสามารถที่จะได้รับจำนวนเต็ม 623 00:43:05,650 --> 00:43:10,830 คุณควรจะไม่สนใจสิ่งที่ฉันกลับไปที่คุณหรือ 624 00:43:10,830 --> 00:43:15,540 ที่คุณไม่ควรรักษานี้เป็นข้อมูลที่ถูกต้อง 625 00:43:15,540 --> 00:43:21,360 สุดท้ายสมมติว่าไม่ประสบความสำเร็จที่เราใช้ sscanf กับที่ธงพิเศษ 626 00:43:21,360 --> 00:43:23,820 ซึ่งหมายความว่าเป็นครั้งแรกตรงกับจำนวนเต็ม 627 00:43:23,820 --> 00:43:26,770 แล้วตรงกับตัวอักษรใด ๆ หลังจากที่จำนวนเต็ม 628 00:43:26,770 --> 00:43:29,070 เพื่อแจ้งให้ทราบที่เราต้องการให้เท่ากับ 1 629 00:43:29,070 --> 00:43:32,940 ดังนั้นผลตอบแทนที่ sscanf กี่แมตช์ถ้าทำสำเร็จ 630 00:43:32,940 --> 00:43:37,010 มันจะกลับ 1 ถ้ามันประสบความสำเร็จในการจับคู่จำนวนเต็ม 631 00:43:37,010 --> 00:43:40,890 มันจะกลับ 0 ถ้ามันไม่ตรงกับจำนวนเต็มและจะกลับ 2 632 00:43:40,890 --> 00:43:45,920 ถ้ามันตรงกับจำนวนเต็มตามด้วยอักขระบาง 633 00:43:45,920 --> 00:43:49,780 ดังนั้นเราลองสังเกตถ้าเราตรงกับอะไร แต่ 1 634 00:43:49,780 --> 00:43:55,230 ดังนั้นหากเราเข้ามาที่ 1, 2, 3, C, หรือ 1, 2, 3, X, 635 00:43:55,230 --> 00:43:57,400 แล้วที่ 1, 2, 3 จะได้รับการจัดเก็บไว้ในจำนวนเต็ม 636 00:43:57,400 --> 00:43:59,620 X จะได้รับการเก็บไว้ที่ตัวละคร 637 00:43:59,620 --> 00:44:06,410 sscanf จะกลับ 2 และเราจะลองใหม่อีกครั้งเพราะเราเพียงต้องการจำนวนเต็ม 638 00:44:06,410 --> 00:44:09,810 >> ได้อย่างรวดเร็วพัดผ่าน HTML, HTTP, CSS 639 00:44:09,810 --> 00:44:15,340 HyperText Markup Language เป็นโครงสร้างและความหมายของเว็บ 640 00:44:15,340 --> 00:44:19,960 นี่คือตัวอย่างจากการบรรยายที่เรามีแท็ก 641 00:44:19,960 --> 00:44:22,110 เรามีแท็กหัว, แท็กร่างกาย 642 00:44:22,110 --> 00:44:27,770 เรามีตัวอย่างของแท็กว่างที่จริงเราไม่ได้มีการเริ่มต้นและแท็กปิด 643 00:44:27,770 --> 00:44:30,820 เราก็มีการเชื่อมโยงและภาพ 644 00:44:30,820 --> 00:44:38,480 ไม่มีแท็กรูปภาพปิดคือมีเพียงแท็กเดียวที่สำเร็จทุกสิ่งที่แท็กต้องทำ 645 00:44:38,480 --> 00:44:41,950 ลิงค์เป็นตัวอย่างเราจะเห็นวิธีการที่คุณเชื่อมโยงไปยัง, CSS 646 00:44:41,950 --> 00:44:45,910 สคริปต์เป็นตัวอย่างของวิธีการที่คุณเชื่อมโยงไปยังภายนอก JavaScript 647 00:44:45,910 --> 00:44:53,100 มันตรงไปตรงสวยและจำ HTML ไม่เป็นภาษาการเขียนโปรแกรม 648 00:44:53,100 --> 00:44:58,250 ที่นี่จำได้ว่าคุณจะกำหนดรูปแบบหรืออย่างน้อยสิ่งนี้จะทำอย่างไร 649 00:44:58,250 --> 00:45:01,740 รูปแบบดังกล่าวมีการดำเนินการและวิธีการที่ 650 00:45:01,740 --> 00:45:06,210 วิธีการที่คุณจะเท่านั้นที่เคยเห็นเป็น GET และ POST 651 00:45:06,210 --> 00:45:09,040 เพื่อให้ได้รับเป็นรุ่นที่สิ่งที่ได้รับการใส่ใน URL 652 00:45:09,040 --> 00:45:11,680 การโพสต์เป็นที่ที่ยังไม่ได้ใส่ใน URL 653 00:45:11,680 --> 00:45:18,520 แต่ข้อมูลใด ๆ จากรูปแบบถูกแทรกซ่อนอยู่มากขึ้นในการขอ HTTP 654 00:45:18,520 --> 00:45:22,390 ดังนั้นนี่คือการกระทำที่กำหนดคำขอไป 655 00:45:22,390 --> 00:45:27,490 ที่มันจะเป็น google.com / search 656 00:45:27,490 --> 00:45:32,890 วิธี โปรดจำไว้ว่าความแตกต่างระหว่าง GET และ POST, 657 00:45:32,890 --> 00:45:37,200 และเพียงแค่บอกว่าเป็นตัวอย่างถ้าคุณต้องการบางสิ่งบางอย่างที่คั่นหน้า 658 00:45:37,200 --> 00:45:40,660 คุณจะไม่สามารถที่จะโพสต์ URL มาร์ค 659 00:45:40,660 --> 00:45:44,970 เพราะข้อมูลที่ไม่ได้รวมอยู่ใน URL ที่ 660 00:45:44,970 --> 00:45:49,790 HTTP >> ตอนนี้เป็น HyperText Transfer Protocol 661 00:45:49,790 --> 00:45:54,080 HyperText Transfer Protocol คุณจะคาดหวังว่ามันจะถ่ายโอน 662 00:45:54,080 --> 00:45:57,710 HyperText Markup Language, และมันจะ 663 00:45:57,710 --> 00:46:00,170 แต่มันก็ยังถ่ายโอนภาพใด ๆ ที่คุณพบบนเว็บ 664 00:46:00,170 --> 00:46:05,400 การดาวน์โหลดที่คุณทำเริ่มต้นในขณะที่คำขอ 665 00:46:05,400 --> 00:46:10,350 ดังนั้น HTTP เป็นเพียงภาษาของเวิลด์ไวด์เว็บ 666 00:46:10,350 --> 00:46:15,610 และที่นี่คุณจำเป็นต้องรู้ชนิดของคำขอนี้ 667 00:46:15,610 --> 00:46:19,300 ที่นี่ HTTP/1.1 ด้านข้างเพียงแค่บอกว่าเป็นรุ่น 668 00:46:19,300 --> 00:46:21,570 ของโปรโตคอลที่ฉันใช้ 669 00:46:21,570 --> 00:46:25,770 มันสวยมากเสมอไปเป็น HTTP/1.1 เป็นคุณจะเห็นมัน 670 00:46:25,770 --> 00:46:30,110 จากนั้นเราจะเห็นว่านี้คือการได้รับทางเลือกที่ถูกโพสต์ที่คุณอาจจะเห็น 671 00:46:30,110 --> 00:46:40,790 และ URL ที่ผมพยายามที่จะเยี่ยมชมเป็น www.google.com/search?q = blah, blah, blah 672 00:46:40,790 --> 00:46:44,240 ดังนั้นจำไว้ว่านี้เครื่องหมายคำถาม q = blah blah blah, 673 00:46:44,240 --> 00:46:49,040 มีการเรียงลำดับของสิ่งที่ส่งมาตามรูปแบบ 674 00:46:49,040 --> 00:46:51,830 การตอบสนองมันอาจจะกลับไปฉันจะมีลักษณะบางอย่างเช่นนี้ 675 00:46:51,830 --> 00:46:54,050 อีกครั้งที่เริ่มต้นด้วยโปรโตคอลซึ่งเป็นไปได้ว่า 676 00:46:54,050 --> 00:46:59,190 ตามด้วยรหัสสถานะ นี่มันเป็น 200 ตกลง 677 00:46:59,190 --> 00:47:05,060 และในที่สุดหน้าเว็บว่าที่จริงผมขอจะตามมา 678 00:47:05,060 --> 00:47:08,210 รหัสสถานะที่เป็นไปได้ที่คุณอาจมองเห็นและคุณควรจะรู้ว่าหลายคน 679 00:47:08,210 --> 00:47:12,770 200 ตกลงคุณอาจได้เห็นมาก่อน 680 00:47:12,770 --> 00:47:17,830 พระราชวังต้องห้าม, 404 ไม่พบข้อผิดพลาด 403 500 ภายในเซิร์ฟเวอร์ 681 00:47:17,830 --> 00:47:22,140 โดยปกติจะเป็นถ้าคุณไปที่เว็บไซต์และสิ่งที่เสียหรือเกิดปัญหาโค้ด PHP ของพวกเขา 682 00:47:22,140 --> 00:47:24,930 ในขณะที่เครื่องที่เรามีอยู่ที่กล่องสีส้มขนาดใหญ่ 683 00:47:24,930 --> 00:47:27,830 ที่เกิดขึ้นและบอกว่าเหมือนมีอะไรบางอย่างที่ไม่ถูกต้องรหัสนี้ไม่ทำงาน 684 00:47:27,830 --> 00:47:30,380 หรือฟังก์ชั่นนี้จะไม่ดี 685 00:47:30,380 --> 00:47:33,230 โดยปกติเว็บไซต์ที่ไม่ต้องการให้คุณรู้ว่าสิ่งที่ฟังก์ชั่นที่ไม่ดีจริง 686 00:47:33,230 --> 00:47:37,880 ดังนั้นแทนที่จะพวกเขาจะเพียงแค่ทำให้คุณมี 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์ 687 00:47:37,880 --> 00:47:43,050 >> TCP / IP 1 ชั้นภายใต้ HTTP 688 00:47:43,050 --> 00:47:47,550 โปรดจำไว้ว่ามีอินเทอร์เน็ตนอกของเวิลด์ไวด์เว็บ 689 00:47:47,550 --> 00:47:52,270 เช่นถ้าคุณเล่นเกมออนไลน์ที่ไม่ได้ไปผ่าน HTTP, 690 00:47:52,270 --> 00:47:55,740 มันจะผ่านที่แตกต่างกัน - มันยังคงใช้อินเทอร์เน็ต 691 00:47:55,740 --> 00:47:58,900 แต่มันไม่ได้ใช้ HTTP 692 00:47:58,900 --> 00:48:02,470 HTTP เป็นเพียงตัวอย่างหนึ่งของโปรโตคอลสร้างขึ้นบน TCP / IP 693 00:48:02,470 --> 00:48:07,820 IP หมายถึง Internet Protocol 694 00:48:07,820 --> 00:48:11,500 คอมพิวเตอร์ทุกเครื่องมีที่อยู่ IP พวกเขาเป็นสิ่งที่น่า 4 หลัก 695 00:48:11,500 --> 00:48:16,510 เช่น 192.168.2.1 หรือสิ่งที่ว่ามีแนวโน้มที่จะเป็นหนึ่งในประเทศ 696 00:48:16,510 --> 00:48:23,390 แต่ที่เป็นรูปแบบของที่อยู่ IP 697 00:48:23,390 --> 00:48:29,060 ดังนั้น DNS ชื่อโดเมนบริการ 698 00:48:29,060 --> 00:48:33,410 นั่นคือสิ่งที่สิ่งที่ต้องการแปล google.com ไปยังที่อยู่ที่เกิดขึ้นจริง 699 00:48:33,410 --> 00:48:37,700 ดังนั้นถ้าคุณพิมพ์ที่อยู่ IP เป็น URL, 700 00:48:37,700 --> 00:48:40,850 ที่จะนำคุณไปยัง Google แต่คุณมักจะไม่จำสิ่งเหล่านั้น 701 00:48:40,850 --> 00:48:45,470 คุณมักจะจำ google.com แทน 702 00:48:45,470 --> 00:48:51,560 สิ่งสุดท้ายที่เรามีก็คือพอร์ตที่นี้เป็นส่วนหนึ่งของ TCP IP 703 00:48:51,560 --> 00:48:54,880 TCP จะมากขึ้น คิดเกี่ยวกับการเช่นเดียวกับที่คุณมีเว็บเบราเซอร์ของคุณทำงาน 704 00:48:54,880 --> 00:48:58,670 บางทีคุณอาจจะมีบางโปรแกรมอีเมลที่ทำงาน; 705 00:48:58,670 --> 00:49:02,150 บางทีคุณอาจมีบางโปรแกรมอื่น ๆ ที่ใช้อินเทอร์เน็ตในการทำงาน 706 00:49:02,150 --> 00:49:05,090 พวกเขาทุกคนต้องเข้าถึงอินเทอร์เน็ต 707 00:49:05,090 --> 00:49:08,100 แต่เครื่องคอมพิวเตอร์ของคุณมีการ์ดไร้สายที่ 1 หรืออะไรก็ตาม แต่ 708 00:49:08,100 --> 00:49:10,780 ดังนั้นพอร์ตเป็นวิธีที่เราสามารถที่จะแยกออก 709 00:49:10,780 --> 00:49:13,550 วิธีการใช้งานเหล่านี้จะสามารถใช้อินเทอร์เน็ต 710 00:49:13,550 --> 00:49:17,230 ใบสมัครแต่ละคนได้รับ 1 พอร์ตเฉพาะที่จะสามารถฟังบน 711 00:49:17,230 --> 00:49:19,670 และโดยค่าเริ่มต้น HTTP ใช้พอร์ต 80 712 00:49:19,670 --> 00:49:22,410 บางคนใช้บริการอีเมล 25 713 00:49:22,410 --> 00:49:24,490 คนเลขต่ำมีแนวโน้มที่จะสงวนไว้ 714 00:49:24,490 --> 00:49:29,270 คุณมักจะสามารถที่จะได้รับคนที่สูงขึ้นเลขด้วยตัวคุณเอง 715 00:49:29,270 --> 00:49:32,010 >> CSS สไตล์ Cascading แผ่น 716 00:49:32,010 --> 00:49:36,030 หน้าเว็บสไตล์เราด้วย CSS ไม่ได้กับ HTML 717 00:49:36,030 --> 00:49:38,440 มี 3 สถานที่ที่คุณสามารถใส่ CSS ของคุณ 718 00:49:38,440 --> 00:49:46,300 มันสามารถเป็นแบบอินไลน์ระหว่างแท็กรูปแบบหรือในแฟ้มต่างหากอย่างสมบูรณ์และเชื่อมโยงเข้ามา 719 00:49:46,300 --> 00:49:48,470 และนี่เป็นเพียงตัวอย่างของ CSS 720 00:49:48,470 --> 00:49:50,450 คุณควรตระหนักรูปแบบนี้ 721 00:49:50,450 --> 00:49:54,310 ที่ตัวอย่างแรกคือเรากำลังจับคู่แท็กร่างกาย 722 00:49:54,310 --> 00:49:56,680 และที่นี่เรากำลังอยู่ตรงกลางแท็กร่างกาย 723 00:49:56,680 --> 00:50:00,420 ตัวอย่างที่สองเราจะตรงกับสิ่งที่ 724 00:50:00,420 --> 00:50:04,740 ที่มีรหัสส่วนท้ายและเรากำลังใช้รูปแบบบางอย่างที่ 725 00:50:04,740 --> 00:50:07,310 ขอให้สังเกตว่ารหัสส่วนท้ายของข้อความที่สอดคล้องไปทางซ้าย 726 00:50:07,310 --> 00:50:09,840 ในขณะที่ร่างกายของศูนย์ข้อความสอดคล้อง- 727 00:50:09,840 --> 00:50:13,180 ส่วนท้ายของที่อยู่ภายในร่างกาย 728 00:50:13,180 --> 00:50:16,470 มันจะแทนข้อความชิดซ้ายแม้ว่าร่างกายกล่าวว่าศูนย์ข้อความชิด 729 00:50:16,470 --> 00:50:18,880 นี้เป็นส่วนที่ซ้อนทั้งหมดของมัน 730 00:50:18,880 --> 00:50:22,110 คุณสามารถมี - คุณสามารถระบุรูปแบบสำหรับร่างกาย 731 00:50:22,110 --> 00:50:25,320 และแล้วสิ่งที่อยู่ในร่างกายของคุณสามารถระบุรูปแบบที่เฉพาะเจาะจงมากขึ้น 732 00:50:25,320 --> 00:50:28,160 และการทำงานสิ่งที่คุณคาดหวัง 733 00:50:28,160 --> 00:50:34,420 CSS ชี้เฉพาะเจาะจงมากขึ้นจะมีความสำคัญ 734 00:50:34,420 --> 00:50:46,140 ผมคิดว่ามัน 735 00:50:46,140 --> 00:50:49,260 >> [อาลี Nahm] สวัสดีทุกคน ถ้าฉันเพียงแค่จะได้รับความสนใจของคุณ 736 00:50:49,260 --> 00:50:53,990 ฉันอาลีและฉันจะไปผ่าน PHP และ SQL อย่างรวดเร็วจริงๆ 737 00:50:53,990 --> 00:51:00,310 เพื่อให้เราสามารถเริ่มต้น PHP เป็นสั้นสำหรับ PHP: Hypertext Preprocessor 738 00:51:00,310 --> 00:51:03,730 และเป็นคุณทุกคนควรจะรู้ว่ามันเป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ 739 00:51:03,730 --> 00:51:06,800 และเราใช้สำหรับปลายด้านหลังของเว็บไซต์ 740 00:51:06,800 --> 00:51:12,540 และวิธีการที่ไม่มากของการคำนวณที่อยู่เบื้องหลังส่วน 741 00:51:12,540 --> 00:51:17,510 วากยสัมพันธ์ มันไม่เหมือน C, แปลกใจ, ประหลาดใจ 742 00:51:17,510 --> 00:51:22,060 มันก็จะมีการเริ่มต้นด้วยถ้าคุณสามารถดู - ฉันไม่สามารถเดินหน้า 743 00:51:22,060 --> 00:51:31,340 คุณสามารถดูที่คุณต้องการชนิดใหม่ของการจัดฟันแล้วคุณยังต้องหรือไม่ PHP 744 00:51:31,340 --> 00:51:35,780 นั่นคือวิธีการที่คุณมักจะมีกรอบข้อความของ PHP, PHP รหัสของคุณ 745 00:51:35,780 --> 00:51:39,180 ดังนั้นจึงไม่สามารถเพียงแค่เป็นเช่น C ที่คุณชนิดของใส่ไว้ในครั้งแรก 746 00:51:39,180 --> 00:51:42,290 คุณจำเป็นต้องเสมอล้อมรอบมัน 747 00:51:42,290 --> 00:51:47,610 และตอนนี้ไวยากรณ์ที่สำคัญคือการที่ตัวแปรทั้งหมดต้องเริ่มต้นด้วยตัวอักษร $ 748 00:51:47,610 --> 00:51:49,490 ที่คุณต้องทำเมื่อคุณกำลังกำหนดให้คุณต้องทำมัน 749 00:51:49,490 --> 00:51:51,860 เมื่อคุณกำลังพูดถึงพวกเขาในภายหลัง 750 00:51:51,860 --> 00:51:56,510 คุณก็ต้อง $ ที่ มันเป็นเพื่อนที่ดีที่สุดของคุณใหม่สวยมาก 751 00:51:56,510 --> 00:52:01,690 คุณไม่ - แตกต่าง C คุณไม่จำเป็นต้องนำสิ่งที่ชนิดของชนิดตัวแปรที่เป็น 752 00:52:01,690 --> 00:52:04,940 ดังนั้นขณะที่คุณไม่จำเป็นต้อง $ คุณไม่จำเป็นต้องใส่เหมือน 753 00:52:04,940 --> 00:52:09,470 int x หรือ y สตริง, etcetera, etcetera 754 00:52:09,470 --> 00:52:11,490 ดังนั้นความแตกต่างเล็กน้อย 755 00:52:11,490 --> 00:52:15,590 ในฐานะที่เป็นผลจากการนี​​้ก็หมายความว่า PHP เป็นประเภทที่ไม่ค่อย 756 00:52:15,590 --> 00:52:19,310 PHP เป็นภาษาประเภทนิดหน่อยและมันได้พิมพ์ตัวแปรระทวย 757 00:52:19,310 --> 00:52:24,020 ในคำอื่น ๆ ที่หมายความว่าคุณสามารถสลับไปมาระหว่างชนิดที่แตกต่างกันของชนิดตัวแปร 758 00:52:24,020 --> 00:52:27,230 คุณสามารถเก็บหมายเลข 1 เป็น int, 759 00:52:27,230 --> 00:52:29,650 คุณสามารถเก็บไว้เป็นสตริงและคุณสามารถเก็บไว้เป็นลอย, 760 00:52:29,650 --> 00:52:33,550 และทั้งหมดจะเป็น 1 หมายเลขที่ 761 00:52:33,550 --> 00:52:36,080 แม้ว่าคุณเก็บไว้ในรูปแบบที่แตกต่างกัน 762 00:52:36,080 --> 00:52:39,120 ก็ยังคง - ประเภทตัวแปรยังคงถือในท้ายที่สุด 763 00:52:39,120 --> 00:52:41,540 ดังนั้นถ้าคุณดูที่นี่ถ้าคุณจำจาก pset 7 764 00:52:41,540 --> 00:52:43,500 หลายท่านอาจจะมีปัญหาเกี่ยวกับเรื่องนี้ 765 00:52:43,500 --> 00:52:47,280 สองสัญญาณเท่ากัน 3 สัญญาณเท่ากับ 4 สัญญาณเท่ากับ 766 00:52:47,280 --> 00:52:49,990 เอาล่ะไม่มีสัญญาณ 4 เท่ากัน แต่มี 2 และ 3 767 00:52:49,990 --> 00:52:53,320 คุณใช้ 2 สัญญาณเท่ากับตรวจสอบค่า 768 00:52:53,320 --> 00:52:55,830 มันสามารถตรวจสอบข้ามประเภท 769 00:52:55,830 --> 00:52:58,770 ดังนั้นหากคุณสามารถดูที่ตัวอย่างแรก 770 00:52:58,770 --> 00:53:02,210 ฉันมี == num_int num_string 771 00:53:02,210 --> 00:53:06,710 ดังนั้น int และสตริงของคุณมีทั้งในทางเทคนิค, 1, 772 00:53:06,710 --> 00:53:10,790 แต่พวกเขากำลังที่แตกต่างกัน แต่สำหรับเท่ากับสองก็ยังจะผ่าน 773 00:53:10,790 --> 00:53:15,510 แต่สำหรับเท่ากับสามมันจะตรวจสอบค่าเช่นเดียวกับประเภทที่แตกต่างกัน 774 00:53:15,510 --> 00:53:18,760 นั่นหมายความว่ามันจะไม่ผ่านในกรณีที่สองที่นี่ 775 00:53:18,760 --> 00:53:22,350 ที่คุณกำลังใช้ 3 สัญญาณเท่ากันแทน 776 00:53:22,350 --> 00:53:26,590 เพื่อให้เป็นความแตกต่างที่สำคัญที่คุณควรได้แสดงให้เห็นในขณะนี้ 777 00:53:26,590 --> 00:53:31,570 >> สตริง concatenation เป็นอีกหนึ่งสิ่งที่มีประสิทธิภาพที่คุณสามารถใช้ใน PHP 778 00:53:31,570 --> 00:53:34,080 มันเป็นพื้นเพียงแค่นี้สัญกรณ์ dot ประโยชน์ 779 00:53:34,080 --> 00:53:36,230 และนั่นคือวิธีการที่คุณสามารถผูกสายเข้าด้วยกัน 780 00:53:36,230 --> 00:53:40,800 ดังนั้นหากคุณมีแมวและสุนัขที่คุณมีและคุณต้องการที่จะใส่ 2 สายด้วยกัน 781 00:53:40,800 --> 00:53:44,080 คุณสามารถใช้เวลาและที่ชนิดของวิธีการทำงาน 782 00:53:44,080 --> 00:53:46,660 คุณยังสามารถวางไว้ถัดจากแต่ละอื่น ๆ 783 00:53:46,660 --> 00:53:49,030 ในขณะที่คุณสามารถดูที่นี่ในตัวอย่างด้านล่าง 784 00:53:49,030 --> 00:53:51,610 ที่ฉันได้สะท้อนสาย 1, สาย 2 พื้นที่ 785 00:53:51,610 --> 00:53:56,930 PHP จะได้รู้ว่าจะเข้ามาแทนที่พวกเขาเป็นเช่น 786 00:53:56,930 --> 00:53:59,780 อาร์เรย์ ตอนนี้ใน PHP มี 2 ชนิดที่แตกต่างกันของอาร์เรย์ 787 00:53:59,780 --> 00:54:03,180 คุณสามารถมีอาร์เรย์ปกติและคุณยังสามารถมีอาร์เรย์ที่สมาคม 788 00:54:03,180 --> 00:54:06,040 และเรากำลังจะไปผ่านพวกเขาในตอนนี้ 789 00:54:06,040 --> 00:54:08,280 อาร์เรย์ปกติมีเพียงแค่นี้ใน C 790 00:54:08,280 --> 00:54:11,240 และเพื่อให้คุณมีดัชนีที่มีหมายเลข 791 00:54:11,240 --> 00:54:13,160 ตอนนี้เรากำลังจะสร้างและวาง - 792 00:54:13,160 --> 00:54:15,500 ดังนั้นนี่คือวิธีการที่เราสร้างอาร์เรย์ว่างเปล่าแล้วเรากำลังจะ 793 00:54:15,500 --> 00:54:17,310 ใส่ลงไปในตัวเลขดัชนี 0 794 00:54:17,310 --> 00:54:19,200 เรากำลังจะไปใส่หมายเลข 6, ค่า 6 795 00:54:19,200 --> 00:54:21,500 คุณสามารถดูได้ที่ด้านล่างที่นี่ 796 00:54:21,500 --> 00:54:24,240 Where's - ตัวเลขดัชนีที่ 1 เราจะใส่หมายเลขค่า 4 797 00:54:24,240 --> 00:54:26,720 และเพื่อให้คุณสามารถดูมี 6 มี 4 798 00:54:26,720 --> 00:54:29,160 แล้วในขณะที่เรากำลังพิมพ์สิ่งที่ 799 00:54:29,160 --> 00:54:33,550 เมื่อเราพยายามและพิมพ์ค่าที่เก็บไว้ที่บ้านเลขที่ดัชนี 0, 800 00:54:33,550 --> 00:54:36,900 แล้วเราจะเห็นคุณค่า 6 ถูกพิมพ์ออกมา เย็น 801 00:54:36,900 --> 00:54:40,160 เพื่อให้เป็นอาร์เรย์ปกติสำหรับคุณ 802 00:54:40,160 --> 00:54:42,750 วิธีการที่คุณยังสามารถเพิ่มสิ่งที่จะอาร์เรย์ปกติตอนนี้อีก 803 00:54:42,750 --> 00:54:44,780 ที่คุณก็สามารถผนวกพวกเขาในตอนท้าย 804 00:54:44,780 --> 00:54:47,240 นั่นหมายความว่าคุณไม่ได้มีการระบุดัชนีที่เฉพาะเจาะจง 805 00:54:47,240 --> 00:54:51,000 คุณจะเห็นจำนวนและจากนั้นในวงเล็บเหลี่ยมมีดัชนีที่ระบุ 806 00:54:51,000 --> 00:54:56,270 และมันก็จะรู้ - PHP จะรู้เพียงแค่เพิ่มไปยังจุดสิ้นสุดของรายการจุดฟรีต่อไป 807 00:54:56,270 --> 00:54:59,190 ดังนั้นคุณจะเห็น 1 มีสิทธิที่ที่ 0 จุด 808 00:54:59,190 --> 00:55:02,690 2 ก็มีสิทธิที่จุดแรก 809 00:55:02,690 --> 00:55:04,690 3 ไป - มีการเพิ่มมีทั้ง 810 00:55:04,690 --> 00:55:06,720 เพื่อให้ชนิดของทำให้รู้สึก คุณเพียงแค่การเพิ่มอย่างต่อเนื่องนั้น 811 00:55:06,720 --> 00:55:09,360 แล้วเมื่อเรากำลังสะท้อนดัชนีของจำนวน 1, 812 00:55:09,360 --> 00:55:13,080 จะพิมพ์ออกค่า 2 813 00:55:13,080 --> 00:55:16,800 >> แล้วเรามีอาร์เรย์ที่มีความเชื่อมโยงอาร์เรย์ 814 00:55:16,800 --> 00:55:19,370 เชื่อมโยงอาร์เรย์แทนการมีดัชนีตัวเลข 815 00:55:19,370 --> 00:55:23,630 สิ่งที่พวกเขาทำคือพวกเขามีดัชนีที่มีโดยสตริง 816 00:55:23,630 --> 00:55:25,670 คุณสามารถดูแทน - ฉันได้กำจัดทุกคนที่ดัชนีหมายเลข 817 00:55:25,670 --> 00:55:32,140 และตอนนี้ก็ key1, key2, key3 และพวกเขาอยู่ในเครื่องหมายคำพูดที่มีความหมายว่าพวกเขากำลังสตริงทั้งหมด 818 00:55:32,140 --> 00:55:34,470 ดังนั้นเราจึงสามารถมีตัวอย่างนี้ 819 00:55:34,470 --> 00:55:38,790 ตัวอย่างนี้คือการที่เรามี tf และที่ชื่อดัชนี 820 00:55:38,790 --> 00:55:42,030 เรากำลังจะไปใส่ "อาลี" เป็นชื่อที่ดัชนี, แคลอรี่กิน 821 00:55:42,030 --> 00:55:47,640 เราสามารถใส่ int เวลานี้แทนสตริง 822 00:55:47,640 --> 00:55:52,240 แล้วที่ชอบดัชนีเราสามารถใส่อาร์เรย์ทั้งหมดภายในของมัน 823 00:55:52,240 --> 00:55:55,490 ดังนั้นนี่เป็นชนิดของ - มันเป็นแนวคิดที่คล้ายกับวิธีการที่เรามี 824 00:55:55,490 --> 00:55:58,930 ดัชนีกับตัวเลข แต่ตอนนี้เราสามารถเปลี่ยนดัชนีที่อยู่รอบ ๆ 825 00:55:58,930 --> 00:56:03,890 ที่จะมีพวกเขาเป็นสายแทน 826 00:56:03,890 --> 00:56:06,070 นอกจากนี้คุณยังสามารถทำเช่นนี้นอกจากเพียงแค่ทำมันเป็นรายบุคคล 827 00:56:06,070 --> 00:56:09,400 คุณสามารถทำมันได้ทั้งหมดในหนึ่งก้อน ดังนั้นคุณจะเห็น tf ของอาร์เรย์ที่ว่า 828 00:56:09,400 --> 00:56:13,350 แล้วเราตั้งพวกเขาทั้งหมดในชุดวงเล็บตารางยักษ์หนึ่ง 829 00:56:13,350 --> 00:56:15,220 เพื่อให้สามารถเพิ่มความเร็วขึ้น 830 00:56:15,220 --> 00:56:19,730 มันขึ้นของทางเลือกโวหารกว่าไม่ได้ 831 00:56:19,730 --> 00:56:21,550 นอกจากนี้เรายังมีลูป 832 00:56:21,550 --> 00:56:26,020 ใน C เรามีลูปที่ทำงานเช่นนี้ 833 00:56:26,020 --> 00:56:29,690 เรามีอาร์เรย์ของเราและเราก็ออกจากดัชนี 0 ที่ส่วนท้ายของรายการ 834 00:56:29,690 --> 00:56:31,740 และเราพิมพ์มันทั้งหมดใช่ไหม 835 00:56:31,740 --> 00:56:33,880 ยกเว้นที่เป็นปัญหาสำหรับอาร์เรย์ที่สมาคม 836 00:56:33,880 --> 00:56:36,610 เราไม่จำเป็นต้องรู้ว่าตัวเลขดัชนีที่ 837 00:56:36,610 --> 00:56:39,610 เพราะตอนนี้เรามีดัชนีสตริง 838 00:56:39,610 --> 00:56:44,800 ตอนนี้เราใช้ลูป foreach ซึ่งอีกครั้งคุณใช้หวังว่าใน pset 7 839 00:56:44,800 --> 00:56:48,930 foreach ลูปก็จะรู้ทุกส่วนเดียวของรายการ 840 00:56:48,930 --> 00:56:52,450 และมันก็ไม่จำเป็นต้องรู้ว่าตัวเลขดัชนีที่คุณมี 841 00:56:52,450 --> 00:56:56,490 เพื่อให้คุณมีไวยากรณ์ foreach จึง foreach คุณใส่อาร์เรย์ 842 00:56:56,490 --> 00:57:00,430 ดังนั้นอาร์เรย์ของฉันเรียกว่า pset และจากนั้นก็เป็นคำที่เป็นที่ 843 00:57:00,430 --> 00:57:04,530 แล้วคุณใส่ตัวแปรชั่วคราวนี้ในประเทศที่คุณกำลังจะใช้ 844 00:57:04,530 --> 00:57:10,690 เพียง แต่สำหรับสิ่งที่เฉพาะเจาะจงที่จะถือเฉพาะ - 845 00:57:10,690 --> 00:57:14,770 หนึ่งตัวอย่างหรือส่วนหนึ่งของอาร์เรย์ 846 00:57:14,770 --> 00:57:18,350 pset NUM จะถือ 1 แล้วบางทีมันอาจจะจะถือจำนวน 6, 847 00:57:18,350 --> 00:57:20,410 และจากนั้นก็จะถือจำนวน 2 848 00:57:20,410 --> 00:57:26,630 แต่ก็รับประกันที่จะไปผ่านทุกค่าเดียวที่อยู่ในอาเรย์ 849 00:57:26,630 --> 00:57:30,530 ฟังก์ชั่นที่มีประโยชน์ที่คุณควรรู้ใน PHP มีความจำเป็นต้องใช้ 850 00:57:30,530 --> 00:57:35,880 เพื่อที่จะทำให้แน่ใจว่าคุณรวมถึงไฟล์บางอย่างสะท้อนออกว่างเปล่า 851 00:57:35,880 --> 00:57:40,490 ผมขอแนะนำให้คุณดูที่ pset 7 และดูที่ฟังก์ชั่นเหล่านั้น 852 00:57:40,490 --> 00:57:42,810 คุณอาจจะต้องรู้เหล่านั้น 853 00:57:42,810 --> 00:57:47,060 ดังนั้นแน่นอนฉันอยากจะรู้ว่าสิ่งที่ว่าเหล่านี้จะทำทุกอย่าง 854 00:57:47,060 --> 00:57:50,080 >> และตอนนี้เรากำลังจะผ่านไปอย่างรวดเร็วจริงๆขอบเขต 855 00:57:50,080 --> 00:57:53,490 อยู่ในขอบเขต PHP เป็นชนิดของสิ่งที่ขี้ขลาดไม่เหมือนซี 856 00:57:53,490 --> 00:57:56,170 และเพื่อให้เรากำลังจะผ่านมันไปได้อย่างรวดเร็ว 857 00:57:56,170 --> 00:57:58,930 จึงขอบอกว่าเราเริ่มต้นที่ลูกศรที่เรามีอยู่ที่นั่น 858 00:57:58,930 --> 00:58:02,900 และเรากำลังจะเริ่มต้นด้วย $ i ดังนั้นตัวแปร 'i' เป็นไปได้ 0, 859 00:58:02,900 --> 00:58:06,730 และเรากำลังจะให้พิมพ์ลงในกล่องสีขาวที่ใหญ่กว่ามี 860 00:58:06,730 --> 00:58:09,220 เรากำลังจะเริ่มต้นด้วย i0 และจากนั้นเราจะสะท้อนมัน 861 00:58:09,220 --> 00:58:12,670 ดังนั้นจึงมี 0 862 00:58:12,670 --> 00:58:15,210 แล้วเรากำลังจะเพิ่มขึ้นทีละห่วงสำหรับที่ 863 00:58:15,210 --> 00:58:17,810 แล้วมันจะเป็นค่า 1 864 00:58:17,810 --> 00:58:20,070 หนึ่งคือน้อยกว่า 3 ดังนั้นมันจะผ่านไปที่ห่วง 865 00:58:20,070 --> 00:58:23,230 แล้วเราจะเห็นมันอีกครั้งที่พิมพ์ 866 00:58:23,230 --> 00:58:25,520 เรากำลังจะเพิ่มขึ้นอีกครั้งเพื่อที่ 2, 867 00:58:25,520 --> 00:58:29,860 และ 2 น้อยกว่า 3 ดังนั้นจึงจะผ่านการวนและมันจะพิมพ์ 2 868 00:58:29,860 --> 00:58:35,100 แล้วคุณจะทราบว่า 3 ไม่น้อยกว่า 3 ดังนั้นเราจะแยกออกจากการวน 869 00:58:35,100 --> 00:58:40,050 ดังนั้นตอนนี้เราได้ออกมาแล้วเราจะไปลงใน AFunction 870 00:58:40,050 --> 00:58:45,010 ถูก ดังนั้นคุณต้องทราบว่าตัวแปรนี้ที่เราได้สร้างขึ้น 871 00:58:45,010 --> 00:58:48,270 'i' ตัวแปรไม่ได้กำหนดขอบเขตในท้องถิ่น 872 00:58:48,270 --> 00:58:50,280 นั่นหมายความว่ามันไม่ได้เป็นท้องถิ่นที่จะห่วง 873 00:58:50,280 --> 00:58:58,060 และตัวแปรที่เรายังสามารถเข้าถึงและเปลี่ยนแปลงหลังจากนั้นและมันจะยังคงเป็นที่มีประสิทธิภาพ 874 00:58:58,060 --> 00:59:02,160 ดังนั้นถ้าคุณไปในการทำงานตอนนี้คุณจะเห็นว่าเรายังใช้ 'i' ตัวแปร 875 00:59:02,160 --> 00:59:05,320 และเรากำลังจะเพิ่ม 'i' + + 876 00:59:05,320 --> 00:59:09,410 คุณจะคิดว่าเป็นครั้งแรกที่อยู่บนพื้นฐานของซีว่าที่สำเนาของ 'i' ตัวแปร 877 00:59:09,410 --> 00:59:12,830 มันเป็นสิ่งที่แตกต่างกันโดยสิ้นเชิงซึ่งเป็นที่ถูกต้อง 878 00:59:12,830 --> 00:59:16,560 ดังนั้นเมื่อเราพิมพ์เรากำลังจะพิมพ์ 'i' + + ซึ่งจะพิมพ์ออกมาที่ 4 879 00:59:16,560 --> 00:59:19,640 แล้วเราจะไป - ขอโทษ 880 00:59:19,640 --> 00:59:22,030 แล้วเรากำลังจะจบออกมาจากฟังก์ชั่นที่ 881 00:59:22,030 --> 00:59:24,820 และเรากำลังจะเป็นที่ลูกศรที่ถูกต้องในขณะนี้ 882 00:59:24,820 --> 00:59:29,190 นั่นหมายความว่าแล้ว แต่แม้ฟังก์ชั่นการเปลี่ยนแปลงค่าของ 'i', 883 00:59:29,190 --> 00:59:32,620 มันไม่ได้มีการเปลี่ยนแปลงด้านนอกของฟังก์ชั่น 884 00:59:32,620 --> 00:59:35,060 เพราะฟังก์ชั่นมีขอบเขตที่แยกต่างหาก 885 00:59:35,060 --> 00:59:38,960 นั่นหมายความว่าเมื่อเรา echo 'i' ก็ไม่ได้เปลี่ยนแปลงในขอบเขตของฟังก์ชั่นที่ 886 00:59:38,960 --> 00:59:43,660 และอื่น ๆ แล้วเรากำลังจะพิมพ์ 3 อีกครั้ง 887 00:59:43,660 --> 00:59:47,520 สิ่งที่แตกต่างกันเกี่ยวกับขอบเขตใน PHP กว่าใน C. 888 00:59:47,520 --> 00:59:51,130 >> ตอนนี้ใน PHP และ HTML 889 00:59:51,130 --> 00:59:53,510 PHP ใช้ในการทำหน้าเว็บแบบไดนามิก 890 00:59:53,510 --> 00:59:58,660 ชนิดของมันทำให้สิ่งที่แตกต่างกัน 891 00:59:58,660 --> 01:00:02,090 เรามีมันแตกต่างจาก HTML 892 01:00:02,090 --> 01:00:05,230 กับ HTML เรามักจะมีเพียงสิ่งเดียวที่คงที่เช่นเดียวกับวิธีการที่ร็อบแสดงให้เห็น 893 01:00:05,230 --> 01:00:09,370 ขณะที่ PHP, คุณสามารถเปลี่ยนสิ่งที่ขึ้นอยู่กับการที่ผู้ใช้เป็น 894 01:00:09,370 --> 01:00:11,830 ดังนั้นถ้าฉันมีนี้ผมได้ "คุณล็อกอินเป็น -" แล้วชื่อ 895 01:00:11,830 --> 01:00:14,420 และฉันสามารถเปลี่ยนชื่อ ดังนั้นตอนนี้ชื่อเป็นโจเซฟ 896 01:00:14,420 --> 01:00:18,880 และมี "เกี่ยวกับฉัน" แต่แล้วฉันยังสามารถเปลี่ยนชื่อที่จะมีทอมมี่ 897 01:00:18,880 --> 01:00:21,700 และนั่นจะเป็นสิ่งที่แตกต่างกัน 898 01:00:21,700 --> 01:00:23,840 ดังนั้นแล้วเรายังสามารถเปลี่ยนสิ่งที่แตกต่างกันเกี่ยวกับเขา 899 01:00:23,840 --> 01:00:27,070 และจะแสดงเนื้อหาที่แตกต่างกันขึ้นอยู่กับชื่อ 900 01:00:27,070 --> 01:00:31,430 ดังนั้น PHP ชนิดของสามารถเปลี่ยนแปลงสิ่งที่เกิดขึ้นในเว็บไซต์ของคุณ 901 01:00:31,430 --> 01:00:33,540 เดียวกันที่นี่ ยังทราบว่าพวกเขามีเนื้อหาที่แตกต่างกัน 902 01:00:33,540 --> 01:00:38,870 แม้ว่าคุณจะได้ในทางเทคนิคยังคงเข้าถึงหน้าเว็บที่เดียวกันบนพื้นผิว 903 01:00:38,870 --> 01:00:43,450 สร้าง HTM​​L มี 2​​ วิธีที่แตกต่างกันที่คุณสามารถทำเช่นนี้ 904 01:00:43,450 --> 01:00:48,980 ดังนั้นเราจะผ่านไปในขณะที่ตอนนี้ วิธีแรกคือคุณต้อง - ใช่ขอโทษ 905 01:00:48,980 --> 01:00:51,150 ดังนั้นคุณก็ต้องปกติของคุณสำหรับวงใน PHP 906 01:00:51,150 --> 01:00:56,270 แล้วคุณจะสะท้อนใน PHP และคุณสะท้อนออก HTML 907 01:00:56,270 --> 01:00:58,720 การใช้สิ่งที่ร็อบแสดงให้เห็นว่าคุณของสคริปต์ HTML 908 01:00:58,720 --> 01:01:04,030 แล้วใช้พิมพ์ PHP เพื่อเพียงแค่พิมพ์ออกไปยังหน้าเว็บ 909 01:01:04,030 --> 01:01:09,520 ทางเลือกหนึ่งคือการทำมันเป็นถ้าคุณแยกออกจาก PHP และ HTML 910 01:01:09,520 --> 01:01:11,940 ดังนั้นคุณจึงสามารถมีสายของ PHP ที่จะเริ่มต้นการวน 911 01:01:11,940 --> 01:01:16,020 แล้วคุณสามารถมีสายของ HTM​​L ในเป็นสิ่งที่แยกจากกัน 912 01:01:16,020 --> 01:01:19,700 แล้วคุณจะจบวงอีกครั้งกับ PHP 913 01:01:19,700 --> 01:01:21,800 จึงแยกชนิดของมันออกมา 914 01:01:21,800 --> 01:01:24,020 ที่ด้านซ้ายคุณสามารถที่คุณมี - 915 01:01:24,020 --> 01:01:26,360 ก็เพียง 1 ก้อน PHP 916 01:01:26,360 --> 01:01:28,510 ด้านขวาคุณจะเห็นว่าคุณมีสายของ PHP, 917 01:01:28,510 --> 01:01:32,540 คุณมีสายของ HTM​​L และคุณมีสายของ PHP อีกครั้ง 918 01:01:32,540 --> 01:01:36,870 ดังนั้นการแยกมันออกมาเป็นสิ่งที่พวกเขากำลังทำ 919 01:01:36,870 --> 01:01:39,330 และคุณจะทราบว่าวิธีการอย่างใดอย่างหนึ่งอย่างใดอย่างหนึ่งของพวกเขา 920 01:01:39,330 --> 01:01:41,980 พวกเขายังคงพิมพ์ออกภาพ, ภาพ, ภาพ, 921 01:01:41,980 --> 01:01:44,540 เพื่อ HTML ที่ยังคงมีการพิมพ์แบบเดียวกับที่ 922 01:01:44,540 --> 01:01:49,870 แล้วคุณยังจะเห็นภาพที่ 3 แสดงขึ้นบนเว็บไซต์ของคุณ 923 01:01:49,870 --> 01:01:52,820 ดังนั้นจึงเป็น 2 วิธีที่แตกต่างกันของการทำสิ่งเดียวกัน 924 01:01:52,820 --> 01:01:55,060 >> ตอนนี้เรามีรูปแบบและการร้องขอ ขณะที่ร็อบแสดงให้เห็นว่าคุณ 925 01:01:55,060 --> 01:01:59,400 มีรูปแบบของภาษาและเราก็จะสายลมผ่านทางนี้ 926 01:01:59,400 --> 01:02:02,040 คุณมีการดำเนินการและคุณมีวิธีการและการกระทำของคุณ 927 01:02:02,040 --> 01:02:04,350 แสดงให้เห็นชนิดของคุณที่คุณกำลังจะส่งมันและวิธีการที่ไม่ว่าจะเป็น 928 01:02:04,350 --> 01:02:06,960 มันจะเป็น GET หรือ POST 929 01:02:06,960 --> 01:02:11,220 และ GET ขอเป็นร็อบกล่าวว่าหมายความว่าคุณจะใส่มันในรูปแบบ 930 01:02:11,220 --> 01:02:15,760 และคุณจะเห็นว่ามันเป็น URL ในขณะที่คำขอ POST คุณจะไม่เห็นอยู่ใน URL 931 01:02:15,760 --> 01:02:17,840 ดังนั้นความแตกต่างเล็กน้อย 932 01:02:17,840 --> 01:02:19,950 แต่สิ่งหนึ่งที่เป็นสิ่งที่คล้ายกัน 933 01:02:19,950 --> 01:02:22,560 คือการโพสต์และได้รับอย่างเท่าเทียมกันเป็นที่ไม่ปลอดภัย 934 01:02:22,560 --> 01:02:26,430 ดังนั้นคุณอาจจะคิดว่าเพียงเพราะคุณไม่เห็นมันใน URL 935 01:02:26,430 --> 01:02:28,790 นั่นหมายความว่าการโพสต์ที่มีความปลอดภัยมากขึ้น 936 01:02:28,790 --> 01:02:34,420 แต่คุณยังสามารถดูได้ในคุกกี้ของคุณในข้อมูลที่คุณกำลังส่ง 937 01:02:34,420 --> 01:02:38,260 จึงไม่คิดว่าเกี่ยวกับการอย่างใดอย่างหนึ่งหรืออื่น ๆ 938 01:02:38,260 --> 01:02:42,160 สิ่งที่ควรทราบก็คือว่าคุณยังมีตัวแปรส่วน 939 01:02:42,160 --> 01:02:45,850 พวกคุณใช้วิธีนี้ใน pset 7 จะได้รับข้อมูลรหัสผู้ใช้ของคุณ 940 01:02:45,850 --> 01:02:48,550 สิ่งที่เกิดขึ้นคือการที่คุณสามารถใช้อาเรย์นี้ 941 01:02:48,550 --> 01:02:53,310 $ _SESSION และจากนั้นคุณจะสามารถเข้าถึงสิ่งที่แตกต่างกัน 942 01:02:53,310 --> 01:02:57,720 และเก็บสิ่งที่แตกต่างกันทั่วหน้า 943 01:02:57,720 --> 01:03:00,750 >> สิ่งสุดท้ายคือเรามี SQL, Structured Query Language, 944 01:03:00,750 --> 01:03:04,360 และนี่คือภาษาการเขียนโปรแกรมในการจัดการฐานข้อมูล 945 01:03:04,360 --> 01:03:08,220 สิ่งที่ว่าฐานข้อมูลมีอะไรบ้าง พวกเขาคอลเลกชันของตาราง 946 01:03:08,220 --> 01:03:10,630 และในแต่ละตารางสามารถมีชนิดที่คล้ายกันของวัตถุ 947 01:03:10,630 --> 01:03:14,990 ดังนั้นเราจึงมีตารางของผู้ใช้ใน pset การเงินของคุณ 948 01:03:14,990 --> 01:03:20,610 และทำไมพวกเขามีประโยชน์ เพราะมันเป็นวิธีการในการจัดเก็บข้อมูลอย่างถาวร 949 01:03:20,610 --> 01:03:22,840 ซึ่งเป็นวิธีการในการติดตามสิ่งที่และการจัดการสิ่ง 950 01:03:22,840 --> 01:03:25,890 และที่จริงเห็นมันบนหน้าเว็บที่แตกต่างกันและการติดตาม 951 01:03:25,890 --> 01:03:29,930 ในขณะที่ถ้าคุณเพียงแค่เก็บไว้ที่ว่าช่วงเวลาหนึ่งได้ทันที 952 01:03:29,930 --> 01:03:33,720 แล้วใช้ต่อมาคุณจะไม่สามารถเข้าถึงสิ่งที่คุณได้บันทึกไว้ 953 01:03:33,720 --> 01:03:37,660 เรามี 4 สิ่งที่สำคัญที่เราใช้สำหรับคำสั่ง 954 01:03:37,660 --> 01:03:40,190 เรามีให้เลือกแทรกลบและการปรับปรุง 955 01:03:40,190 --> 01:03:42,880 เหล่านี้เป็นสิ่งสำคัญมากสำหรับคุณผู้ชายที่จะรู้ว่าสำหรับคำถามของคุณ 956 01:03:42,880 --> 01:03:45,990 >> เราได้อย่างรวดเร็วจะเลือกไปกว่าตอนนี้ 957 01:03:45,990 --> 01:03:48,540 โดยทั่วไปคุณกำลังเลือกแถวจากฐานข้อมูล 958 01:03:48,540 --> 01:03:52,400 ดังนั้นหากคุณมีที่นี่ - 959 01:03:52,400 --> 01:03:56,740 เหล่านี้เรามี 2 สิ่งที่แตกต่างกันและเราต้องการที่จะเลือกจากตารางเรียน 960 01:03:56,740 --> 01:04:01,480 ที่น่ากลัว - ที่น่ากลัวในคอลัมน์ค่าเป็น 1 961 01:04:01,480 --> 01:04:04,460 เพื่อให้คุณสามารถดูที่นี่เรามี 2 สิ่งเหล่านี้ชื่อชั้น 962 01:04:04,460 --> 01:04:08,490 CS50 และ Stat110 และเรามีรหัสที่ชั้นเรียนและสโลแกน 963 01:04:08,490 --> 01:04:13,150 ดังนั้นเราจึงต้องการที่จะเลือกทั้งหมดของข้อมูลที่ 964 01:04:13,150 --> 01:04:17,480 แล้วคุณจะเห็นว่าที่นี่เป็นประเภทของการเลือกออกมาจากคอลัมน์ที่น่ากลัวว่า 965 01:04:17,480 --> 01:04:25,170 ที่ทุกสิ่งที่เป็น 1 แล้วก็มีชั้น ID, ชื่อชั้นและสโลแกนที่ว่ามันสามารถเลือกออก 966 01:04:25,170 --> 01:04:28,100 วิธีการว่าคุณจะทำในรหัส? คุณมีการใช้ PHP 967 01:04:28,100 --> 01:04:33,830 เพื่อให้เป็นชนิดของวิธี PHP และ SQL ที่เกี่ยวข้องกับแต่ละอื่น 968 01:04:33,830 --> 01:04:38,130 ตอนนี้เรามีรหัสของเราและเรากำลังจะใช้ฟังก์ชั่นการค้นหาของเรา 969 01:04:38,130 --> 01:04:41,370 ในขณะที่เราไม่ได้ทำใน pset 7 และเรากำลังจะเรียกใช้แบบสอบถาม SQL 970 01:04:41,370 --> 01:04:43,870 แล้วเรากำลังจะมี - 971 01:04:43,870 --> 01:04:46,280 เรามักจะมีการตรวจสอบว่าแถวที่สามเท่ากันถ้าเท็จ 972 01:04:46,280 --> 01:04:49,010 ดังนั้นอีกครั้งคุณต้องการที่จะตรวจสอบชนิดและค่า 973 01:04:49,010 --> 01:04:53,880 แล้วถ้ามันไม่ทำงานแล้วคุณต้องการที่จะขอโทษตามปกติเช่นเดียวกับที่เราทำใน pset 7 974 01:04:53,880 --> 01:04:55,870 มิฉะนั้นคุณต้องการที่จะห่วงผ่านทุกอย่างด้วยประโยชน์เหล่านั้น 975 01:04:55,870 --> 01:04:59,410 foreach ลูปที่เราเพิ่งไปกว่า 976 01:04:59,410 --> 01:05:01,280 ตอนนี้ที่เรากำลังวนลูปผ่านและเราได้ทำให้มันผ่านมา 977 01:05:01,280 --> 01:05:05,080 สมมติว่าแบบสอบถามของเราผ่านไปตอนนี้เรามีห่วง foreach ของเรา 978 01:05:05,080 --> 01:05:11,050 แถวแรกที่มันได้ดังนั้นนี่คือแถวขวานี่มันชนิดบรรจุกล่อง 979 01:05:11,050 --> 01:05:14,010 มันจะพิมพ์ข้อมูลทั้งหมดที่อากาศ 980 01:05:14,010 --> 01:05:18,070 ดังนั้นมันจะพิมพ์ออกมาที่ด้านล่าง "อยากเรียนรู้ HTML ได้ไหม?" 981 01:05:18,070 --> 01:05:23,370 จากนั้นก็จะไปที่แถวถัดไปเพราะเสร็จครั้งแรกสำหรับวง 982 01:05:23,370 --> 01:05:26,510 และอื่น ๆ จากนั้นก็จะพิมพ์ออกมาบรรทัดที่สองของมัน 983 01:05:26,510 --> 01:05:32,120 ซึ่งเป็นไปได้ STAT110 หาช่วงเวลาทั้งหมด 984 01:05:32,120 --> 01:05:34,290 >> สิ่งหนึ่งที่สุดท้ายคือใน SQL ช่องโหว่ 985 01:05:34,290 --> 01:05:37,300 ฉันรู้ว่าเดวิดสัมผัสเกี่ยวกับเรื่องนี้นิด ๆ หน่อย ๆ ในการบรรยาย 986 01:05:37,300 --> 01:05:40,730 คุณสามารถอ่านได้ในภายหลัง มันตลกจริงๆ 987 01:05:40,730 --> 01:05:45,320 SQL ฉีดเป็นชนิดของสิ่งที่ยุ่งยาก 988 01:05:45,320 --> 01:05:49,890 สมมติว่าคุณเพียงแค่ติดตัวแปรเหล่านั้นลงในแบบสอบถามของคุณ 989 01:05:49,890 --> 01:05:52,290 อย่างที่คุณเห็นในบรรทัดแรกว่า 990 01:05:52,290 --> 01:05:54,520 ดังนั้นดูเหมือนว่าดีใช่มั้ย คุณเพียงแค่ใส่ในชื่อผู้ใช้ 991 01:05:54,520 --> 01:05:58,820 และรหัสผ่านเพื่อแบบสอบถามของคุณและคุณต้องการที่จะส่งออกและได้รับสิ่งที่อยู่ในตารางข้อมูลของคุณ 992 01:05:58,820 --> 01:06:01,450 ที่ดูเหมือนง่ายสวย เพื่อช่วยให้ว่ามีคนทำให้ใน 993 01:06:01,450 --> 01:06:04,910 สำหรับรหัสผ่านนี้หรือข้อความที่นี่ - 994 01:06:04,910 --> 01:06:06,780 จริงควรจะอยู่ในกล่องสีแดง 995 01:06:06,780 --> 01:06:11,920 จึงขอบอกว่าพวกเขาใส่รหัสผ่านที่เป็น - นั่นคือสิ่งที่พวกเขาเข้าสู่ 996 01:06:11,920 --> 01:06:16,520 ดังนั้นพวกเขากำลังวางหรือ "1" = 1 997 01:06:16,520 --> 01:06:20,880 ชนิดของรหัสผ่านที่โง่ที่จะมี 998 01:06:20,880 --> 01:06:25,070 ตอนนี้ขอเพียงแค่แทนที่ในและคุณจะทราบว่าในแบบสอบถามว่าตอนนี้ 999 01:06:25,070 --> 01:06:29,090 จะประเมินให้เป็นจริงเสมอเพราะคุณจะทราบว่า 1000 01:06:29,090 --> 01:06:32,240 คุณสามารถสอบถาม SQL เลือกข้อมูลทั้งหมดนี้ 1001 01:06:32,240 --> 01:06:35,420 หรือคุณก็สามารถมี 1 = 1 1002 01:06:35,420 --> 01:06:41,030 เพื่อให้เสมอไปประเมินให้เป็นจริง 1003 01:06:41,030 --> 01:06:46,610 ที่ไม่ได้ไปทำงานจริงๆเพราะนั่นหมายความว่าแฮกเกอร์สามารถเจาะเข้าสู่ระบบของคุณ 1004 01:06:46,610 --> 01:06:49,300 วิธีแก้ปัญหานี้คือการที่คุณต้องใช้ระบบ PDO, 1005 01:06:49,300 --> 01:06:51,360 ซึ่งหมายความว่าคุณต้องใช้เครื่องหมายคำถาม 1006 01:06:51,360 --> 01:06:53,350 ซึ่งเป็นสิ่งที่พวกที่ใช้ใน pset 7 คุณ 1007 01:06:53,350 --> 01:06:57,620 ที่คุณกำลังจะใช้เครื่องหมายคำถามในสถานที่ที่คุณต้องการที่จะนำบางสิ่งบางอย่าง 1008 01:06:57,620 --> 01:07:01,430 แล้วคุณจะมีเครื่องหมายจุลภาคและจากนั้นคุณจะมีหลังจากนั้น 1009 01:07:01,430 --> 01:07:07,610 หลังจากสตริงของตัวแปรที่แตกต่างกันที่คุณต้องการที่จะเปลี่ยนเป็นเครื่องหมายคำถามของคุณ 1010 01:07:07,610 --> 01:07:10,330 ดังนั้นคุณจะทราบที่นี่ที่ตอนนี้ฉันมีเหล่านี้เครื่องหมายคำถามสีแดง 1011 01:07:10,330 --> 01:07:15,420 จากนั้นฉันใส่ตัวแปรหลังจากสตริงของฉันเพื่อให้ฉันรู้ว่าจะเข้ามาแทนที่พวกเขาเพื่อที่หลังจากนั้น 1012 01:07:15,420 --> 01:07:18,470 ที่จะตรวจสอบให้แน่ใจว่าถ้ามีคนไม่ได้เช่นนี้ 1013 01:07:18,470 --> 01:07:24,050 และพวกเขามีหรือ 1 = 1 สถานการณ์ที่จะทำให้แน่ใจว่า 1014 01:07:24,050 --> 01:07:30,490 ในท้ายที่สุดกลับให้แน่ใจว่ามันจะไม่จริงทำลายแบบสอบถาม 1015 01:07:30,490 --> 01:07:33,660 เอาล่ะเพื่อให้มันสวยมาก, ลมกรดของ PHP และ SQL 1016 01:07:33,660 --> 01:07:41,520 โชคดีที่สุดของคุณทุกคนและตอนนี้ที่โอเรกอน 1017 01:07:41,520 --> 01:07:44,270 >> [Oreoluwatomiwa Babarinsa] ทุกคนโอเค เวลาที่จะไปกว่าบาง JavaScript 1018 01:07:44,270 --> 01:07:48,840 และบางสิ่งอื่น ๆ ได้อย่างรวดเร็วดังนั้นเราจึงไม่ถือค​​ุณขึ้นในคืนนี้ 1019 01:07:48,840 --> 01:07:56,930 JavaScript ใช่ JavaScript เป็นชนิดของสิ่งที่เย็นต้นฉบับ 1020 01:07:56,930 --> 01:07:59,090 สิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับ JavaScript ก็จัดเรียงของชอบ 1021 01:07:59,090 --> 01:08:03,810 ปลายฝั่งไคลเอนต์ของสิ่งที่ app เว็บของคุณจะต้องทำ 1022 01:08:03,810 --> 01:08:08,280 มีบางสิ่งบางอย่างที่คุณเพียงแค่ไม่ต้องการที่จะดูแลตลอดเวลาในฝั่งเซิร์ฟเวอร์เป็น 1023 01:08:08,280 --> 01:08:12,880 ทั้งหมดปฏิสัมพันธ์น้อยเน้นสิ่งหนึ่งที่ทำให้บางสิ่งบางอย่างหายไป 1024 01:08:12,880 --> 01:08:15,340 คุณจริงๆไม่ต้องการให้มีการพูดคุยกับเซิร์ฟเวอร์ของคุณตลอดเวลาที่ 1025 01:08:15,340 --> 01:08:18,069 และบางส่วนของที่ไม่ได้เป็นไปได้ที่จะทำในฝั่งเซิร์ฟเวอร์ 1026 01:08:18,069 --> 01:08:21,899 นี่คือเหตุผลที่เราต้องการบางสิ่งบางอย่างเช่น JavaScript 1027 01:08:21,899 --> 01:08:24,359 สิ่งดีๆเกี่ยวกับ JavaScript: เป็นพิมพ์แบบไดนามิก 1028 01:08:24,359 --> 01:08:27,149 สิ่งนี้หมายความว่าโปรแกรมของคุณไม่จำเป็นต้องรู้ 1029 01:08:27,149 --> 01:08:30,970 สิ่งที่ว่าตัวแปรที่มีเมื่อคุณเขียนมันออกมา 1030 01:08:30,970 --> 01:08:34,510 มันจะเป็นเพียงการเรียงลำดับของตัวเลขออกที่มีการใช้ 1031 01:08:34,510 --> 01:08:37,520 สิ่งอื่น ๆ ที่จะเย็นเกี่ยวกับมันมันเป็นภาษารั้งหยิก 1032 01:08:37,520 --> 01:08:41,359 ซึ่งหมายความว่าไวยากรณ์ที่คล้ายกับ C และ PHP 1033 01:08:41,359 --> 01:08:47,050 คุณไม่ต้องทำปรับปรุงมากเมื่อคุณเรียนรู้ JavaScript 1034 01:08:47,050 --> 01:08:49,180 ที่นี่เรามีนิด ๆ หน่อย ๆ ของ JavaScript 1035 01:08:49,180 --> 01:08:52,560 สิ่งที่น่าสนใจที่นี่คือว่าถ้าคุณมองไปที่มัน 1036 01:08:52,560 --> 01:08:56,330 เรามีเกร็ดความ JavaScript มีสิทธิ์ในแท็กหัว 1037 01:08:56,330 --> 01:08:59,479 อะไรคือสิ่งที่ไม่เป็นพื้นเพียงรวมถึงไฟล์ JavaScript 1038 01:08:59,479 --> 01:09:02,260 นี้เป็นวิธีหนึ่งที่คุณสามารถรวมจาวาสคริปต์ลงในโปรแกรมของคุณ 1039 01:09:02,260 --> 01:09:06,910 แล้วนิด ๆ หน่อย ๆ ที่สองเป็นจริงบางอย่างที่ใกล้เคียงกับ JavaScript 1040 01:09:06,910 --> 01:09:10,790 คล้ายกันมากกับรูปแบบอินไลน์ด้วย CSS, 1041 01:09:10,790 --> 01:09:16,180 และคุณเพียงแค่เขียนรหัสบางอย่างรวดเร็วมี 1042 01:09:16,180 --> 01:09:18,120 JavaScript มีอาร์เรย์ 1043 01:09:18,120 --> 01:09:20,850 เพียงวิธีการเก็บข้อมูลไปรอบ ๆ ที่มีประโยชน์มากอื่น 1044 01:09:20,850 --> 01:09:25,180 ไวยากรณ์อย่างดีและง่าย 1045 01:09:25,180 --> 01:09:29,870 คุณสามารถใช้วงเล็บในการเข้าถึงทุกอย่างและให้ทุกอย่างเข้าด้วยกัน 1046 01:09:29,870 --> 01:09:35,020 ไม่มีอะไรซับซ้อนเกินไป 1047 01:09:35,020 --> 01:09:38,630 สิ่งดีๆเกี่ยวกับ JavaScript และภาษาสคริปต์ทั่วไป 1048 01:09:38,630 --> 01:09:40,920 คือการที่คุณไม่ต้องกังวลเกี่ยวกับขนาดอาร์เรย์ 1049 01:09:40,920 --> 01:09:43,880 คุณก็สามารถใช้ array.length และติดตามมัน 1050 01:09:43,880 --> 01:09:46,960 และอาเรย์สามารถเติบโตหรือหดตัวตามที่คุณต้องการไป 1051 01:09:46,960 --> 01:09:49,279 ดังนั้นคุณจึงไม่จำเป็นต้องกังวลเกี่ยวกับการเรียงลำดับของการใด ๆ 1052 01:09:49,279 --> 01:09:57,050 โอ้ไม่ฉันต้องจัดสรรสิ่งที่มากขึ้นหรืออะไรอย่างนั้น 1053 01:09:57,050 --> 01:10:00,090 >> สิ่งดีๆที่นี่คือ JavaScript มีสิ่งที่เรียกว่าวัตถุ 1054 01:10:00,090 --> 01:10:04,800 มันเป็นภาษาเชิงวัตถุดังนั้นสิ่งที่จะได้คือเป็นหลัก 1055 01:10:04,800 --> 01:10:10,100 วิธีที่คุณจะจัดกลุ่มข้อมูลด้วยกันค่อนข้างคล้ายกับ struct, 1056 01:10:10,100 --> 01:10:17,280 แต่คุณสามารถเข้าถึงได้เช่น struct หรือไวยากรณ์ในอาร์เรย์ที่สมาคม 1057 01:10:17,280 --> 01:10:22,520 มันง่ายสวยและสิ่งที่คุณสามารถทำอะไรกับข้อมูลนี้เป็นกลุ่มร่วมกัน 1058 01:10:22,520 --> 01:10:24,810 ถ้าคุณมีพวงของข้อมูลที่เกี่ยวข้อง 1059 01:10:24,810 --> 01:10:26,850 เพราะทุกสิ่งที่คุณต้องการที่จะอธิบายรถ 1060 01:10:26,850 --> 01:10:29,050 คุณไม่จำเป็นที่จะมีมันในเครือของสถ​​านที่ที่แตกต่างกัน 1061 01:10:29,050 --> 01:10:35,300 คุณก็สามารถติดลง 1 วัตถุใน JavaScript 1062 01:10:35,300 --> 01:10:39,090 ในขณะที่คุณอาจรู้ iterating เป็นหนึ่งในงานที่น่าเบื่อเหล่านั้น 1063 01:10:39,090 --> 01:10:43,810 คุณเพียงแค่ทำมันซ้ำอีกครั้งในช่วง คุณจำเป็นต้องพูดคุยกับวัตถุทุกคนในรถ 1064 01:10:43,810 --> 01:10:47,340 หรือคุณต้องไปผ่านทุกรายการในรายการหรือสิ่งที่ต้องการที่ 1065 01:10:47,340 --> 01:10:51,770 ดังนั้น JavaScript มีคล้ายกับ PHP, ไวยากรณ์ foreach 1066 01:10:51,770 --> 01:10:54,590 ในกรณีนี้จะเป็นสำหรับในวง 1067 01:10:54,590 --> 01:10:57,300 คุณต้องการที่จะใช้นี้เฉพาะในวัตถุ 1068 01:10:57,300 --> 01:11:01,030 มีปัญหาบางอย่างที่เกิดขึ้นถ้าคุณใช้นี้ในอาร์เรย์เป็น 1069 01:11:01,030 --> 01:11:03,750 มันมักจะเป็นหนึ่งในสิ่งเหล่านั้นได้ว่าเป็นประโยชน์อย่างมาก 1070 01:11:03,750 --> 01:11:06,590 เพราะคุณกำจัดมากของค่าใช้จ่าย 1071 01:11:06,590 --> 01:11:10,270 เพราะคุณจะได้ไม่ต้องดึงทุกอย่างในวัตถุของคุณด้วยตัวเอง 1072 01:11:10,270 --> 01:11:12,300 คุณไม่ต้องจำชื่อทั้งหมดที่สำคัญ 1073 01:11:12,300 --> 01:11:18,270 คุณเพียงแค่การจัดเรียงของพวกเขาได้รับกลับมาในรูปแบบนี้ 1074 01:11:18,270 --> 01:11:21,500 ในเรื่องนี้ด้วยสำหรับคุณเพียงต้องการที่จะจำ 1075 01:11:21,500 --> 01:11:27,180 ว่าคุณได้รับกลับคีย์ทั้งหมดในทางที่คล้ายกับตารางแฮช 1076 01:11:27,180 --> 01:11:30,880 ถ้าคุณจำจากนั้นเมื่อคุณจะใส่ในสตริงคุณจะได้รับสิ่งที่ออก 1077 01:11:30,880 --> 01:11:33,840 ที่จะมีค่าที่เกี่ยวข้องกับมัน 1078 01:11:33,840 --> 01:11:36,360 คุณสามารถทำอะไรกับเรื่องนี้ก็คือค​​ุณสามารถพูดได้ว่าสิทธิทั้งหมด 1079 01:11:36,360 --> 01:11:42,120 ฉันใส่ในรถและผมเรียกมันว่าเฟอร์รารี 1080 01:11:42,120 --> 01:11:45,290 เพื่อให้คุณสามารถใส่ในสตริงเฟอร์รารีอีกครั้งในภายหลังและคุณสามารถได้รับที่ออก 1081 01:11:45,290 --> 01:11:50,000 และคุณสามารถทำเช่นนั้นได้ในวงด้วยในวง 1082 01:11:50,000 --> 01:11:53,320 ดังนั้นเพียงแค่เพิ่มเติมเกี่ยวกับวัตถุ สิ่งที่สำคัญจากนี้คุณต้องจำไว้ 1083 01:11:53,320 --> 01:12:00,340 คือการที่คุณสามารถใช้โครงสร้างวัตถุเช่นไวยากรณ์เมื่อใดก็ตามที่คุณต้องการด้วยเหล่านี้ 1084 01:12:00,340 --> 01:12:04,590 ยกเว้นถ้าสิ่งที่เกิดขึ้นในการใช้เป็นสตริงไม่ได้เป็นชื่อตัวแปรที่ถูกต้อง 1085 01:12:04,590 --> 01:12:07,650 ดังนั้นถ้าคุณดูที่ว่ามีเรามีกุญแจที่มีช่องว่าง 1086 01:12:07,650 --> 01:12:12,500 ดีถ้าคุณกำลังจะวาง object.key พื้นที่ที่มีพื้นที่ว่าง 1087 01:12:12,500 --> 01:12:15,320 ที่เพิ่งจะได้ทำให้ความรู้สึก syntactically 1088 01:12:15,320 --> 01:12:22,730 เพื่อให้คุณสามารถทำที่มีการเรียงลำดับของไวยากรณ์วงเล็บนี้ 1089 01:12:22,730 --> 01:12:26,520 >> นอกจากนี้ JavaScript เป็นมากขอบเขตฉลาด PHP 1090 01:12:26,520 --> 01:12:29,050 คุณมี 2 วิธีในการที่อยู่ในขอบเขต 1091 01:12:29,050 --> 01:12:31,960 คุณไม่สามารถมี var ที่ด้านหน้าของตัวแปร 1092 01:12:31,960 --> 01:12:34,060 และที่หมายถึงนี้เป็นระดับโลก 1093 01:12:34,060 --> 01:12:37,050 คุณสามารถดูได้จากที่ใดก็ได้ แม้ว่าคุณจะใส่ในกรณีที่คำสั่ง 1094 01:12:37,050 --> 01:12:42,430 ที่ใดในรหัสของคุณหลังจากจุดที่คุณสามารถมองเห็นตัวแปรที่ 1095 01:12:42,430 --> 01:12:46,730 อีกสิ่งหนึ่งที่แม้ว่าจะมี var ก็ จำกัด ให้สิ่งที่ฟังก์ชั่นที่คุณกำลังเข้า 1096 01:12:46,730 --> 01:12:48,870 หากคุณไม่ได้อยู่ในฟังก์ชั่นที่ดีก็ทั่วโลก 1097 01:12:48,870 --> 01:12:53,900 แต่ถ้าคุณอยู่ในฟังก์ชั่นเป็นเพียงการมองเห็นภายในฟังก์ชั่นที่ 1098 01:12:53,900 --> 01:12:56,420 ผมไม่ได้มีตัวอย่าง แต่ใช่ มันเป็นหนึ่งในสิ่งเหล่านั้นที่ 1099 01:12:56,420 --> 01:12:59,900 คุณสามารถจัดการสิ่งที่ตัวแปรที่คุณต้องการที่จะทั่วโลก 1100 01:12:59,900 --> 01:13:03,810 สิ่งที่ตัวแปรที่คุณอยากจะเป็นท้องถิ่น แต่คุณจะต้องระมัดระวังเกี่ยวกับเรื่องนี้ 1101 01:13:03,810 --> 01:13:06,890 เพราะคุณไม่ได้มีประเภทของการควบคุมเม็ดละเอียดที่คุณทำใน C, 1102 01:13:06,890 --> 01:13:15,820 ที่ว่าสิ่งที่มีการประกาศในการวนก็จะไปอยู่ในที่สำหรับวง 1103 01:13:15,820 --> 01:13:18,790 สิ่งที่เราจะดูแลเกี่ยวกับการใช้งานจาวาสคริปต์เพื่อที่จะจัดการกับหน้าเว็บใช่ไหม 1104 01:13:18,790 --> 01:13:21,800 ผมหมายถึงว่าทำไมเรากำลังทำอยู่นี้ 1105 01:13:21,800 --> 01:13:23,840 >> ต้องการทำเช่นนั้นเราจะใช้สิ่งที่เรียกว่า DOM 1106 01:13:23,840 --> 01:13:25,850 แบบวัตถุของเอกสาร 1107 01:13:25,850 --> 01:13:29,430 โดยทั่วไปสิ่งที่มันไม่เป็นมันจะใช้เวลาทั้งหมด HTML ของคุณ 1108 01:13:29,430 --> 01:13:34,110 และรูปแบบออกเป็นพวงของวัตถุที่ซ้อนกันในแต่ละอื่น 1109 01:13:34,110 --> 01:13:37,080 คุณเริ่มต้นกับสิ่งที่ต้องการนี​​้ 1110 01:13:37,080 --> 01:13:44,770 คุณมีด้านขวาสำหรับฉันพวงของรหัสออกมีที่เรียงลำดับของ - 1111 01:13:44,770 --> 01:13:46,640 คุณจะคิดว่าจะยากมากที่จะจัดการ 1112 01:13:46,640 --> 01:13:48,700 เพราะคุณต้องการจะแยกผ่านพวงของข้อความ 1113 01:13:48,700 --> 01:13:52,080 และมีชิ้นออกจากกันสิ่งที่ และสิ่งที่ถ้ามันไม่ได้มีรูปแบบถูกต้องหรือไม่ 1114 01:13:52,080 --> 01:13:54,880 สิ่งเลวร้ายที่จะเกิดขึ้น 1115 01:13:54,880 --> 01:13:58,140 ดังนั้น JavaScript ดูแลนี้สำหรับคุณและคุณจะได้รับโครงสร้างข้อมูลที่ดี 1116 01:13:58,140 --> 01:14:01,390 เช่นเดียวข้างซ้ายของเราที่คุณเพียงแค่ต้องเอกสาร 1117 01:14:01,390 --> 01:14:03,530 และภายในที่คุณมีสิ่งที่เรียกว่า HTML, 1118 01:14:03,530 --> 01:14:05,600 และภายในที่คุณมีหัวและร่างกาย 1119 01:14:05,600 --> 01:14:08,420 และในหัวที่คุณมีชื่อ, etcetera, etcetera, etcetera 1120 01:14:08,420 --> 01:14:11,810 นี้ช่วยลดความยุ่งยากการจัดการกับหน้าเว็บเพื่อให้เป็นเพียง 1121 01:14:11,810 --> 01:14:14,190 โอ้ผมแค่อยากจะพูดคุยกับวัตถุนี้ 1122 01:14:14,190 --> 01:14:21,340 การเรียงลำดับของวิธีการที่คล้ายกันมากที่คุณจะพูดคุยกับวัตถุที่คุณทำเองอีก 1123 01:14:21,340 --> 01:14:25,980 เช่นฉันกล่าวว่าทั้งหมด DOM ที่อยู่ในวัตถุเอกสาร 1124 01:14:25,980 --> 01:14:29,290 ทั้งที่เป็นเพียงที่เดียวและจากนั้นคุณสามารถไปอยู่ภายในเพื่อหาสิ่งที่ 1125 01:14:29,290 --> 01:14:33,880 และคุณสามารถทำมัน - นี้เป็นรูปแบบเดิมในการทำมันไปอยู่ที่นั่น 1126 01:14:33,880 --> 01:14:38,130 ที่คุณทำ document.getElementById แล้วชื่อ 1127 01:14:38,130 --> 01:14:42,420 และในขณะที่คุณอาจจะสามารถบอกได้นี้ได้รับเทอะทะมากหลังจากที่ในขณะ 1128 01:14:42,420 --> 01:14:44,480 ดังนั้นคุณอาจไม่ต้องการที่จะทำเช่นนั้น นั่นเป็นเหตุผลที่เรามี 1129 01:14:44,480 --> 01:14:48,760 สิ่งต่อไปที่เรากำลังจะพูดคุยเกี่ยวกับหลังจากนี้ 1130 01:14:48,760 --> 01:14:52,510 สิ่งที่สำคัญที่นี่เป็นที่ที่เหมาะสมทุกอย่างที่คุณมีองค์ประกอบทั้งหมดเหล่านี้ใช่มั้ย 1131 01:14:52,510 --> 01:14:56,400 ดังนั้นบางทีฉันสามารถเปลี่ยนสีของบางสิ่งบางอย่างเมื่อโหลดหน้า 1132 01:14:56,400 --> 01:14:58,380 ดังนั้นสิ่งที่ เกิดอะไรขึ้นหากผู้ใช้คลิกอะไร 1133 01:14:58,380 --> 01:15:00,540 ฉันต้องการที่จะทำบางสิ่งบางอย่างที่น่าสนใจเมื่อพวกเขาคลิกที่บางสิ่งบางอย่าง 1134 01:15:00,540 --> 01:15:02,600 นั่นเป็นเหตุผลที่เรามีเหตุการณ์ที่เกิดขึ้น 1135 01:15:02,600 --> 01:15:05,330 คุณสามารถโดยทั่วไปหาองค์ประกอบใน DOM ของคุณ 1136 01:15:05,330 --> 01:15:08,560 แล้วบอกว่าเดี๋ยวก่อน เมื่อโหลดหรือมีคนคลิกมัน 1137 01:15:08,560 --> 01:15:11,410 หรือเมื่อพวกเขาเมาส์มากกว่านั้นทำอะไรกับมัน 1138 01:15:11,410 --> 01:15:15,330 และสิ่งที่คุณมีคือคุณจะมีฟังก์ชั่นที่จัดการเรื่องนี้ให้คุณ 1139 01:15:15,330 --> 01:15:17,980 ฟังก์ชั่นเหล่านี้เป็นตัวจัดการเหตุการณ์ 1140 01:15:17,980 --> 01:15:20,440 สิ่งที่พวกเขากำลัง - เป็นเพียงวิธีแฟนซีของว่า 1141 01:15:20,440 --> 01:15:23,500 ฟังก์ชั่นนี้จะทำงานเฉพาะเมื่อเหตุการณ์นี้เกิดขึ้น 1142 01:15:23,500 --> 01:15:28,070 ดังนั้นจึงจะจัดการกับเหตุการณ์ที่เกิดขึ้น 1143 01:15:28,070 --> 01:15:30,810 นี่คือวิธีที่คุณจะวางออกตัวจัดการเหตุการณ์ 1144 01:15:30,810 --> 01:15:34,750 ฉันมีปุ่มบางอย่างและเมื่อคุณคลิกที่มันจะระเบิด 1145 01:15:34,750 --> 01:15:40,560 จึงไม่คลิกที่ปุ่ม 1146 01:15:40,560 --> 01:15:42,910 นี้เป็นวิธีหนึ่งของใกล้มันใช่มั้ย 1147 01:15:42,910 --> 01:15:46,430 คุณมีแท็กปุ่มและเมื่อคลิกคุณมีสตริงที่ระบุว่าเป็น 1148 01:15:46,430 --> 01:15:50,460 โอ้โดยวิธีการที่ผมทำเช่นนี้ระเบิดสิ่งที่สำหรับฉัน 1149 01:15:50,460 --> 01:15:53,990 มิฉะนั้นก็เช่นเดียวกับปุ่มปกติคุณเพิ่งทำ 1150 01:15:53,990 --> 01:15:56,550 นอกจากนี้คุณยังสามารถทำเช่นนี้วิธีการอื่น 1151 01:15:56,550 --> 01:16:02,770 ด้วยการคว้าองค์ประกอบ DOM แต่เราจะบันทึกว่าหลังจากที่เราได้พูดคุยเกี่ยวกับ jQuery 1152 01:16:02,770 --> 01:16:07,580 >> jQuery: มันเป็นห้องสมุดที่เป็นข้ามเบราว์เซอร์ 1153 01:16:07,580 --> 01:16:09,580 คุณสามารถใช้มันในสิ่งที่สวยมาก 1154 01:16:09,580 --> 01:16:12,090 และมันก็ช่วยให้คุณมีจำนวนมากเครื่องมือที่จะทำงานกับ 1155 01:16:12,090 --> 01:16:15,850 เพราะจาวาสคริปต์ที่มีประสิทธิภาพในขณะที่ไม่ได้มีเครื่องมือทั้งหมดที่คุณต้องการ 1156 01:16:15,850 --> 01:16:20,550 ออกจากกล่องที่จะต่อสู้จริงๆ app เว็บที่คุณอาจต้องการที่จะทำ 1157 01:16:20,550 --> 01:16:24,650 ดังนั้นจึงช่วยลดความยุ่งยากมากสิ่งที่ช่วยให้คุณมีจำนวนมากของฟังก์ชั่น 1158 01:16:24,650 --> 01:16:28,760 ออกจากกล่องที่คุณมักจะต้องมีการเขียนตัวเองซ้ำแล้วซ้ำแล้วซ้ำอีก 1159 01:16:28,760 --> 01:16:31,600 และเพียงแค่ทำให้สิ่งที่ง่ายมาก 1160 01:16:31,600 --> 01:16:35,780 นอกจากนี้คุณยังมีตัวเลือกที่ช่วยให้คุณสามารถนำออกองค์ประกอบทั้งหมดเหล่านั้น 1161 01:16:35,780 --> 01:16:42,800 จาก DOM ของคุณมากขึ้นเพียงแทนที่จะต้องใช้สายงานเหล่านี้นานมาก 1162 01:16:42,800 --> 01:16:46,630 ข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกเหล่านี้ คุณมีขึ้นมีคุณได้สมมุติว่า 1163 01:16:46,630 --> 01:16:49,800 ฉันต้องการที่จะได้รับองค์ประกอบที่มี ID "หิน". 1164 01:16:49,800 --> 01:16:56,450 ทั้งใน jQuery ก็เพียง $ แล้วสตริงที่มีปอนด์และแล้ว "หิน". 1165 01:16:56,450 --> 01:17:01,960 มันง่ายมากและมากเร็วกว่าวิธีการดั้งเดิมของ JavaScript แก้ปัญหาปัญหานี้ 1166 01:17:01,960 --> 01:17:06,120 และคุณมีสิ่งที่คล้ายกันสำหรับการเรียนและประเภทองค์ประกอบ 1167 01:17:06,120 --> 01:17:08,140 jQuery เป็น - หนึ่งในคุณสมบัติที่เย็นเป็นคุณสามารถเรียงลำดับของการบีบอัด 1168 01:17:08,140 --> 01:17:14,350 ลงคำสั่งของคุณใน DOM ของคุณอย่างรวดเร็วมาก 1169 01:17:14,350 --> 01:17:18,980 ตอนนี้เรากลับไปที่การจัดการเหตุการณ์และนี่คือวิธีที่คุณจะจัดการกับเหตุการณ์หนึ่งใน jQuery 1170 01:17:18,980 --> 01:17:23,090 ดังนั้นสิ่งที่เรากำลังจะไปที่นี่เป็นที่ที่เรากำลังจะบอกว่าถูกต้องทั้งหมด ฉันมีแท็กสคริปต์ใช่ไหม 1171 01:17:23,090 --> 01:17:25,400 ดังนั้นผมจึงมีแบบอินไลน์นี้ JavaScript 1172 01:17:25,400 --> 01:17:27,750 สิ่งที่เรากำลังจะทำคือการที่เรากำลังจะบอกว่าถูกต้องทั้งหมด 1173 01:17:27,750 --> 01:17:30,860 เมื่อเอกสารพร้อมซึ่งหมายความว่าเอกสารที่ได้รับการโหลด 1174 01:17:30,860 --> 01:17:34,660 เราจะไปในฟังก์ชั่นที่เราและเรากำลังจะพูดว่าสิทธิทั้งหมด 1175 01:17:34,660 --> 01:17:37,060 ฟังก์ชั่นนี้จริงทำอย่างอื่น 1176 01:17:37,060 --> 01:17:42,320 เป็นพื้นว่าสิทธิทั้งหมดได้รับฉันองค์ประกอบที่มี ID "myId." 1177 01:17:42,320 --> 01:17:47,960 แล้วให้ดำเนินการนี​​้ฟังก์ชั่นที่รันเมื่อคุณคลิก 1178 01:17:47,960 --> 01:17:49,820 โดยทั่วไปสิ่งนี้จะเป็นมันก็บอกว่าถูกต้องทั้งหมด 1179 01:17:49,820 --> 01:17:52,630 หน้าจะโหลดดังนั้นฉันจะไปในหาองค์ประกอบนี้ 1180 01:17:52,630 --> 01:17:56,420 ให้มันจัดการเหตุการณ์นี้และมันเป็นพื้นตั้งค่าหน้าเว็บของคุณสำหรับคุณ 1181 01:17:56,420 --> 01:18:00,520 และนี่คือวิธีการที่คุณต้องการคิดเกี่ยวกับการจัดการเหตุการณ์ 1182 01:18:00,520 --> 01:18:06,310 คุณเพียงแค่ต้องการที่จะคิดเกี่ยวกับสิทธิทั้งหมดเมื่อสิ่งที่เกิดขึ้นสิ่งที่ฉันต้องการที่จะเกิดขึ้นได้อย่างไร 1183 01:18:06,310 --> 01:18:10,520 คุณไม่ต้องการที่จะคิดเกี่ยวกับโอเคฉันต้องให้แน่ใจว่าสิ่งที่พูดถึงนี้เพื่อสิ่งนี้ 1184 01:18:10,520 --> 01:18:14,660 สิ่งนี้ blah blah blah, เพราะคุณเพียงแค่ต้องการที่จะพูดคุยสิ่งที่ในแง่ของเหตุการณ์ที่เกิดขึ้น 1185 01:18:14,660 --> 01:18:17,650 เมื่อเกิดเหตุการณ์นี้เกิดเหตุการณ์นี้ เมื่อเกิดเหตุการณ์นี้ที่เกิดขึ้น 1186 01:18:17,650 --> 01:18:20,240 และถ้าสิ่งที่ก่อให้เกิดสิ่งอื่น ๆ ที่ดี 1187 01:18:20,240 --> 01:18:22,150 แต่คุณไม่ต้องการที่จะพยายามทำรหัสซับซ้อน 1188 01:18:22,150 --> 01:18:24,130 ที่คุณกำลังเรียกสิ่งที่หลายคนในเวลาเดียวกัน 1189 01:18:24,130 --> 01:18:28,860 เพราะคุณกำลังจะให้ตัวเองปวดหัว 1190 01:18:28,860 --> 01:18:32,340 >> ขวาทั้งหมด ตอนนี้เราสามารถได้รับหน้าของเราที่จะจัดการกับเหตุการณ์ 1191 01:18:32,340 --> 01:18:35,640 แต่ขอบอกว่าผู้ใช้คลิกที่ปุ่ม 1192 01:18:35,640 --> 01:18:38,040 หากฉันต้องการที่จะส่งขอให้กลับไปยังเซิร์ฟเวอร์ 1193 01:18:38,040 --> 01:18:41,100 แต่ฉันไม่ต้องการที่จะโหลดหน้าเว็บเพราะไม่ต้องโหลดหน้าใหม่ 1194 01:18:41,100 --> 01:18:44,390 ทุกเวลาเดียวที่จะได้รับชนิดของน่าเบื่อและทำไมฉันต้อง 1195 01:18:44,390 --> 01:18:47,430 ที่จะดึงลงส่วนหัวอีกครั้งและท้ายอีกครั้ง 1196 01:18:47,430 --> 01:18:49,670 และองค์ประกอบทั้งหมดของหน้าเว็บอีกครั้ง 1197 01:18:49,670 --> 01:18:53,180 เพียงเพื่อการฟื้นฟูอวยพรหรือเวลาหรือไม่ 1198 01:18:53,180 --> 01:18:55,290 ดังนั้นที่ว่าทำไมเรามีบางอย่างเช่นอาแจ็กซ์ 1199 01:18:55,290 --> 01:18:59,150 เราสามารถทำอะไรที่นี่กับอาแจ็กซ์คือเราสามารถพูดได้ว่าสิทธิทั้งหมด 1200 01:18:59,150 --> 01:19:01,290 ผมต้องการที่จะส่งข้อมูลบางส่วนไปยังเซิร์ฟเวอร์ 1201 01:19:01,290 --> 01:19:04,010 และฉันต้องการที่จะได้รับการตอบสนองกลับดังนั้นฉันสามารถปรับปรุงหน้าของฉัน 1202 01:19:04,010 --> 01:19:12,120 หรืออาจจะแค่ทำบางขั้นตอนวิธีการคำนวณที่ไม่จำเป็นต้องแสดงอะไรให้กับผู้ใช้ 1203 01:19:12,120 --> 01:19:15,500 สิ่งที่คุณต้องทำเช่นนี้? ดีที่คุณต้อง URL ที่คุณต้องพูดคุยกับ 1204 01:19:15,500 --> 01:19:18,650 เซิร์ฟเวอร์ของคุณไม่สามารถเพียงแค่ฟังอย่างน่าอัศจรรย์ในจากที่ไหนเลย 1205 01:19:18,650 --> 01:19:21,960 คุณจำเป็นต้องมีสถานที่เฉพาะที่คุณจะส่งข้อมูลนี้ไปยัง 1206 01:19:21,960 --> 01:19:26,240 และคุณยังต้องการข้อมูลบางอย่างที่จะส่งหรืออาจจะเป็นแบบสอบถาม dataless 1207 01:19:26,240 --> 01:19:31,380 คุณเพียงแค่ต้องการที่จะ ping กลับไปยังเซิร์ฟเวอร์และพูดว่าเดี๋ยวก่อนฉันยังมีชีวิตอยู่หรือสิ่งที่ต้องการ 1208 01:19:31,380 --> 01:19:35,150 และแล้วคุณต้องการฟังก์ชั่นที่พื้นจัดการกับความสำเร็จ 1209 01:19:35,150 --> 01:19:38,250 สมมติว่าคุณได้รับกลับข้อมูลบางส่วนจากเซิร์ฟเวอร์ของคุณ 1210 01:19:38,250 --> 01:19:42,960 และคุณต้องการที่จะเปลี่ยนชื่อของผู้ใช้บนหน้าเว็บของพวกเขา 1211 01:19:42,960 --> 01:19:44,930 ดังนั้นคุณจะได้รับข้อมูลกลับ 1212 01:19:44,930 --> 01:19:48,860 และคุณจะผลักดันให้ไปที่หน้าจอ 1213 01:19:48,860 --> 01:19:51,170 สิ่งที่เกิดขึ้นคือเมื่อหน้าพร้อม 1214 01:19:51,170 --> 01:19:56,500 คุณสร้างฟังก์ชั่นคลิกสำหรับปุ่มที่เรียกว่ารู้ตัวนี้ 1215 01:19:56,500 --> 01:19:58,810 สิ่งนี้จากนั้นจะเป็นเมื่อปุ่มที่จะผลัก 1216 01:19:58,810 --> 01:20:03,700 คุณพูดคุยกับ greetings.php คุณทำคำขอ POST, 1217 01:20:03,700 --> 01:20:07,290 และท่านทั้งหลายว่าเ​​ดี๋ยวก่อนฉันได้รับอะไรบางอย่างจากหน้าเว็บของคุณ 1218 01:20:07,290 --> 01:20:09,890 เราไม่จำเป็นต้องอธิบายว่า แต่ greetings.php, 1219 01:20:09,890 --> 01:20:12,480 ขอเพียงแค่บอกว่าให้กลับ "สวัสดีโลก." 1220 01:20:12,480 --> 01:20:15,650 ดังนั้นเราจึงได้รับกลับนี้ "hello โลก" และในความสำเร็จนี้ 1221 01:20:15,650 --> 01:20:20,730 สมมติว่าไม่มีอะไรผิดพลาดแล้วเราก็ไปที่สถานที่เป้าหมายนี้ 1222 01:20:20,730 --> 01:20:25,720 ที่เราระบุไว้และเราก็ติดในการตอบสนองมี 1223 01:20:25,720 --> 01:20:31,560 และนี่คือวิธีที่ง่ายมากของการตั้งค่าการค้นหาอาแจ็กซ์ 1224 01:20:31,560 --> 01:20:34,340 >> อย่างรวดเร็วร็อบประเภทที่กล่าวถึงนี้แล้ว 1225 01:20:34,340 --> 01:20:37,170 สิ่งที่สามารถไปผิดสิ่งที่ไม่ดีสามารถเกิดขึ้น 1226 01:20:37,170 --> 01:20:42,660 ดังนั้นคุณจึงต้องการที่จะทำความคุ้นเคยกับเหล่านี้รหัสการตอบสนอง 1227 01:20:42,660 --> 01:20:46,030 สิ่งเหล่านี้จะเป็นเพียงเช่น, 200, ทุกอย่างก็โอเค 1228 01:20:46,030 --> 01:20:48,670 สิ่งอื่นสิ่งเลวร้ายที่เกิดขึ้น 1229 01:20:48,670 --> 01:20:50,790 มันเป็นโดยทั่วไปสิ่งที่คุณต้องการที่จะจำ 1230 01:20:50,790 --> 01:20:53,440 แต่มันเป็นเรื่องที่ดีที่จะรู้ว่าสิ่งเหล่านี้ 1231 01:20:53,440 --> 01:20:55,970 และในที่สุดเมื่อเราได้ไปผ่านทุกที่ 1232 01:20:55,970 --> 01:20:58,680 เราต้องพูดคุยอย่างรวดเร็วเกี่ยวกับการออกแบบ 1233 01:20:58,680 --> 01:21:00,620 แล้วเราสามารถช่วยให้คุณทั้งหมดออกจาก 1234 01:21:00,620 --> 01:21:03,410 ออกแบบ สิ่งที่คุณอยากจะจดจำ 1235 01:21:03,410 --> 01:21:06,950 ถามตัวเองคำถามเหล่านี้: ใครจะใช้นี้ 1236 01:21:06,950 --> 01:21:09,580 สิ่งที่พวกเขาจะใช้มันสำหรับ สิ่งที่ผู้ใช้ของฉันเกี่ยวกับการดูแล? 1237 01:21:09,580 --> 01:21:11,750 สิ่งใดที่ไม่ได้พวกเขาดูแลเกี่ยวกับ 1238 01:21:11,750 --> 01:21:14,500 คุณเพียงแค่ไม่ต้องการที่จะทำให้ app และปล่อยให้มันเป็นเพียงแค่เติบโต 1239 01:21:14,500 --> 01:21:18,270 และกลายเป็นยักษ์นี้สิ่งที่ทุกคนมากที่คุณไม่สามารถแม้แต่จะเสร็จสิ้น 1240 01:21:18,270 --> 01:21:23,900 คุณต้องการที่จะมีเป้าหมายต่อเนื่องและแผนและสิ่งที่คุณต้องการที่จะอยู่ 1241 01:21:23,900 --> 01:21:29,000 ทำให้มันง่ายดาย ทั้งหมดนี้กล่าวว่าโดยทั่วไป 1242 01:21:29,000 --> 01:21:34,950 ทำให้ง่ายสำหรับผู้ใช้ที่จะใช้มันไม่ได้ทำให้มันหยดยักษ์ของข้อความเช่นสไลด์นี้เป็นจริง 1243 01:21:34,950 --> 01:21:38,020 คุณเพียงแค่ต้องการให้เป็นสิ่งที่มันเป็นเรื่องง่ายมากสำหรับคนที่จะไปใน 1244 01:21:38,020 --> 01:21:40,800 และทำในสิ่งที่พวกเขาต้องการที่จะทำ 1245 01:21:40,800 --> 01:21:42,920 คุณไม่ต้องการให้พวกเขาที่จะมีการเลื่อนหน้า 5 1246 01:21:42,920 --> 01:21:45,460 ที่จะได้รับการทำงานที่สำคัญของคุณในเว็บไซต์ของคุณ 1247 01:21:45,460 --> 01:21:49,290 หาก Google มี 5 หน้าก่อนที่คุณจะสามารถค้นหาบางสิ่งบางอย่าง 1248 01:21:49,290 --> 01:21:53,080 ไม่มีใครจะใช้มัน 1249 01:21:53,080 --> 01:21:55,890 และสุดท้ายต้นแบบกระดาษกลุ่มโฟกัส 1250 01:21:55,890 --> 01:21:59,220 มีการออกแบบและการทดสอบการปฏิบัติที่ดี 1251 01:21:59,220 --> 01:22:00,730 เพียงเพราะคุณคิดว่ามันเหมาะกับคุณ 1252 01:22:00,730 --> 01:22:04,860 ไม่ได้หมายความว่าคนอื่นคิดว่ามันทำงาน 1253 01:22:04,860 --> 01:22:14,490 แต่ใช่ที่มัน 1254 01:22:14,490 --> 01:22:17,490 [CS50.TV]