1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID ลัน: ขวาทั้งหมดยินดีต้อนรับกลับ 3 00:00:12,580 --> 00:00:13,290 นี่คือ CS50 4 00:00:13,290 --> 00:00:15,130 นี่คือจุดเริ่มต้นของสัปดาห์ที่เจ็ด 5 00:00:15,130 --> 00:00:18,890 ดังนั้นจึงได้รับในขณะดังนั้นฉันคิดว่าเราต้องการ ใช้ทัวร์ลมกรดจากที่เรา 6 00:00:18,890 --> 00:00:20,760 ซ้ายปิดและสถานที่ที่เราตอนนี้จะ 7 00:00:20,760 --> 00:00:23,310 >> ดังนั้นสิ่งนี้อาจจะมีที่นี่ ก่อให้เกิดความทุกข์บางอย่างในตอนแรก 8 00:00:23,310 --> 00:00:27,680 แต่หวังว่าคุณจะเริ่มต้นในการ ปรับตัวให้ชินกับสิ่งที่นี้หมายถึงที่นี่ - 9 00:00:27,680 --> 00:00:32,670 ดาวที่เป็นตัวแทนของตัวชี้ซึ่งเป็น เพียงแค่สิ่งที่ในแง่ของคนธรรมดามากขึ้น? 10 00:00:32,670 --> 00:00:33,400 ดังนั้นจึงเป็นที่อยู่ 11 00:00:33,400 --> 00:00:35,490 >> ดังนั้นจึงเป็นที่อยู่ของ บางสิ่งบางอย่างในความทรงจำ 12 00:00:35,490 --> 00:00:38,260 และเราเริ่มที่จะกลับชั้นเปลือก สองสามสัปดาห์ที่ผ่านมาสิ่งที่ต้องการ 13 00:00:38,260 --> 00:00:41,800 GetString และอื่น ๆ ฟังก์ชั่นดังกล่าว ตลอดเวลานี้ได้รับกลับมา 14 00:00:41,800 --> 00:00:46,010 ที่อยู่ของสิ่งที่อยู่ในหน่วยความจำเช่น ที่อยู่ของตัวอักษรตัวแรกใน 15 00:00:46,010 --> 00:00:46,990 ลำดับบาง 16 00:00:46,990 --> 00:00:50,360 >> ดังนั้นเราจึงยังแนะนำ valgrind ซึ่ง คุณจะเริ่มต้นที่จะใช้สำหรับปัญหานี้ 17 00:00:50,360 --> 00:00:53,380 ตั้งโดยเฉพาะอย่างยิ่งสำหรับการต่อไป ปัญหาการตั้งค่าเช่นกัน 18 00:00:53,380 --> 00:00:54,980 และ valgrind ทำอะไรสำหรับเรา? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 มันจะตรวจสอบการรั่วไหลของหน่วยความจำและมัน นอกจากนี้ยังตรวจสอบการทำผิดกฎเกี่ยวของหน่วยความจำ 21 00:01:01,020 --> 00:01:05,890 >> มันสามารถมีความน่าจะเป็นบางอย่างที่ตรวจสอบว่า รหัสของคุณเป็นไปสัมผัสหน่วยความจำ 22 00:01:05,890 --> 00:01:07,100 ที่มันก็ไม่ควร 23 00:01:07,100 --> 00:01:10,410 ดังนั้นไม่จำเป็นต้องรั่ว แต่ถ้าคุณ ไปไกลเกินกว่าขอบเขตของบาง 24 00:01:10,410 --> 00:01:14,730 อาร์เรย์และคุณทำงานจริง valgrind และก่อให้เกิดพฤติกรรมที่ว่าในขณะที่ 25 00:01:14,730 --> 00:01:17,870 valgrind กำลังทำงานในโปรแกรมของคุณ การทำงานภายในของมันคุณจะได้รับ 26 00:01:17,870 --> 00:01:21,460 ข้อความเช่นนี้ - "ที่ไม่ถูกต้องเขียนจาก ขนาด 4 "ซึ่งจำคู่ของ 27 00:01:21,460 --> 00:01:25,880 สัปดาห์ที่ผ่านมานั่นหมายความว่าฉันมีความตั้งใจ เช่นเดียวกับหนึ่ง int ไกลเกินไป 28 00:01:25,880 --> 00:01:27,250 เกินขอบเขตของอาร์เรย์ 29 00:01:27,250 --> 00:01:30,790 และอื่น ๆ 4 ขนาดขนาดหมายถึงที่นี่ ของ int นั้น 30 00:01:30,790 --> 00:01:35,260 >> ดังนั้นจะให้ความมั่นใจในความเป็นจริงว่า เอาท์พุท valgrind ของรูปแบบของมัน 31 00:01:35,260 --> 00:01:36,170 เป็นเพียงเลวร้าย 32 00:01:36,170 --> 00:01:40,180 มันยากจริงๆที่จะดูผ่านระเบียบ สำหรับข้อมูลที่น่าสนใจ 33 00:01:40,180 --> 00:01:42,910 ดังนั้นสิ่งที่เราได้ทำที่นี่ที่ตัดตอนมาเพียง บางส่วนของคู่อื่น ๆ 34 00:01:42,910 --> 00:01:43,850 เส้นที่น่าสนใจ 35 00:01:43,850 --> 00:01:46,760 แต่ตระหนักว่า 80% ของ valgrind ของ เอาท์พุทเป็นไปได้บิตของ 36 00:01:46,760 --> 00:01:47,650 ความว้าวุ่นใจ 37 00:01:47,650 --> 00:01:52,820 >> เพียงแค่มองหารูปแบบเช่นนี้ - ที่ไม่ถูกต้องที่ถูกต้องไม่ถูกต้องอ่าน 40 ไบต์ 38 00:01:52,820 --> 00:01:56,690 และจำนวนบล็อกบางอย่างแน่นอน คำหลักที่หายไปเช่นเดียวกับที่ 39 00:01:56,690 --> 00:02:01,920 และสิ่งที่คุณหวังว่าจะเห็นเป็นบางส่วน ชนิดของการตรวจสอบของสิ่งที่ทำงาน 40 00:02:01,920 --> 00:02:03,340 ความผิดพลาดเป็นจริงค่ะ 41 00:02:03,340 --> 00:02:07,195 ในกรณีนี้ที่นี่ในสิ่งที่สายของ รหัสของฉันเกิดข้อผิดพลาดที่เห็นได้ชัด? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 ในไฟล์ที่เรียกว่า memory.c ซึ่งเป็น ตัวอย่างเช่นที่เรากำลังเล่นกับ 44 00:02:14,130 --> 00:02:14,890 ในช่วงเวลานั้น 45 00:02:14,890 --> 00:02:16,460 ดังนั้นมันอาจจะไม่ได้อยู่ใน malloc 46 00:02:16,460 --> 00:02:18,630 มันอาจจะเป็นในรหัสของฉันแทน 47 00:02:18,630 --> 00:02:20,910 ดังนั้นเราจะเห็นสิ่งนี้อีกครั้ง และอีกครั้งก่อนที่จะยาว 48 00:02:20,910 --> 00:02:24,080 >> ดังนั้น scanf นี้ขึ้นมาใน คู่ของรูปแบบป่านนี้ 49 00:02:24,080 --> 00:02:26,410 เราเห็น sscanf สั้น 50 00:02:26,410 --> 00:02:28,330 มันเป็นสิ่งที่จำนวนของ คุณดำดิ่งลงไปในของคุณ 51 00:02:28,330 --> 00:02:29,535 เตรียมการสำหรับการตอบคำถาม 52 00:02:29,535 --> 00:02:33,130 และ scanf เป็นจริงสิ่งที่ CS50 ห้องสมุดที่ได้รับใช้ใต้ 53 00:02:33,130 --> 00:02:36,560 เครื่องดูดควันสำหรับค่อนข้างบางเวลาในการสั่งซื้อสินค้าบางอย่าง ได้รับข้อมูลจากผู้ใช้ 54 00:02:36,560 --> 00:02:40,420 >> ตัวอย่างเช่นถ้าฉันย้ายไปยัง CS50 เครื่องใช้ที่นี่ให้ฉันเปิดขึ้น 55 00:02:40,420 --> 00:02:45,315 ตัวอย่างเช่นในวันนี้ว่าที่เรียกว่า scanf-0.c และมันง่ายสุด 56 00:02:45,315 --> 00:02:46,590 มันเป็นเพียงไม่กี่บรรทัดของรหัส 57 00:02:46,590 --> 00:02:50,880 แต่มันแสดงให้เห็นถึงวิธีการที่จริงๆ getInt ได้รับการทำงานทั้งหมดในเวลานี้ 58 00:02:50,880 --> 00:02:54,710 >> ในโปรแกรมนี้ที่นี่ใน 16 เส้น แจ้งให้ทราบว่าผมประกาศ int 59 00:02:54,710 --> 00:02:57,270 ดังนั้นตัวชี้ไม่มีอะไรที่มีมนต์ขลัง มีเพียง int 60 00:02:57,270 --> 00:03:00,330 จากนั้นในบรรทัดที่ 17 ผมแจ้งให้ สำหรับจำนวนผู้ใช้โปรด 61 00:03:00,330 --> 00:03:02,930 จากนั้นในช่วงปลายปี 18 ผมใช้ scanf ที่นี่ 62 00:03:02,930 --> 00:03:06,910 และฉันระบุชนิดเช่น printf, ที่ฉันคาดหวังอ้าง 63 00:03:06,910 --> 00:03:08,110 ไม่ได้นำมาอ้างผมเปอร์เซ็นต์ 64 00:03:08,110 --> 00:03:10,920 >> ดังนั้นผมคิดเป็นร้อยละของหลักสูตร หมายถึง int 65 00:03:10,920 --> 00:03:14,580 แต่สังเกตเห็นสิ่งที่สอง อาร์กิวเมนต์ scanf คือ 66 00:03:14,580 --> 00:03:17,350 วิธีที่คุณจะอธิบายที่สอง อาร์กิวเมนต์หลังจากจุลภาค? 67 00:03:17,350 --> 00:03:19,450 ว่าคืออะไร? 68 00:03:19,450 --> 00:03:20,670 >> มันเป็นที่อยู่ของ x 69 00:03:20,670 --> 00:03:25,490 ดังนั้นนี้เป็นประโยชน์เพราะด้วยการให้ scanf กับที่อยู่ของ x สิ่งที่จะ 70 00:03:25,490 --> 00:03:29,560 ที่ช่วยให้การทำงานที่จะทำอย่างไร? 71 00:03:29,560 --> 00:03:33,010 ไม่เพียง แต่ไปที่นั่น แต่ยังทำในสิ่งที่? 72 00:03:33,010 --> 00:03:34,060 >> ทำการเปลี่ยนแปลงมัน 73 00:03:34,060 --> 00:03:38,080 เพราะคุณสามารถไปที่นั่นมันเรียงลำดับจาก เช่นแผนที่ไปยังตำแหน่งในหน่วยความจำ 74 00:03:38,080 --> 00:03:41,900 และ scanf ตราบเท่าที่คุณจัดให้มีหรือ ฟังก์ชั่นด้วยเช่นแผนที่ที่ใด 75 00:03:41,900 --> 00:03:45,840 ฟังก์ชั่นสามารถไปที่นั่นและไม่เพียง แต่ มองไปที่ค่า แต่มันยังสามารถ 76 00:03:45,840 --> 00:03:49,670 เปลี่ยนค่าที่ซึ่งจะเป็นประโยชน์ถ้า มุ่งหวังในชีวิต scanf คือการ 77 00:03:49,670 --> 00:03:53,060 สแกนข้อมูลจากผู้ใช้โดยเฉพาะ จากแป้นพิมพ์ 78 00:03:53,060 --> 00:03:57,830 f และหมายถึงการจัดรูปแบบเช่นเดียวกับ printf, F หมายถึงการจัดรูปแบบ 79 00:03:57,830 --> 00:03:58,930 สตริงที่คุณต้องการพิมพ์ 80 00:03:58,930 --> 00:04:04,430 >> ดังนั้นในระยะสั้น, 18 บรรทัดนี้ก็บอกว่า ลองอ่านจาก int ของผู้ใช้ 81 00:04:04,430 --> 00:04:10,420 แป้นพิมพ์และเก็บไว้ภายในของ x ที่ อะไรก็ตามที่อยู่ x เกิดขึ้นอยู่ที่ 82 00:04:10,420 --> 00:04:14,860 แล้วสุดท้าย 19 เส้นเพียงแค่พูดว่า, ขอบคุณสำหรับ int ในกรณีนี้ 83 00:04:14,860 --> 00:04:15,940 >> เพื่อให้ฉันไปข้างหน้าและทำให้เรื่องนี้ 84 00:04:15,940 --> 00:04:18,570 เพื่อให้ scanf 0 85 00:04:18,570 --> 00:04:20,130 ให้ฉันไปข้างหน้าและขยาย 86 00:04:20,130 --> 00:04:22,960 ฉันจะไปและทำงานนี้ด้วย จุดเฉือน scanf 0 87 00:04:22,960 --> 00:04:24,020 จำนวนการเข้า? 88 00:04:24,020 --> 00:04:24,720 50 89 00:04:24,720 --> 00:04:25,730 ขอบคุณสำหรับ 50 90 00:04:25,730 --> 00:04:27,270 ดังนั้นจึงค่อนข้างง่าย 91 00:04:27,270 --> 00:04:28,160 >> ตอนนี้มันเป็นสิ่งที่ไม่ทำอะไร 92 00:04:28,160 --> 00:04:29,940 มันไม่ได้ทำทั้งกลุ่ม จากการตรวจสอบข้อผิดพลาด 93 00:04:29,940 --> 00:04:33,000 ตัวอย่างเช่นถ้าฉันไม่ให้ความร่วมมือ และฉันไม่ต้องพิมพ์ในจำนวน แต่ 94 00:04:33,000 --> 00:04:37,860 แทนฉันเขียนสิ่งที่ต้องการ "สวัสดี" นั่นเป็นเพียงชนิดของแปลก 95 00:04:37,860 --> 00:04:41,130 และหนึ่งในสิ่งที่ CS50 ห้องสมุดได้รับการทำสำหรับเราสำหรับบางคน 96 00:04:41,130 --> 00:04:43,440 เวลาขณะนี้ reprompting ว่า และ reprompting 97 00:04:43,440 --> 00:04:49,320 >> จำวลีลองใหม่อีกครั้งใน cs50.c, และนั่นคือเหตุผลที่ว่าใน getInt 98 00:04:49,320 --> 00:04:51,670 ห้องสมุด CS50 เป็นจริงทั้ง พวงของสายยาวเพราะเรา 99 00:04:51,670 --> 00:04:53,190 การตรวจสอบสำหรับสิ่งที่โง่เช่นนี้ 100 00:04:53,190 --> 00:04:55,730 ผู้ใช้ไม่ได้ให้ เราในความเป็นจริง int? 101 00:04:55,730 --> 00:04:57,910 เขาหรือเธอให้เราบางสิ่งบางอย่าง เช่นตัวอักษรที่เรียงตามตัวอักษร? 102 00:04:57,910 --> 00:05:01,410 ถ้าเราต้องการที่จะตรวจสอบ และตะโกนใส่พวกเขา 103 00:05:01,410 --> 00:05:03,915 >> แต่สิ่งที่ได้รับน่าสนใจมากขึ้น ในตัวอย่างต่อไปนี้ 104 00:05:03,915 --> 00:05:09,840 ถ้าฉันไป scanf-1.C เป็นหนึ่งในสิ่งที่ สิ่งที่มีการเปลี่ยนแปลงพื้นฐานใน 105 00:05:09,840 --> 00:05:11,135 เช่นนี้ต่อไปหรือไม่ 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 ฉันใช้ char * แน่นอน แทน int 108 00:05:16,010 --> 00:05:19,210 >> ดังนั้นนี้เป็นที่น่าสนใจเพราะ char * จำเป็นจริงเพียง 109 00:05:19,210 --> 00:05:20,190 สิ่งเดียวที่เป็นสตริง 110 00:05:20,190 --> 00:05:23,840 ดังนั้นจึงรู้สึกเหมือนอาจจะเป็นซูเปอร์ การดำเนินงานที่เรียบง่ายของ GetString 111 00:05:23,840 --> 00:05:26,010 แต่ฉันกลับปอกเปลือกชั้น จาก CS50 ห้องสมุดดังนั้นฉัน 112 00:05:26,010 --> 00:05:27,550 เรียกนี้ char * ในขณะนี้ 113 00:05:27,550 --> 00:05:30,070 ดังนั้นขอดูว่าถ้าที่ใดก็ได้ เราไปอย่างผิดปกติ 114 00:05:30,070 --> 00:05:30,840 >> 17 สาย - 115 00:05:30,840 --> 00:05:33,950 ผมพูดอีกครั้งโปรดให้ฉันบางสิ่งบางอย่าง ในกรณีนี้สตริง 116 00:05:33,950 --> 00:05:37,940 และจากนั้นในบรรทัดถัดไปผมเรียก scanf, อีกครั้งให้มันรหัสรูปแบบ, 117 00:05:37,940 --> 00:05:39,310 แต่ร้อยละเวลานี้ s 118 00:05:39,310 --> 00:05:41,900 และแล้วเวลานี้ฉัน ให้มันบัฟเฟอร์ 119 00:05:41,900 --> 00:05:43,550 >> ตอนนี้สังเกตเห็นฉันไม่ได้ใช้ เครื่องหมาย 120 00:05:43,550 --> 00:05:47,120 แต่สิ่งที่เป็นที่ตกลงอาจเป็นเหตุผลที่นี่? 121 00:05:47,120 --> 00:05:49,760 เพราะเป็นสิ่งบัฟเฟอร์แล้ว 122 00:05:49,760 --> 00:05:50,770 มันมีอยู่แล้วชี้ 123 00:05:50,770 --> 00:05:51,650 มันมีอยู่แล้วที่อยู่ 124 00:05:51,650 --> 00:05:54,510 >> และขอคำนี้ "สับสน" ให้ฉัน เพียงแค่เรียกมันเช่นสำหรับ 125 00:05:54,510 --> 00:05:55,050 ความง่าย 126 00:05:55,050 --> 00:05:58,250 แต่ฉันเรียกมันว่า buffer เพราะใน โดยทั่วไปในการเขียนโปรแกรมถ้าคุณมี 127 00:05:58,250 --> 00:06:02,130 หน่วยความจำอันซึ่งสตริงจริงๆ เพียงคุณอาจเรียกมันว่าบัฟเฟอร์ 128 00:06:02,130 --> 00:06:04,460 เป็นสถานที่ในการจัดเก็บข้อมูล 129 00:06:04,460 --> 00:06:07,400 >> คล้ายกับสิ่งต่าง ๆ เช่น YouTube, เมื่อ พวกเขากำลังบัฟเฟอร์เพื่อที่จะพูดว่า 130 00:06:07,400 --> 00:06:10,270 ก็หมายความว่ามันดาวน์โหลดบิตจาก อินเทอร์เน็ตและเก็บไว้ใน 131 00:06:10,270 --> 00:06:14,160 อาร์เรย์ท้องถิ่นก้อนท้องถิ่นของหน่วยความจำเพื่อ ที่คุณสามารถดูได้ในภายหลังโดยไม่ต้อง 132 00:06:14,160 --> 00:06:16,830 มันกระโดดข้ามหรือแขวนอยู่บน คุณในขณะที่เล่น 133 00:06:16,830 --> 00:06:20,930 >> ดังนั้นจึงไม่มีปัญหาอะไร แต่ที่นี่ เพราะฉันบอก scanf คาดว่า 134 00:06:20,930 --> 00:06:22,320 สตริงจากผู้ใช้ 135 00:06:22,320 --> 00:06:24,410 นี่คือที่อยู่ของคน หน่วยความจำอัน 136 00:06:24,410 --> 00:06:26,180 ใส่สตริงที่มี 137 00:06:26,180 --> 00:06:31,230 จำกัด นั่นคือเหตุผลที่ทำให้ เรามีปัญหา แต่? 138 00:06:31,230 --> 00:06:33,490 >> ว่าคืออะไร? 139 00:06:33,490 --> 00:06:35,510 ฉันอนุญาตให้เข้าถึง ส่วนหนึ่งของหน่วยความจำที่? 140 00:06:35,510 --> 00:06:36,250 คุณจะรู้ว่าผมไม่ทราบว่า 141 00:06:36,250 --> 00:06:39,210 เพราะได้รับการเริ่มต้นบัฟเฟอร์ อะไร? 142 00:06:39,210 --> 00:06:39,820 ไม่ได้จริงๆ 143 00:06:39,820 --> 00:06:43,090 และดังนั้นจึงเป็นสิ่งที่เราได้รับการเรียก ค่าขยะซึ่ง 144 00:06:43,090 --> 00:06:44,040 ไม่ได้เป็นคำที่เป็นทางการ 145 00:06:44,040 --> 00:06:49,200 มันก็หมายความว่าเรามีความคิดว่าไม่มีบิต จะอยู่ภายในสี่ไบต์ที่ 146 00:06:49,200 --> 00:06:51,240 ฉันได้รับการจัดสรรเป็นกันชน 147 00:06:51,240 --> 00:06:52,450 >> ฉันไม่ได้เรียกว่า malloc 148 00:06:52,450 --> 00:06:53,940 ฉันแน่นอนไม่เรียกว่า GetString 149 00:06:53,940 --> 00:06:56,380 ดังนั้นใครรู้ว่าสิ่งที่เป็นจริงที่ ภายในของ buffer? 150 00:06:56,380 --> 00:07:00,550 และยังบอก scanf สุ่มสี่สุ่มห้าไปที่นั่น และใส่สิ่งที่ผู้ใช้พิมพ์ 151 00:07:00,550 --> 00:07:04,460 >> ดังนั้นมีโอกาสที่จะก่อให้เกิดสิ่ง ในรหัสของเราถ้าเราทำงานได้หรือไม่ 152 00:07:04,460 --> 00:07:05,700 อาจ segfault 153 00:07:05,700 --> 00:07:07,970 อาจจะไม่ แต่มันอาจจะ segfault 154 00:07:07,970 --> 00:07:10,620 และที่ผมพูดอาจจะไม่เพราะบางครั้ง ที่คุณทำบางครั้ง 155 00:07:10,620 --> 00:07:11,380 คุณไม่ได้รับ segfault 156 00:07:11,380 --> 00:07:14,280 บางครั้งคุณเพียงได้รับโชคดี แต่ กระนั้นก็เป็นไปได้ 157 00:07:14,280 --> 00:07:15,340 ข้อผิดพลาดในโปรแกรมของเรา 158 00:07:15,340 --> 00:07:17,060 >> เพื่อให้ฉันไปข้างหน้าและรวบรวมนี้ 159 00:07:17,060 --> 00:07:18,280 ฉันจะทำมันด้วยวิธีโรงเรียนเก่า 160 00:07:18,280 --> 00:07:23,825 ดังนั้นชนเสียงดังกราว 0, scanf-1, scanf-1.C ป้อน 161 00:07:23,825 --> 00:07:24,720 โอ๊ะโรงเรียนเก่าเกินไป 162 00:07:24,720 --> 00:07:26,550 ลองมาดูกัน 163 00:07:26,550 --> 00:07:28,440 ผมไม่ไปไหน 164 00:07:28,440 --> 00:07:29,700 โอ้บัฟเฟอร์ char * 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 โอ้ขอบคุณ - 167 00:07:35,130 --> 00:07:36,930 บันทึกตกลง - 168 00:07:36,930 --> 00:07:37,690 โรงเรียนเก่ามาก 169 00:07:37,690 --> 00:07:38,900 ทั้งหมดที่ถูกต้องจะได้รับในขณะที่ 170 00:07:38,900 --> 00:07:41,720 >> ดังนั้นผมจึงได้บันทึกไว้เพียงไฟล์หลังจากที่ การทำชั่วคราวที่ 171 00:07:41,720 --> 00:07:42,700 เปลี่ยนช่วงเวลาที่ผ่านมา 172 00:07:42,700 --> 00:07:46,090 และตอนนี้ฉันได้รวบรวมมัน ด้วยตนเองด้วยเสียงดังกราว 173 00:07:46,090 --> 00:07:49,500 และตอนนี้ฉันจะไปข้างหน้า และเรียกใช้ scanf-1 ใส่ 174 00:07:49,500 --> 00:07:50,290 String โปรด 175 00:07:50,290 --> 00:07:51,600 ผมจะพิมพ์ใน "Hello." 176 00:07:51,600 --> 00:07:54,070 >> และตอนนี้ที่นี่เป็นที่ที่ตรงไปตรงมา printf สามารถเป็นที่น่ารำคาญเล็ก ๆ น้อย ๆ 177 00:07:54,070 --> 00:07:56,020 มันไม่ได้เป็นจริงจะ segfault ในกรณีนี้ 178 00:07:56,020 --> 00:07:59,860 printf เป็นเพียงเล็กน้อยพิเศษเพราะ ก็สุดเพื่อให้ใช้กันโดยทั่วไปว่า 179 00:07:59,860 --> 00:08:03,570 หลัก printf จะทำ เราชอบและตระหนัก 180 00:08:03,570 --> 00:08:04,830 ที่ไม่ได้เป็นตัวชี้ที่ถูกต้อง 181 00:08:04,830 --> 00:08:09,080 ให้ฉันใช้มันกับตัวเองที่จะเพียงแค่พิมพ์ ออกในวงเล็บโมฆะแม้ 182 00:08:09,080 --> 00:08:13,340 แม้ว่ามันจะไม่จำเป็นอะไร ตัวเราเองคาดว่า 183 00:08:13,340 --> 00:08:16,940 >> ดังนั้นเราจึงไม่สามารถจริงๆได้อย่างง่ายดายทำให้เกิด segfault กับการนี​​้ แต่อย่างชัดเจนนี้ 184 00:08:16,940 --> 00:08:18,600 ไม่ใช่พฤติกรรมที่ฉันต้องการ 185 00:08:18,600 --> 00:08:19,800 ดังนั้นทางออกที่ง่ายคืออะไร 186 00:08:19,800 --> 00:08:25,650 ทั้งใน scanf-2 ให้ฉันเสนอว่า แทนการจัดสรรจริงเพียง 187 00:08:25,650 --> 00:08:30,100 char * ให้ฉันเป็นเพียงเล็กน้อยอย่างชาญฉลาดเกี่ยวกับ นี้และแจ้งให้เราจัดสรรบัฟเฟอร์ 188 00:08:30,100 --> 00:08:32,940 เป็นลำดับจาก 16 ตัวอักษร 189 00:08:32,940 --> 00:08:34,200 >> ดังนั้นผมจึงสามารถทำเช่นนี้ในสองวิธี 190 00:08:34,200 --> 00:08:35,610 ฉันอย่างสามารถใช้ malloc 191 00:08:35,610 --> 00:08:38,980 แต่ผมสามารถกลับไปสัปดาห์ที่สองเมื่อ ผมจำเป็นต้องมีทั้งกลุ่ม 192 00:08:38,980 --> 00:08:39,620 อักขระ 193 00:08:39,620 --> 00:08:40,860 นั่นเป็นเพียงอาร์เรย์ 194 00:08:40,860 --> 00:08:44,870 เพื่อให้ฉันแทน redefine บัฟเฟอร์ เป็นอาร์เรย์ของ 16 ตัวอักษร 195 00:08:44,870 --> 00:08:47,340 >> และตอนนี้เมื่อฉันผ่านบัฟเฟอร์ใน - 196 00:08:47,340 --> 00:08:49,940 และนี่คือสิ่งที่เราไม่ได้ พูดคุยเกี่ยวกับในสัปดาห์ที่สอง - 197 00:08:49,940 --> 00:08:53,730 แต่คุณสามารถรักษาอาร์เรย์เป็น แม้ว่ามันจะอยู่ 198 00:08:53,730 --> 00:08:56,390 ในทางเทคนิคที่เราได้เห็นพวกเขากำลัง แตกต่างกันเล็กน้อย 199 00:08:56,390 --> 00:09:01,290 แต่ scanf จะไม่ทราบถ้าคุณผ่านมัน ชื่อของอาร์เรย์เพราะสิ่งที่ 200 00:09:01,290 --> 00:09:05,030 เสียงดังกราวจะทำเพื่อเราเป็นหลัก รักษาชื่อของอาร์เรย์ที่เป็น 201 00:09:05,030 --> 00:09:08,280 ที่อยู่ของก้อน 16 ไบต์ 202 00:09:08,280 --> 00:09:09,550 >> ดังนั้นนี่คือที่ดีขึ้น 203 00:09:09,550 --> 00:09:12,110 ซึ่งหมายความว่าตอนนี้ที่ฉันสามารถหวังว่า ทำต่อไปนี้ 204 00:09:12,110 --> 00:09:16,800 ผมขอซูมออกอยู่ครู่หนึ่งแล้ว จะทำให้ scanf-2 รวบรวมตกลง 205 00:09:16,800 --> 00:09:19,390 ตอนนี้ให้ฉันทำอะไรได้เฉือน scanf-2 206 00:09:19,390 --> 00:09:22,430 String โปรด "Hello." และมัน ดูเหมือนจะทำงานในเวลานี้ 207 00:09:22,430 --> 00:09:26,020 >> แต่คนที่สามารถนำเสนอสถานการณ์ ในสิ่งที่มันอาจจะไม่ยังคงทำงาน? 208 00:09:26,020 --> 00:09:28,550 อ้าง? 209 00:09:28,550 --> 00:09:30,640 บางสิ่งบางอย่างนานกว่า 16 ตัวอักษร 210 00:09:30,640 --> 00:09:32,020 และที่จริงเราสามารถเป็น เล็ก ๆ น้อย ๆ ที่แม่นยำยิ่งขึ้น 211 00:09:32,020 --> 00:09:36,540 บางสิ่งบางอย่างอีกต่อไปแล้ว 15 ตัวอักษร, เพราะจริงๆเราจำเป็นต้องเก็บไว้ในใจ 212 00:09:36,540 --> 00:09:39,920 ว่าเราต้องเป็นศูนย์เครื่องหมายทับขวาที่ โดยปริยายในตอนท้ายของสตริง, 213 00:09:39,920 --> 00:09:42,950 ซึ่งเป็นกัน scanf จะมัก ในการดูแลของเรา 214 00:09:42,950 --> 00:09:46,210 >> เพื่อให้ฉันทำสิ่งที่ชอบ - 215 00:09:46,210 --> 00:09:48,040 บางครั้งเราก็สามารถ ปล่อยให้มันเป็นอย่างนั้น 216 00:09:48,040 --> 00:09:50,630 OK เพื่อให้เราได้เกิดในขณะนี้ แบ่งส่วนความผิดของเรา 217 00:09:50,630 --> 00:09:51,000 ทำไม? 218 00:09:51,000 --> 00:09:54,940 เพราะฉันพิมพ์ไปกว่า 15 อักขระและเพื่อให้เราได้จริง 219 00:09:54,940 --> 00:09:58,280 หน่วยความจำสัมผัสที่จริงผม ไม่ควรมี 220 00:09:58,280 --> 00:10:00,180 >> ดังนั้นจริงๆสิ่งที่แก้ปัญหาที่นี่? 221 00:10:00,180 --> 00:10:02,210 ดีสิ่งที่ถ้าเราต้องการสตริงอีกต่อไป? 222 00:10:02,210 --> 00:10:03,960 ดีเราอาจจะทำให้มันเป็น 32 ไบต์ 223 00:10:03,960 --> 00:10:05,160 ดีสิ่งที่ถ้าที่ไม่นานเพียงพอหรือไม่ 224 00:10:05,160 --> 00:10:06,040 วิธีการเกี่ยวกับ 64 ไบต์? 225 00:10:06,040 --> 00:10:07,080 เกิดอะไรขึ้นถ้าที่ไม่ยาวเพียงพอหรือไม่ 226 00:10:07,080 --> 00:10:09,640 วิธีการเกี่ยวกับ 128 หรือ 200 ไบต์? 227 00:10:09,640 --> 00:10:12,660 จริงๆสิ่งที่เป็นวิธีการแก้ที่นี่ใน กรณีทั่วไปถ้าเราไม่ทราบ 228 00:10:12,660 --> 00:10:14,460 ความก้าวหน้าของสิ่งที่ผู้ใช้จะพิมพ์? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> มันเป็นเพียงชนิดของความเจ็บปวดขนาดใหญ่ในลา, จะซื่อสัตย์ซึ่งเป็นเหตุผลที่ 231 00:10:23,050 --> 00:10:29,050 CS50 ห้องสมุดมีสายไม่กี่โหลจาก รหัสที่ใช้เรียก 232 00:10:29,050 --> 00:10:32,390 getString สตริงในทางที่เราทำไม่ได้ ต้องรู้ล่วงหน้าว่า 233 00:10:32,390 --> 00:10:33,430 ผู้ใช้จะพิมพ์ 234 00:10:33,430 --> 00:10:37,370 โดยเฉพาะอย่างยิ่งถ้าคุณมองกลับไปที่ cs50.c จากสองสัปดาห์ที่ผ่านมาคุณจะเห็น 235 00:10:37,370 --> 00:10:40,480 GetString ว่าไม่จริง ได้ใช้ scanf ในลักษณะนี้ 236 00:10:40,480 --> 00:10:43,720 แต่ก็อ่านตัวละครตัวหนึ่ง ได้ตลอดเวลา 237 00:10:43,720 --> 00:10:46,010 >> เพราะสิ่งหนึ่งที่ดีเกี่ยวกับ การอ่านเป็นตัวละครตัวหนึ่งที่เราสามารถทำได้ 238 00:10:46,010 --> 00:10:48,490 รับประกันตัวเองอยู่เสมอ มีอย่างน้อยหนึ่งถ่าน 239 00:10:48,490 --> 00:10:51,740 ผมสามารถประกาศถ่านและจากนั้นใช้ เหล่านี้ขั้นตอนทารกอย่างแท้จริงที่จะเพียงแค่ 240 00:10:51,740 --> 00:10:54,380 อ่านตัวละครตัวหนึ่งในที่ เวลาจากแป้นพิมพ์ 241 00:10:54,380 --> 00:10:58,240 และแล้วสิ่งที่คุณจะเห็น GetString ไม่เป็นเวลาที่มันไหลออกมาจากทุก 242 00:10:58,240 --> 00:11:02,280 พูด, 16 ไบต์ของหน่วยความจำจะใช้ malloc หรือญาติของมันไป 243 00:11:02,280 --> 00:11:06,810 จัดสรรหน่วยความจำมากขึ้นการคัดลอกเก่า หน่วยความจำเข้าไปใหม่และจากนั้นรวบรวมข้อมูล 244 00:11:06,810 --> 00:11:09,900 พร้อมรับตัวละครตัวหนึ่งในเวลา, และเมื่อมันวิ่งออกไปจากที่ 245 00:11:09,900 --> 00:11:13,370 หน่วยความจำอันโยนมันออกไปคว้า เป็นก้อนขนาดใหญ่ของหน่วยความจำชุดเก่า 246 00:11:13,370 --> 00:11:14,750 เข้าไปใหม่ซ้ำแล้วซ้ำอีกและ 247 00:11:14,750 --> 00:11:18,480 และมันก็เป็นความเจ็บปวดอย่างแท้จริงที่จริง ใช้สิ่งที่ง่ายเป็น 248 00:11:18,480 --> 00:11:19,710 ได้รับข้อมูลจากผู้ใช้ 249 00:11:19,710 --> 00:11:21,090 >> ดังนั้นคุณสามารถใช้ scanf 250 00:11:21,090 --> 00:11:22,430 คุณสามารถใช้ฟังก์ชั่นอื่นที่คล้ายคลึงกัน 251 00:11:22,430 --> 00:11:25,420 และจำนวนมากที่มีตำราและออนไลน์ ตัวอย่างทำ แต่พวกเขากำลังทั้งหมด 252 00:11:25,420 --> 00:11:27,210 ความเสี่ยงที่จะมีปัญหาเช่นนี้ 253 00:11:27,210 --> 00:11:29,550 และในที่สุดได้รับการ, segfault เป็นชนิดที่น่ารำคาญ 254 00:11:29,550 --> 00:11:30,680 มันไม่ดีสำหรับผู้ใช้ 255 00:11:30,680 --> 00:11:33,560 >> แต่ในกรณีที่เลวร้ายที่สุดสิ่งที่ไม่ มันลึกซึ้งใส่ของคุณ 256 00:11:33,560 --> 00:11:37,160 รหัสที่มีความเสี่ยง? 257 00:11:37,160 --> 00:11:39,250 บางชนิดของการโจมตีที่อาจเกิดขึ้น 258 00:11:39,250 --> 00:11:41,680 เราได้พูดคุยเกี่ยวกับการโจมตีดังกล่าวเป็นหนึ่ง - ล้นสแต็ค 259 00:11:41,680 --> 00:11:44,660 แต่โดยทั่วไปถ้าคุณได้รับอนุญาตให้ หน่วยความจำล้นเหมือนที่เราทำ 260 00:11:44,660 --> 00:11:48,070 สองสามสัปดาห์ที่ผ่านมามีเพียงการเขียน มากไปกว่า "สวัสดี" ใน stack คุณ 261 00:11:48,070 --> 00:11:52,330 แน่นอนสามารถใช้เวลามากกว่าอาจ คอมพิวเตอร์หรืออย่างน้อยได้รับข้อมูลที่ว่า 262 00:11:52,330 --> 00:11:53,510 ไม่ได้เป็นของคุณ 263 00:11:53,510 --> 00:11:55,970 >> ดังนั้นในระยะสั้นนี้คือเหตุผลที่เรามี ที่ล้อการฝึกอบรม 264 00:11:55,970 --> 00:11:59,090 แต่ตอนนี้เราเริ่มที่จะพาพวกเขาออกไป เป็นโปรแกรมที่เราไม่จำเป็นต้อง, 265 00:11:59,090 --> 00:12:00,610 จำเป็นต้องป้อนข้อมูลจากผู้ใช้ 266 00:12:00,610 --> 00:12:03,960 แต่ในกรณีของปัญหาที่กำหนดหก, ใส่ของคุณจะมาจากขนาดใหญ่ 267 00:12:03,960 --> 00:12:07,520 ไฟล์พจนานุกรมที่มี 150 บาง คำพันแปลก 268 00:12:07,520 --> 00:12:10,330 >> ดังนั้นคุณจะไม่ต้องกังวลเกี่ยวกับ การป้อนข้อมูลโดยพลการของผู้ใช้ 269 00:12:10,330 --> 00:12:13,720 เราจะให้สมมติฐานบางอย่าง เกี่ยวกับไฟล์ที่ 270 00:12:13,720 --> 00:12:20,340 คำถามใด ๆ เกี่ยวกับตัวชี้หรือ scanf หรือผู้ใช้ป้อนในทั่วไป? 271 00:12:20,340 --> 00:12:24,450 >> ขวาทั้งหมดเพื่อให้ดูอย่างรวดเร็วแล้วที่หนึ่ง ตามหัวข้อจากสองสัปดาห์ที่ผ่านมา 272 00:12:24,450 --> 00:12:28,590 และนั่นก็คือค​​วามคิดของ struct นี้ 273 00:12:28,590 --> 00:12:34,180 ไม่ว่า - ความคิดของนี้ struct ซึ่งเป็นอะไร 274 00:12:34,180 --> 00:12:35,430 struct ไม่ทำอะไรให้เรา? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> กำหนด - 277 00:12:39,860 --> 00:12:41,710 เสียใจ? 278 00:12:41,710 --> 00:12:42,820 กำหนดชนิดตัวแปร 279 00:12:42,820 --> 00:12:44,410 ดังนั้นการจัดเรียงของ 280 00:12:44,410 --> 00:12:46,180 เรากำลังจริงรวมสองหัวข้อ 281 00:12:46,180 --> 00:12:49,510 ดังนั้นด้วย typedef, จำได้ว่าเราสามารถ ประกาศของเราเองเช่น 282 00:12:49,510 --> 00:12:51,500 ไวพจน์, สตริงเหมือนถ่าน * 283 00:12:51,500 --> 00:12:56,200 แต่การใช้ typedef struct และเราสามารถ สร้างโครงสร้างที่แท้จริงของเราเองข้อมูล 284 00:12:56,200 --> 00:12:59,600 >> ตัวอย่างเช่นถ้าผมกลับไปสู่​​ Gedit ที่นี่รอสักครู่และฉันไปข้างหน้า 285 00:12:59,600 --> 00:13:08,230 และทำสิ่งที่ต้องการให้ฉันช่วย นี้เป็นสมมติว่า, structs.c 286 00:13:08,230 --> 00:13:10,840 ชั่วคราวฉันแค่ไป ไปข้างหน้าและรวมถึง 287 00:13:10,840 --> 00:13:14,360 standardio.h, เป็นโมฆะหลัก int 288 00:13:14,360 --> 00:13:18,960 จากนั้นในที่นี่สมมติว่าฉันต้องการ การเขียนโปรแกรมที่จัดเก็บ 289 00:13:18,960 --> 00:13:21,840 นักเรียนหลายชุดจาก บ้านตัวอย่างเช่น 290 00:13:21,840 --> 00:13:24,430 ดังนั้นมันก็เหมือน registrarial ฐานข้อมูลของการจัดเรียงบาง 291 00:13:24,430 --> 00:13:29,550 >> ดังนั้นถ้าฉันต้องชื่อนักศึกษาคนหนึ่งผม อาจจะทำบางสิ่งบางอย่างเช่นชื่อ char * 292 00:13:29,550 --> 00:13:31,570 และฉันจะทำสิ่งที่ชอบ - 293 00:13:31,570 --> 00:13:34,410 จริงให้ใช้ CS50 ห้องสมุด รอสักครู่เพื่อให้นี้ 294 00:13:34,410 --> 00:13:38,380 เล็กน้อยง่ายเพื่อให้เราสามารถยืม หลายสิบคนจากบรรทัดของรหัส 295 00:13:38,380 --> 00:13:39,340 และขอเพียงแค่ให้มันง่าย 296 00:13:39,340 --> 00:13:42,610 เราจะเก็บสตริง, และตอนนี้ getString 297 00:13:42,610 --> 00:13:47,420 >> ดังนั้นผมจึงเรียกร้องในขณะนี้ที่ฉันได้เก็บไว้ชื่อ ของนักเรียนบางส่วนและที่บ้านของ 298 00:13:47,420 --> 00:13:50,240 นักเรียนบางเพียงแค่ใช้ตัวแปร เช่นเดียวกับที่เราทำและในหนึ่งสัปดาห์ 299 00:13:50,240 --> 00:13:52,370 แต่คิดว่าตอนนี้ผมต้องการให้การสนับสนุน นักเรียนหลาย ๆ 300 00:13:52,370 --> 00:13:58,460 ทั้งหมดขวาดังนั้นสัญชาตญาณของฉันที่จะทำ สตริง name2 ได้รับสตริง GetString 301 00:13:58,460 --> 00:14:01,370 House2 ได้รับ GetString 302 00:14:01,370 --> 00:14:05,850 แล้วนักเรียนที่สามของเรา ขอทำ NAME3 GetString 303 00:14:05,850 --> 00:14:09,170 >> ขวาทั้งหมดดังนั้นนี่คือความหวังที่โดดเด่น คุณเป็นชนิดของโง่ 304 00:14:09,170 --> 00:14:11,580 เนื่องจากกระบวนการนี​​้เป็นจริงไม่เคย จะจบและก็แค่ไป 305 00:14:11,580 --> 00:14:13,130 ทำให้รหัสของฉันดูแย่ลง และแย่ลงและแย่ลง 306 00:14:13,130 --> 00:14:14,810 แต่เราแก้ปัญหานี้เช่นกันในสัปดาห์ที่สอง 307 00:14:14,810 --> 00:14:19,450 สิ่งที่แก้ปัญหาค่อนข้างสะอาดของเรา เมื่อเรามีหลายตัวแปรของ 308 00:14:19,450 --> 00:14:23,580 ประเภทข้อมูลเดียวกันที่เกี่ยวข้องทั้งหมด แต่ เราไม่อยากให้เรื่องนี้เป็นระเบียบที่เลวร้าย 309 00:14:23,580 --> 00:14:26,870 ของตัวแปรชื่อเดียว? 310 00:14:26,870 --> 00:14:30,060 เราทำอะไรแทน? 311 00:14:30,060 --> 00:14:31,260 >> ดังนั้นฉันคิดว่าฉันได้ยินสถานที่ไม่กี่ 312 00:14:31,260 --> 00:14:32,590 เรามีอาร์เรย์ 313 00:14:32,590 --> 00:14:37,110 หากคุณต้องการหลายกรณี บางสิ่งบางอย่างทำไมเราไม่ทำความสะอาดทั้งหมดนี้ 314 00:14:37,110 --> 00:14:39,540 ขึ้นมาและเพียงแค่พูดให้ฉัน อาร์เรย์เรียกชื่อ? 315 00:14:39,540 --> 00:14:41,640 >> และสำหรับตอนนี้ขอรหัสยาก 3 316 00:14:41,640 --> 00:14:44,450 แล้วให้ฉันอาร์เรย์อีก ที่เรียกว่าบ้านและแจ้งให้เราสำหรับ 317 00:14:44,450 --> 00:14:45,800 ขณะนี้ยากรหัส 3 318 00:14:45,800 --> 00:14:49,220 และฉันได้ทำความสะอาดอย่างหนาแน่นขึ้น รับประทานอาหารที่ฉันเพิ่งสร้าง 319 00:14:49,220 --> 00:14:52,400 ตอนนี้ฉันยังคงรหัสยาก 3 แต่แม้ 3 แบบไดนามิกอาจมาจาก 320 00:14:52,400 --> 00:14:54,350 ผู้ใช้หรือ argv หรือเช่น 321 00:14:54,350 --> 00:14:55,720 ดังนั้นนี่คือการทำความสะอาดแล้ว 322 00:14:55,720 --> 00:15:00,100 >> แต่สิ่งที่น่ารำคาญเกี่ยวกับเรื่องนี้ก็คือ ตอนนี้ถึงแม้ว่าชื่อเป็นอย่างใด 323 00:15:00,100 --> 00:15:02,280 เชื่อมโยงลึกซึ้ง บ้านของนักเรียน - 324 00:15:02,280 --> 00:15:04,720 มันเป็นนักเรียนที่ผม ต้องการที่จะเป็นตัวแทน - 325 00:15:04,720 --> 00:15:08,080 ตอนนี้ผมมีสองอาร์เรย์ที่เป็นคู่ขนาน ในแง่ที่ว่าพวกเขากำลัง 326 00:15:08,080 --> 00:15:13,930 วงเล็บขนาดเดียวกันชื่อและ 0 แผนที่น่าจะยึดบ้าน 0, 327 00:15:13,930 --> 00:15:16,600 และชื่อวงเล็บ 1 แผนที่ ยึดบ้าน 1 328 00:15:16,600 --> 00:15:19,280 ในคำอื่น ๆ นักเรียนที่อาศัยอยู่ใน บ้านหลังนั้นและที่นักเรียนคนอื่น 329 00:15:19,280 --> 00:15:20,530 อาศัยอยู่ในบ้านอื่น ๆ ที่ 330 00:15:20,530 --> 00:15:23,720 แต่แน่นอนนี้อาจจะ ทำมากยิ่งขึ้นหมดจด 331 00:15:23,720 --> 00:15:24,990 >> ดีก็สามารถจะทำได้ในความเป็นจริง 332 00:15:24,990 --> 00:15:28,730 และแจ้งให้เราไปข้างหน้าและเปิด ขึ้น structs.h และคุณจะ 333 00:15:28,730 --> 00:15:31,130 ดูความคิดนี้ที่นี่ 334 00:15:31,130 --> 00:15:34,905 ขอให้สังเกตว่าที่ผมเคยใช้ typedef เป็นคุณ พาดพิงถึงช่วงเวลาที่ผ่านมาในการประกาศของเรา 335 00:15:34,905 --> 00:15:35,570 ชนิดข้อมูลของตัวเอง 336 00:15:35,570 --> 00:15:39,660 แต่ฉันยังใช้คำหลักอื่น ๆ เรียกว่า struct ซึ่งทำให้ผมใหม่ 337 00:15:39,660 --> 00:15:40,790 โครงสร้างข้อมูล 338 00:15:40,790 --> 00:15:43,980 >> และโครงสร้างข้อมูลที่ผมเรียกร้องที่เกิดขึ้น มีสองสิ่งที่อยู่ภายใน 339 00:15:43,980 --> 00:15:47,060 มัน - สตริงเรียกชื่อและ สตริงที่เรียกว่าบ้าน 340 00:15:47,060 --> 00:15:49,820 และชื่อของฉันจะมอบให้กับ นี้โครงสร้างข้อมูลที่เกิดขึ้น 341 00:15:49,820 --> 00:15:51,005 จะเรียกว่านักเรียน 342 00:15:51,005 --> 00:15:54,030 ฉันจะเรียกมันว่าอะไรที่ฉันต้องการ แต่ความหมายนี้ทำให้ 343 00:15:54,030 --> 00:15:55,810 รู้สึกถึงฉันในใจของฉัน 344 00:15:55,810 --> 00:15:59,160 >> ดังนั้นตอนนี้ถ้าผมเปิดเป็นรุ่นที่ดีกว่า ของโปรแกรมที่ผมเริ่มเขียน 345 00:15:59,160 --> 00:16:00,390 มีให้ฉันเลื่อนไปด้านบน 346 00:16:00,390 --> 00:16:03,190 และมีเส้นบางมากขึ้นรหัสของ ที่นี่ แต่ให้ฉันมุ่งเน้นสำหรับ 347 00:16:03,190 --> 00:16:04,160 ขณะที่หนึ่ง 348 00:16:04,160 --> 00:16:07,790 ผมเคยประกาศนักเรียนที่เรียกว่าค่าคงที่ และรหัสยาก 3 สำหรับตอนนี้ 349 00:16:07,790 --> 00:16:11,110 แต่ตอนนี้แจ้งให้ทราบว่าการทำความสะอาด รหัสของฉันเริ่มที่จะได้รับ 350 00:16:11,110 --> 00:16:15,030 >> ในบรรทัดที่ 22 ผมประกาศ อาร์เรย์ของนักเรียน 351 00:16:15,030 --> 00:16:18,760 และสังเกตเห็นว่านักเรียนเห็นได้ชัดคือ ขณะนี้ชนิดข้อมูล 352 00:16:18,760 --> 00:16:23,360 เพราะที่ด้านบนของไฟล์นี้, แจ้งให้ทราบล่วงหน้า เราได้รวมไฟล์ส่วนหัวที่ 353 00:16:23,360 --> 00:16:24,820 ที่ฉันดึงขึ้นเพียงแค่ช่วงเวลาที่ผ่านมา 354 00:16:24,820 --> 00:16:28,820 และไฟล์ส่วนหัวที่ค่อนข้างง่ายมี นิยามของนักเรียนนี้ 355 00:16:28,820 --> 00:16:32,470 >> ดังนั้นตอนนี้เราได้สร้างข้อมูลของฉันเอง ชนิดที่ผู้เขียนของปี C 356 00:16:32,470 --> 00:16:33,890 ที่ผ่านมาไม่ได้คิดล่วงหน้า 357 00:16:33,890 --> 00:16:34,570 แต่ไม่มีปัญหา 358 00:16:34,570 --> 00:16:35,870 ฉันสามารถทำให้ตัวเอง 359 00:16:35,870 --> 00:16:39,050 ดังนั้นนี่คืออาร์เรย์เรียกว่านักเรียน, สมาชิกแต่ละคนมี 360 00:16:39,050 --> 00:16:41,100 เป็นโครงสร้างนักเรียน 361 00:16:41,100 --> 00:16:44,270 และฉันต้องการสามของคนเหล่านั้น ในอาร์เรย์ 362 00:16:44,270 --> 00:16:46,030 >> และตอนนี้ส่วนที่เหลือจะทำอะไร ของโปรแกรมนี้ทำอะไร? 363 00:16:46,030 --> 00:16:47,550 ผมจำเป็นต้องมีบางสิ่งบางอย่างเล็ก ๆ น้อย ๆ โดยพลการ 364 00:16:47,550 --> 00:16:51,450 ดังนั้นจากออนไลน์ 24 เป็นต้นไป ผมย้ำ 0-3 365 00:16:51,450 --> 00:16:54,000 จากนั้นผมก็ขอให้ผู้ใช้ ชื่อของนักเรียน 366 00:16:54,000 --> 00:16:56,110 และแล้วฉันจะใช้ GetString เป็นมาก่อน 367 00:16:56,110 --> 00:16:59,410 แล้วผมก็ถามหาบ้านของนักเรียน, และฉันจะใช้ getString เป็นมาก่อน 368 00:16:59,410 --> 00:17:01,780 >> แต่แจ้งให้ทราบล่วงหน้า - ใหม่เล็กน้อย ชิ้นส่วนของไวยากรณ์ - 369 00:17:01,780 --> 00:17:07,010 ฉันสามารถดัชนียังคงนักเรียนที่ i, แต่ฉันจะได้รับข้อมูลเฉพาะที่ 370 00:17:07,010 --> 00:17:08,354 ภายในสนามของ struct? 371 00:17:08,354 --> 00:17:11,770 ดีว่าเห็นได้ชัดว่าสิ่งที่ ชิ้นใหม่ของไวยากรณ์? 372 00:17:11,770 --> 00:17:13,339 มันเป็นเพียงจุดประกอบ 373 00:17:13,339 --> 00:17:14,510 >> เราไม่เคยเห็นจริงๆแบบนี้มาก่อน 374 00:17:14,510 --> 00:17:17,819 คุณได้เห็นมันใน pset ห้าถ้าคุณได้ พุ่งในแล้วกับแฟ้มบิตแมป 375 00:17:17,819 --> 00:17:22,372 แต่จุดก็หมายความภายในนี้ struct หรือหลายเขตข้อมูลให้จุด 376 00:17:22,372 --> 00:17:24,510 ชื่อหรือให้ฉัน dot บ้าน 377 00:17:24,510 --> 00:17:28,690 นั่นหมายถึงการไปภายในของ struct และได้รับข้อมูลเหล่านั้นโดยเฉพาะอย่างยิ่ง 378 00:17:28,690 --> 00:17:30,200 >> ส่วนที่เหลือของโปรแกรมนี้ทำอะไรได้บ้าง 379 00:17:30,200 --> 00:17:31,190 มันไม่ทั้งหมดที่เซ็กซี่ 380 00:17:31,190 --> 00:17:34,640 ขอให้สังเกตว่าผมย้ำ 0-3 อีกครั้ง และฉันเพียงแค่สร้างภาษาอังกฤษ 381 00:17:34,640 --> 00:17:40,500 วลีเช่นดังนั้นจึงอยู่ในดังกล่าวและ เช่นบ้านที่ผ่านในชื่อจุดจาก 382 00:17:40,500 --> 00:17:43,320 นักเรียนที่ i ของพวกเขาและ บ้านเช่นกัน 383 00:17:43,320 --> 00:17:47,560 >> แล้วท้ายสุดคือตอนนี้เราจะเริ่มต้นเพื่อให้ได้ ทางทวารหนั​​กเกี่ยวกับเรื่องนี้ในขณะนี้ว่าเรา 384 00:17:47,560 --> 00:17:49,580 คุ้นเคยกับสิ่งที่ malloc และ ฟังก์ชั่นอื่น ๆ ได้รับ 385 00:17:49,580 --> 00:17:50,570 ทำทุกอย่างในเวลานี้ 386 00:17:50,570 --> 00:17:54,220 ฉันจะมีให้เป็นอิสระทั้งชื่อทำไม บ้านและแม้ว่าฉัน 387 00:17:54,220 --> 00:17:56,960 ไม่ได้เรียก malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString ไม่ 389 00:17:58,020 --> 00:18:00,930 และนั่นก็คือค​​วามลับสกปรกน้อยสำหรับ เป็นเวลาหลายสัปดาห์ แต่มี GetString 390 00:18:00,930 --> 00:18:03,530 รับหน่วยความจำรั่วทั่ว วางภาคการศึกษาทั้งหมดป่านนี้ 391 00:18:03,530 --> 00:18:05,990 และในที่สุดจะ Valgrand เปิดเผยเรื่องนี้กับเรา 392 00:18:05,990 --> 00:18:10,730 >> แต่มันไม่ใช่เรื่องใหญ่เพราะฉันรู้ว่า ว่าฉันก็สามารถฟรีชื่อ 393 00:18:10,730 --> 00:18:15,750 บ้านและถึงแม้ว่าในทางเทคนิคไป เป็นซุปเปอร์เซฟซุปเปอร์ฉันควรจะ 394 00:18:15,750 --> 00:18:17,890 การทำข้อผิดพลาดการตรวจสอบนี่คือบางส่วน 395 00:18:17,890 --> 00:18:19,040 สัญชาตญาณของคุณจะบอกคุณคืออะไร? 396 00:18:19,040 --> 00:18:22,480 ผมควรจะตรวจสอบ ก่อนที่ฉันจะเป็นอิสระในสิ่งที่เป็น 397 00:18:22,480 --> 00:18:25,470 สตริงอาคาซึ่ง char *? 398 00:18:25,470 --> 00:18:33,460 >> ฉันควรจริงๆจะตรวจสอบว่านักเรียน ชื่อวงเล็บผมจุดไม่ได้ 399 00:18:33,460 --> 00:18:34,840 โมฆะเท่ากับ 400 00:18:34,840 --> 00:18:40,400 แล้วมันจะตกลงไปข้างหน้าและฟรี ตัวชี้นั้นและเดียวกันหรืออื่น ๆ 401 00:18:40,400 --> 00:18:41,160 หนึ่งเช่นกัน 402 00:18:41,160 --> 00:18:46,860 ถ้านักเรียนวงเล็บผม dot บ้านไม่ได้ เท่ากับโมฆะในตอนนี้จะให้ความคุ้มครอง 403 00:18:46,860 --> 00:18:52,520 กับกรณีที่มุมที่ ผลตอบแทนที่ GetString สิ่งที่ต้องการโมฆะ 404 00:18:52,520 --> 00:18:57,310 และเราได้เห็นช่วงเวลาที่ผ่านมาจะ printf ปกป้องเราขึ้นที่นี่โดยเพียงแค่บอกว่า 405 00:18:57,310 --> 00:18:58,990 โมฆะซึ่งจะไปดูแปลก 406 00:18:58,990 --> 00:19:02,340 แต่อย่างน้อยก็จะไม่ segfault, ในขณะที่เราได้เห็น 407 00:19:02,340 --> 00:19:05,990 >> ดีให้ฉันทำสิ่งหนึ่งที่อื่น ๆ ที่นี่ structs-0 เป็นชนิดของโปรแกรมที่โง่ 408 00:19:05,990 --> 00:19:09,700 เพราะผมป้อนข้อมูลทั้งหมดนี้แล้ว มันหายไปทันทีที่โปรแกรมกำลังจะสิ้นสุดลง 409 00:19:09,700 --> 00:19:10,940 แต่ให้ฉันไปข้างหน้าและทำเช่นนี้ 410 00:19:10,940 --> 00:19:12,830 ผมขอให้ขั้ว หน้าต่างบิตที่ใหญ่กว่า 411 00:19:12,830 --> 00:19:17,000 ผมขอให้ structs-1 ซึ่ง รุ่นใหม่ของที่นี่คือ 412 00:19:17,000 --> 00:19:18,520 >> ผมจะซูมในนิด ๆ หน่อย ๆ 413 00:19:18,520 --> 00:19:21,620 และตอนนี้ให้ฉันทำงานจุด เฉือน structs-1 414 00:19:21,620 --> 00:19:22,590 ชื่อของนักเรียน - 415 00:19:22,590 --> 00:19:31,500 เดวิดท้องขอทำร็อบเคิร์กแลนด์, ขอทำลอเรน Leverett 416 00:19:31,500 --> 00:19:33,650 มีอะไรที่น่าสนใจในขณะนี้คือการแจ้งให้ทราบ - 417 00:19:33,650 --> 00:19:35,540 และฉันเพียงรู้นี้เพราะ ผมเขียนโปรแกรม - 418 00:19:35,540 --> 00:19:38,930 มีไฟล์ตอนนี้เมื่อปัจจุบันของฉัน ไดเรกทอรีที่เรียกว่า students.csv 419 00:19:38,930 --> 00:19:40,420 บางส่วนของคุณอาจได้เห็น เหล่านี้ในโลกจริง 420 00:19:40,420 --> 00:19:42,980 >> ไฟล์ CSV คืออะไร? 421 00:19:42,980 --> 00:19:44,170 ค่าที่คั่นด้วยจุลภาค 422 00:19:44,170 --> 00:19:46,670 มันเป็นประเภทเช่นคนยากจน รุ่นของไฟล์ Excel 423 00:19:46,670 --> 00:19:50,580 มันเป็นตารางของแถวและคอลัมน์ที่ คุณสามารถเปิดในโปรแกรมเช่น Excel, 424 00:19:50,580 --> 00:19:51,800 ตัวเลขหรือบน Mac 425 00:19:51,800 --> 00:19:55,180 >> และถ้าฉันเปิดแฟ้มนี้ที่นี่ใน Gedit, แจ้งให้ทราบล่วงหน้า - และตัวเลขที่ไม่ได้มี 426 00:19:55,180 --> 00:19:57,360 นั่นเป็นเพียง gedit บอก ฉันหมายเลขบรรทัด 427 00:19:57,360 --> 00:19:59,740 ให้สังเกตในบรรทัดแรกของเรื่องนี้ ไฟล์เดวิดและท้อง 428 00:19:59,740 --> 00:20:01,450 บรรทัดถัดไปคือร็อบจุลภาคเคิร์กแลนด์ 429 00:20:01,450 --> 00:20:04,170 และบรรทัดที่สามคือลอเรน Leverett จุลภาค 430 00:20:04,170 --> 00:20:05,480 >> ดังนั้นผมจึงมีสิ่งที่ถูกสร้างขึ้น? 431 00:20:05,480 --> 00:20:09,580 ผมเคยเขียนในขณะนี้โปรแกรม C ที่ ได้อย่างมีประสิทธิภาพสามารถสร้างสเปรดชีต 432 00:20:09,580 --> 00:20:11,840 ที่สามารถเปิดได้ใน โปรแกรมเช่น Excel 433 00:20:11,840 --> 00:20:15,520 ไม่ใช่สิ่งที่น่าสนใจชุดข้อมูล แต่ ถ้าคุณมีชิ้นใหญ่มาก 434 00:20:15,520 --> 00:20:18,440 ข้อมูลจริงที่คุณต้องการ จัดการและทำให้กราฟและ 435 00:20:18,440 --> 00:20:21,260 เช่นนี้อาจจะเป็นหนึ่ง วิธีการสร้างข้อมูลที่ 436 00:20:21,260 --> 00:20:25,370 นอกจากนี้ CSV ทั้งหมดเป็นซุปเปอร์จริงร่วมกัน เพียงแค่สำหรับการจัดเก็บข้อมูลง่าย - 437 00:20:25,370 --> 00:20:28,940 การเงิน yahoo ตัวอย่างเช่นถ้าคุณได้รับ ราคาหุ้นผ่านทางของพวกเขาที่เรียกว่า 438 00:20:28,940 --> 00:20:33,180 API, บริการฟรีที่ช่วยให้คุณสามารถ ได้รับหุ้น up-to-วันที่หมุนเวียน 439 00:20:33,180 --> 00:20:35,650 คำพูดสำหรับ บริษัท ที่พวกเขา ให้ข้อมูลย้อนกลับไปใน 440 00:20:35,650 --> 00:20:37,800 รูปแบบ CSV ง่ายสุด 441 00:20:37,800 --> 00:20:39,380 >> ดังนั้นวิธีที่เราไม่ทำอย่างนั้น? 442 00:20:39,380 --> 00:20:42,530 ดีสังเกตเห็นส่วนใหญ่ของโปรแกรมนี้ เกือบเดียวกัน 443 00:20:42,530 --> 00:20:46,870 แต่สังเกตเห็นลงที่นี่มากกว่าการพิมพ์ นักเรียนออกเมื่อวันที่ 35 เส้น 444 00:20:46,870 --> 00:20:51,040 เป็นต้นไปผมเรียกร้องว่าฉันประหยัด นักเรียนไปยังดิสก์เพื่อบัน​​ทึกแฟ้ม 445 00:20:51,040 --> 00:20:53,630 >> ดังนั้นผมสังเกตเห็นประกาศไฟล์ * - 446 00:20:53,630 --> 00:20:57,260 ตอนนี้เป็นชนิดของความผิดปกติใน C. สำหรับเหตุผลใด, ไฟล์ตัวพิมพ์ใหญ่ทั้งหมด 447 00:20:57,260 --> 00:21:00,690 ซึ่งไม่ชอบมากที่สุดชนิดข้อมูลอื่น ๆ ใน C. แต่นี่เป็นแบบ built-in 448 00:21:00,690 --> 00:21:02,320 ชนิดข้อมูล FILE * 449 00:21:02,320 --> 00:21:05,900 และฉันประกาศตัวชี้ไปยังแฟ้ม คือวิธีที่คุณสามารถคิดว่า 450 00:21:05,900 --> 00:21:08,070 >> fopen หมายถึงการเปิดไฟล์ 451 00:21:08,070 --> 00:21:09,470 อะไรที่คุณต้องการไฟล์ที่เปิด? 452 00:21:09,470 --> 00:21:12,620 ฉันต้องการเปิดแฟ้มที่ฉันจะ พลโทร students.csv 453 00:21:12,620 --> 00:21:14,480 ฉันจะเรียกอะไรที่ฉันต้องการที่ 454 00:21:14,480 --> 00:21:15,200 >> แล้วจะคาดเดา 455 00:21:15,200 --> 00:21:18,960 อาร์กิวเมนต์ที่สองคืออะไร เพื่อ fopen อาจจะหมายความว่าอย่างไร 456 00:21:18,960 --> 00:21:21,480 ขวา w สำหรับการเขียนได้ เป็น r สำหรับการอ่าน 457 00:21:21,480 --> 00:21:24,120 มีสำหรับการผนวกถ้าคุณ ต้องการเพิ่มแถวและไม่ได้ 458 00:21:24,120 --> 00:21:25,200 เขียนทับสิ่งที่ทั้ง 459 00:21:25,200 --> 00:21:28,005 >> แต่ผมเพียงต้องการที่จะสร้างไฟล์นี้ ครั้งเดียวดังนั้นฉันจะใช้อ้างไม่ได้นำมาอ้าง w 460 00:21:28,005 --> 00:21:31,880 และฉันรู้ว่าเพียง แต่จากที่ได้อ่าน เอกสารหรือหน้าคน 461 00:21:31,880 --> 00:21:35,100 ถ้าแฟ้มไม่เป็นโมฆะ - ในคำอื่น ๆ , ถ้าไม่มีอะไรผิดพลาดไปมี - 462 00:21:35,100 --> 00:21:37,820 ให้ฉันย้ำกว่า นักเรียน 0-3 463 00:21:37,820 --> 00:21:40,410 >> และตอนนี้สังเกตเห็นมีอะไรบางอย่าง เคยดังนั้นเล็กน้อยที่แตกต่างกัน 464 00:21:40,410 --> 00:21:42,110 เกี่ยวกับสาย 41 ที่นี่ 465 00:21:42,110 --> 00:21:42,960 มันไม่ printf 466 00:21:42,960 --> 00:21:46,530 มัน fprintf สำหรับ printf ไฟล์ 467 00:21:46,530 --> 00:21:47,790 ดังนั้นมันจะเขียนไฟล์ 468 00:21:47,790 --> 00:21:48,860 ซึ่งไฟล์? 469 00:21:48,860 --> 00:21:53,630 หนึ่งที่มีตัวชี้ที่คุณระบุ เป็นอาร์กิวเมนต์แรก 470 00:21:53,630 --> 00:21:55,940 >> จากนั้นเราก็ระบุสตริงรูปแบบ 471 00:21:55,940 --> 00:21:59,660 แล้วเราระบุสิ่งที่สตริงที่เราต้องการ เสียบสำหรับ s เปอร์เซ็นต์แรกและ 472 00:21:59,660 --> 00:22:04,320 แล้วตัวแปรหรืออื่น ร้อยละสองของ 473 00:22:04,320 --> 00:22:06,760 จากนั้นเราก็ปิดไฟล์ที่มี fclose 474 00:22:06,760 --> 00:22:09,380 กว่าที่ฉันฟรีหน่วยความจำเช่นเดิมแม้ว่า ฉันควรจะกลับไปและเพิ่ม 475 00:22:09,380 --> 00:22:10,540 การตรวจสอบบางอย่างสำหรับโมฆะ 476 00:22:10,540 --> 00:22:12,090 >> และที่มัน 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose ให้ฉัน ความสามารถในการสร้างไฟล์ข้อความ 478 00:22:16,960 --> 00:22:19,640 ตอนนี้คุณจะเห็นปัญหาอยู่ในชุดห้า ซึ่งเกี่ยวข้องกับภาพที่คุณจะใช้ 479 00:22:19,640 --> 00:22:20,990 แฟ้มไบนารีแทน 480 00:22:20,990 --> 00:22:24,200 แต่โดยพื้นฐานความคิดที่เหมือนกัน แม้ฟังก์ชั่นที่คุณจะ 481 00:22:24,200 --> 00:22:28,710 เห็นคือแตกต่างกันเล็กน้อย 482 00:22:28,710 --> 00:22:32,580 >> ทัวร์ลมกรดดังนั้น แต่คุณจะได้รับ ทั้งหมดเกินไปคุ้นเคยกับไฟล์ I/O-- 483 00:22:32,580 --> 00:22:34,960 อินพุทและเอาท์พุท - มี pset ห้า 484 00:22:34,960 --> 00:22:38,607 และคำถามใด ๆ เกี่ยวกับ พื้นฐานเริ่มต้นที่นี่? 485 00:22:38,607 --> 00:22:39,857 อ้าง? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> เกิดอะไรขึ้นถ้าคุณพยายามที่จะฟรีค่า null? 488 00:22:43,710 --> 00:22:48,880 ผมเชื่อว่าถ้าฟรีมีอากาศ น้อยมากที่ใช้งานง่ายคุณสามารถ 489 00:22:48,880 --> 00:22:49,890 ที่อาจเกิดขึ้น segfault 490 00:22:49,890 --> 00:22:54,160 ผ่านมันโมฆะจะไม่ดีเพราะผมทำไม่ได้ เชื่อว่าฟรีรบกวนจิตใจในการตรวจสอบสำหรับคุณ 491 00:22:54,160 --> 00:22:57,330 เพราะมันอาจจะเสีย เวลาที่จะทำตัวเองสำหรับ 492 00:22:57,330 --> 00:22:59,022 ทุกคนในโลก 493 00:22:59,022 --> 00:23:00,590 คำถามที่ดีแม้ว่า 494 00:23:00,590 --> 00:23:04,300 >> ทั้งหมดขวาดังนั้นชนิดนี้ได้รับ เราหัวข้อที่น่าสนใจ 495 00:23:04,300 --> 00:23:07,010 รูปแบบของชุดปัญหา ห้าคือนิติ 496 00:23:07,010 --> 00:23:08,420 อย่างน้อยที่เป็นส่วนหนึ่ง ชุดของปัญหา 497 00:23:08,420 --> 00:23:12,030 สถาบันนิติเวชโดยทั่วไปหมายถึง การกู้คืนของข้อมูลที่อาจจะหรือ 498 00:23:12,030 --> 00:23:14,110 อาจจะไม่ได้ถูกลบไปแล้ว จงใจ 499 00:23:14,110 --> 00:23:18,680 และดังนั้นฉันคิดว่าฉันต้องการให้คุณได้อย่างรวดเร็ว รสชาติของสิ่งที่เป็นจริงที่เกิดขึ้นทั้งหมด 500 00:23:18,680 --> 00:23:21,230 ภายใต้เวลานี้ เครื่องดูดควันของเครื่องคอมพิวเตอร์ของคุณ 501 00:23:21,230 --> 00:23:23,960 >> ตัวอย่างเช่นถ้าคุณมีอยู่ภายในของคุณ แล็ปท็อปหรือคอมพิวเตอร์ตั้งโต๊ะของคุณ 502 00:23:23,960 --> 00:23:28,040 ฮาร์ดไดรฟ์ก็ทั้งกล อุปกรณ์ที่หมุนจริง - 503 00:23:28,040 --> 00:23:31,650 มีสิ่งที่เรียกว่า platters วงกลมของ ที่มีลักษณะค่อนข้างชอบสิ่งที่ฉัน 504 00:23:31,650 --> 00:23:34,540 เพิ่งมีขึ้นบนหน้าจอที่นี่ แต่ นี้เป็นโรงเรียนเก่ามากขึ้น 505 00:23:34,540 --> 00:23:37,370 นี่คือสามและ-a-ครึ่งนิ้ว ฮาร์ดไดรฟ์ 506 00:23:37,370 --> 00:23:40,070 และสามและครึ่งนิ้วหมายของ กับสิ่งที่เมื่อคุณติดตั้ง 507 00:23:40,070 --> 00:23:40,890 ในคอมพิวเตอร์ 508 00:23:40,890 --> 00:23:44,890 >> หลายของพวกคุณในแล็ปท็อปของคุณตอนนี้ มีไดรฟ์ของรัฐที่มั่นคงหรือ SSDs, 509 00:23:44,890 --> 00:23:46,260 ที่มีชิ้นส่วนที่เคลื่อนไหว 510 00:23:46,260 --> 00:23:49,170 พวกเขากำลังมากขึ้นเช่น RAM และน้อยเช่น เหล่านี้อุปกรณ์เชิงกล 511 00:23:49,170 --> 00:23:51,450 แต่ความคิดยังคงเหมือนเดิม อย่างแน่นอนขณะที่พวกเขาเกี่ยวข้อง 512 00:23:51,450 --> 00:23:52,790 ชุดปัญหาห้า 513 00:23:52,790 --> 00:23:57,400 >> และถ้าคุณคิดเกี่ยวกับในขณะนี้ฮาร์ดไดรฟ์ แสดงให้เห็นถึงการเป็นวงกลมซึ่ง 514 00:23:57,400 --> 00:23:58,930 ผมจะวาดเช่นนี้ที่นี่ 515 00:23:58,930 --> 00:24:02,290 เมื่อคุณสร้างไฟล์บนเครื่องคอมพิวเตอร์ของคุณ, ไม่ว่าจะเป็น SSD หรือใน 516 00:24:02,290 --> 00:24:06,610 กรณีนี้ไดรฟ์ที่โรงเรียนเก่าอย่างหนัก ว่าไฟล์ประกอบด้วยบิตหลาย 517 00:24:06,610 --> 00:24:10,510 ขอบอกว่ามันนี้ 0 และ 1 มัดทั้ง 0 และ 1 518 00:24:10,510 --> 00:24:11,660 ดังนั้นนี้เป็นฮาร์ดไดรฟ์ของฉันทั้ง 519 00:24:11,660 --> 00:24:13,225 นี้จะเห็นได้ชัดว่าไฟล์ขนาดใหญ่สวย 520 00:24:13,225 --> 00:24:18,080 และจะใช้ขึ้น 0 และ 1 ที่ว่า ส่วนของแผ่นเสียงทางกายภาพ 521 00:24:18,080 --> 00:24:19,750 >> ดีสิ่งที่เป็นส่วนทางกายภาพ 522 00:24:19,750 --> 00:24:25,310 ดีก็ปรากฎว่าฮาร์ดไดรฟ์, อย่างน้อยชนิดนี้มี 523 00:24:25,310 --> 00:24:27,340 เหล่านี้มีขนาดเล็กอนุภาคแม่เหล็กเล็ก ๆ น้อย ๆ 524 00:24:27,340 --> 00:24:32,630 และพวกเขามีหลักทางเหนือและ ขั้วใต้กับพวกเขาเพื่อที่ว่าถ้าคุณ 525 00:24:32,630 --> 00:24:35,710 เปิดหนึ่งของอนุภาคแม่เหล็กเหล่านั้น วิธีนี้คุณอาจจะบอกว่ามันเป็น 526 00:24:35,710 --> 00:24:36,720 คิดเป็นสัดส่วน 1 527 00:24:36,720 --> 00:24:39,340 และถ้ามันคว่ำลงไปทางทิศใต้ เหนือ, คุณอาจจะบอกว่ามันเป็น 528 00:24:39,340 --> 00:24:40,390 แทน 0 529 00:24:40,390 --> 00:24:43,660 >> ดังนั้นในโลกทางกายภาพจริงที่ว่า วิธีการที่คุณสามารถเป็นตัวแทนของสิ่งที่อยู่ใน 530 00:24:43,660 --> 00:24:45,670 รัฐของไบนารี 0 และ 1 531 00:24:45,670 --> 00:24:46,720 เพื่อให้ทุกไฟล์เป็นอะไร 532 00:24:46,720 --> 00:24:49,300 มีทั้งกลุ่มของแม่เหล็ก อนุภาคที่เป็นวิธีการของพวกเขาหรือนี้ 533 00:24:49,300 --> 00:24:51,920 ด้วยวิธีนี้รูปแบบการสร้าง จาก 0 และ 1 534 00:24:51,920 --> 00:24:56,760 >> แต่ปรากฎออกมาเมื่อคุณบันทึกแฟ้ม, ข้อมูลบางอย่างจะถูกบันทึกไว้แยกต่างหาก 535 00:24:56,760 --> 00:25:00,000 ดังนั้นนี้เป็นตารางเล็ก ๆ น้อย ๆ ไดเรกทอรีเพื่อที่จะพูด 536 00:25:00,000 --> 00:25:05,810 และฉันจะเรียกชื่อของคอลัมน์นี้และ ฉันจะเรียกสถานที่คอลัมน์นี้ 537 00:25:05,810 --> 00:25:08,850 >> และฉันจะบอกว่าสมมติว่า นี่คือประวัติของฉัน 538 00:25:08,850 --> 00:25:14,050 resume.doc ของฉันจะถูกเก็บไว้ที่ สถานที่สมมติว่า 123 539 00:25:14,050 --> 00:25:15,390 ฉันมักจะไปสำหรับหมายเลขที่ 540 00:25:15,390 --> 00:25:18,810 แต่พอเพียงที่จะบอกว่าเหมือน ในแรมคุณสามารถใช้ฮาร์ดไดรฟ์ 541 00:25:18,810 --> 00:25:22,350 ที่เป็นกิกะไบต์หรือ 200 กิกะไบต์ หรือเทราไบต์และคุณสามารถ 542 00:25:22,350 --> 00:25:23,750 จำนวนทั้งหมดของไบต์ 543 00:25:23,750 --> 00:25:26,480 คุณสามารถนับชิ้นทั้งหมด 8 บิต 544 00:25:26,480 --> 00:25:29,030 >> ดังนั้นเราจะบอกว่านี้ เป็นสถานที่ตั้ง 123 545 00:25:29,030 --> 00:25:32,070 ดังนั้นในไดเรกทอรีนี้การดำเนินงานของฉัน จำได้ว่าระบบของฉัน 546 00:25:32,070 --> 00:25:34,250 ประวัติอยู่ที่ 123 สถานที่ตั้ง 547 00:25:34,250 --> 00:25:36,850 แต่ได้รับน่าสนใจเมื่อ คุณลบไฟล์ 548 00:25:36,850 --> 00:25:37,820 >> ดังนั้นเช่น - 549 00:25:37,820 --> 00:25:40,790 และโชคดีที่ส่วนใหญ่ของโลกมี ติดลงบนนี้ - สิ่งที่เกิดขึ้นเมื่อ 550 00:25:40,790 --> 00:25:45,040 คุณลากไฟล์ไปยังถังขยะ Mac OS ของคุณ หรือ Windows ถังรีไซเคิลของคุณ? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 วัตถุประสงค์ของการทำแบบนั้นคืออะไร? 553 00:25:50,510 --> 00:25:53,860 มันเห็นได้ชัดที่จะกำจัดของไฟล์, แต่การกระทำของการลากสิ่งที่ไม่และ 554 00:25:53,860 --> 00:25:57,550 ทิ้งลงในถังขยะของคุณหรือของคุณ ถังรีไซเคิลทำในคอมพิวเตอร์? 555 00:25:57,550 --> 00:25:59,230 >> แน่นอนไม่มีอะไรจริงๆ 556 00:25:59,230 --> 00:26:00,320 มันเป็นเช่นเดียวกับโฟลเดอร์ 557 00:26:00,320 --> 00:26:01,800 มันเป็นโฟลเดอร์พิเศษเพื่อให้แน่ใจว่า 558 00:26:01,800 --> 00:26:04,460 มันไม่ แต่จริงๆแล้วลบไฟล์หรือไม่ 559 00:26:04,460 --> 00:26:06,780 >> ดีไม่เพราะบางท่านอาจจะ ได้รับเช่นเดียวกับโอ้แช่งคุณไม่ได้ 560 00:26:06,780 --> 00:26:07,420 หมายถึงจะทำอย่างนั้น 561 00:26:07,420 --> 00:26:09,130 ดังนั้นคุณดับเบิลคลิก ถังขยะหรือถังรีไซเคิล 562 00:26:09,130 --> 00:26:11,630 คุณเคยโผล่ไปรอบ ๆ และคุณกู้คืน ไฟล์เพียงโดยการลากมัน 563 00:26:11,630 --> 00:26:12,110 ออกจากที่นั่น 564 00:26:12,110 --> 00:26:14,420 ดังนั้นเห็นได้ชัดว่ามันไม่จำเป็น ลบมัน 565 00:26:14,420 --> 00:26:15,990 >> ตกลงคุณจะฉลาดกว่าที่ 566 00:26:15,990 --> 00:26:18,860 คุณรู้ไหมว่าเพียงแค่ลากมันเข้าไป ถังขยะหรือรีไซเคิลไม่ได้หมายความว่า 567 00:26:18,860 --> 00:26:19,930 คุณกำลังทิ้งขยะ 568 00:26:19,930 --> 00:26:24,110 เพื่อให้คุณไปถึงเมนูและคุณจะพูดว่า ขยะที่ว่างเปล่าถังรีไซเคิลหรือเปล่า 569 00:26:24,110 --> 00:26:25,360 แล้วจะเกิดอะไรขึ้น 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> ผมจึงจะถูกลบมากขึ้นดังนั้น 572 00:26:32,530 --> 00:26:37,660 แต่ทั้งหมดที่เกิดขึ้นนี้ 573 00:26:37,660 --> 00:26:45,350 คอมพิวเตอร์ที่ลืม resume.doc คือ 574 00:26:45,350 --> 00:26:47,400 >> แต่สิ่งที่ไม่ได้เปลี่ยนแปลงเห็นได้ชัดว่า ในภาพหรือไม่ 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 บิต, 0 และ 1 เรียกร้องที่ฉันเป็น บนเว็บไซต์ของลักษณะทางกายภาพบางส่วนของ 577 00:26:55,570 --> 00:26:56,280 ฮาร์ดแวร์ 578 00:26:56,280 --> 00:26:57,110 พวกเขายังคงมี 579 00:26:57,110 --> 00:26:58,930 มันเป็นเพียงคอมพิวเตอร์มี ลืมสิ่งที่พวกเขา 580 00:26:58,930 --> 00:27:03,160 >> จึงปล่อยให้เป็นอิสระเป็นหลักของไฟล์ บิตเพื่อให้พวกเขาสามารถนำมาใช้ใหม่ 581 00:27:03,160 --> 00:27:06,940 แต่ไม่ได้จนกว่าคุณจะสร้างไฟล์ขึ้น และไฟล์หลายไฟล์และอื่น ๆ จะ 582 00:27:06,940 --> 00:27:12,150 probabilistically ผู้ที่ 0 และ 1, ที่อนุภาคแม่เหล็กได้รับนำมาใช้ใหม่ 583 00:27:12,150 --> 00:27:16,220 ด้านคว่ำหรือขวาขึ้นสำหรับ ไฟล์อื่น ๆ 0 และ 1 584 00:27:16,220 --> 00:27:17,980 >> เพื่อให้คุณมีหน้าต่างในเวลานี้ 585 00:27:17,980 --> 00:27:19,860 และก็ไม่สามารถคาดเดาได้จาก ยาวจริงๆ 586 00:27:19,860 --> 00:27:22,240 มันขึ้นอยู่กับขนาดของฮาร์ดดิสก์ของคุณ ไดรฟ์และจำนวนไฟล์ที่คุณมีและ 587 00:27:22,240 --> 00:27:23,490 วิธีการอย่างรวดเร็วคุณทำใหม่ 588 00:27:23,490 --> 00:27:27,050 แต่มีหน้าต่างในเวลานี้ในช่วง ซึ่งไฟล์ที่ยังคงสมบูรณ์ 589 00:27:27,050 --> 00:27:27,770 รับคืน 590 00:27:27,770 --> 00:27:31,050 >> ดังนั้นถ้าคุณเคยใช้โปรแกรมเช่นแมคอาฟี หรือนอร์ตันเพื่อพยายามกู้คืน 591 00:27:31,050 --> 00:27:35,680 ข้อมูลทั้งหมดที่พวกเขากำลังทำคือการพยายามที่จะ กู้คืนไดเรกทอรีนี้ที่เรียกว่า 592 00:27:35,680 --> 00:27:37,340 คิดออกว่าไฟล์ของคุณเป็น 593 00:27:37,340 --> 00:27:40,605 และบางครั้งนอร์ตันและจะกล่าวว่า ไฟล์เป็น 93% คืน 594 00:27:40,605 --> 00:27:42,020 ดีที่หมายความว่าอย่างไร 595 00:27:42,020 --> 00:27:45,690 ที่เพียงแค่หมายความว่าบางไฟล์อื่น ๆ สิ้นสุดวันที่บังเอิญขึ้นโดยใช้การพูด, 596 00:27:45,690 --> 00:27:48,920 บิตเหล่านั้นออกจากไฟล์ต้นฉบับของคุณ 597 00:27:48,920 --> 00:27:51,950 >> ดังนั้นสิ่งที่มีส่วนเกี่ยวข้องจริง ในการกู้คืนข้อมูล? 598 00:27:51,950 --> 00:27:55,720 ดีถ้าคุณไม่ได้สิ่งที่ต้องการ นอร์ตันที่ติดตั้งในคอมพิวเตอร์ของคุณ 599 00:27:55,720 --> 00:27:59,510 ที่ดีที่สุดบางครั้งคุณสามารถทำได้คือการมอง ที่ฮาร์ดไดรฟ์ทั้งหมดที่กำลังมองหา 600 00:27:59,510 --> 00:28:00,510 รูปแบบของบิต 601 00:28:00,510 --> 00:28:05,350 และเป็นหนึ่งในรูปแบบของชุดปัญหา ห้าคือการที่คุณจะค้นหา 602 00:28:05,350 --> 00:28:09,570 เทียบเท่ากับฮาร์ดไดรฟ์, นิติวิทยาศาสตร์ ภาพของการ์ดแฟลชขนาดกะทัดรัดจาก 603 00:28:09,570 --> 00:28:13,660 กล้องดิจิตอลค้นหา 0s 1s และที่มักจะมีสูง 604 00:28:13,660 --> 00:28:16,720 ความน่าจะเป็นตัวแทนของ เริ่มต้นจากภาพ JPEG 605 00:28:16,720 --> 00:28:21,120 >> และพวกคุณสามารถกู้คืนภาพเหล่านั้นโดย สมมติว่าถ้าผมเห็นรูปแบบนี้ 606 00:28:21,120 --> 00:28:24,380 บิตบนภาพทางนิติวิทยาศาสตร์ด้วย ความน่าจะเป็นสูงที่เครื่องหมาย 607 00:28:24,380 --> 00:28:25,650 จุดเริ่มต้นของไฟล์ JPEG 608 00:28:25,650 --> 00:28:29,520 และถ้าฉันเห็นรูปแบบเดียวกันอีกครั้ง ที่อาจเป็นจุดเริ่มต้นของ 609 00:28:29,520 --> 00:28:32,440 อีก JPEG, และอื่น ๆ JPEG และไฟล์ภาพ JPEG อีก 610 00:28:32,440 --> 00:28:34,970 และนี่คือวิธีการที่มักจะ การกู้คืนข้อมูลจะทำงาน 611 00:28:34,970 --> 00:28:37,870 มีอะไรที่ดีเกี่ยวกับ JPEGs คือแม้ว่า รูปแบบไฟล์ที่ตัวเองจะค่อนข้าง 612 00:28:37,870 --> 00:28:44,400 ที่ซับซ้อนเช่นจุดเริ่มต้นของทุก ไฟล์เป็นจริงพิสูจน์ได้อย่างเป็นธรรม 613 00:28:44,400 --> 00:28:47,370 และเรียบง่ายที่สุดเท่าที่คุณจะเห็น หากคุณไม่ได้อยู่แล้ว 614 00:28:47,370 --> 00:28:50,270 >> ดังนั้นขอใช้เวลามองใกล้ที่อยู่ภายใต้ เครื่องดูดควันเป็นไปได้ว่าสิ่งที่ได้รับ 615 00:28:50,270 --> 00:28:53,360 ที่เกิดขึ้นและสิ่งเหล่านี้ 0 และ 1 เป็นเพื่อให้คุณอีกเล็กน้อยจาก 616 00:28:53,360 --> 00:28:55,330 บริบทสำหรับความท้าทายนี้โดยเฉพาะ 617 00:28:55,330 --> 00:28:55,510 >> [เล่นภาพวิดีโอ] 618 00:28:55,510 --> 00:28:58,700 >> ที่ไหนจัดเก็บเครื่องคอมพิวเตอร์ของคุณมากที่สุด ของข้อมูลอย่างถาวร 619 00:28:58,700 --> 00:29:03,390 ต้องการทำเช่นนั้นข้อมูลการเดินทางจาก RAM พร้อมกับสัญญาณซอฟแวร์ที่บอก 620 00:29:03,390 --> 00:29:06,110 ฮาร์ดไดรฟ์วิธีการเก็บข้อมูลที่ 621 00:29:06,110 --> 00:29:09,410 วงจรฮาร์ดไดรฟ์แปล สัญญาณเหล่านั้นเป็นแรงดันไฟฟ้า 622 00:29:09,410 --> 00:29:10,870 ความผันผวนของ 623 00:29:10,870 --> 00:29:14,970 นี้ในการเปิดการควบคุมของไดรฟ์ยาก ชิ้นส่วนที่เคลื่อนไหวบางอย่างในไม่กี่คน 624 00:29:14,970 --> 00:29:17,910 การย้ายชิ้นส่วนที่เหลืออยู่ใน คอมพิวเตอร์ที่ทันสมัย 625 00:29:17,910 --> 00:29:22,130 >> บางส่วนของสัญญาณควบคุมมอเตอร์ ซึ่งหมุนจานโลหะเคลือบ 626 00:29:22,130 --> 00:29:25,470 ข้อมูลของคุณจะถูกจัดเก็บจริง ใน platters เหล่านี้ 627 00:29:25,470 --> 00:29:28,610 สัญญาณอื่น ๆ ย้ายการอ่าน / เขียน หัวอ่านหรือ 628 00:29:28,610 --> 00:29:30,710 เขียนข้อมูลใน platters 629 00:29:30,710 --> 00:29:35,450 เครื่องจักรนี้ได้อย่างแม่นยำเพื่อให้มนุษย์ ผมไม่สามารถที่จะผ่านระหว่าง 630 00:29:35,450 --> 00:29:37,280 หัวและ platters ปั่น 631 00:29:37,280 --> 00:29:40,316 แต่การทำงานทั้งหมดด้วยความเร็วที่ยอดเยี่ยม 632 00:29:40,316 --> 00:29:40,660 >> [เล่นวิดีโอจบ] 633 00:29:40,660 --> 00:29:42,190 >> DAVID ลัน: ซูมในเล็ก ๆ น้อย ๆ ลึกลงไปในขณะที่สิ่งที่ 634 00:29:42,190 --> 00:29:44,360 จริงใน platters เหล่านั้น 635 00:29:44,360 --> 00:29:44,720 >> [เล่นภาพวิดีโอ] 636 00:29:44,720 --> 00:29:47,660 >> -ลองดูที่สิ่งที่เราเพียงแค่ เห็นในการเคลื่อนไหวช้า 637 00:29:47,660 --> 00:29:51,710 เมื่อชีพจรสั้นของกระแสไฟฟ้าคือ ส่งไปยังหัวอ่าน / เขียนถ้าพลิก 638 00:29:51,710 --> 00:29:54,650 เมื่อแม่เหล็กไฟฟ้าเล็ก ๆ สำหรับ เสี้ยววินาที 639 00:29:54,650 --> 00:29:58,970 แม่เหล็กสร้างสนามซึ่ง การเปลี่ยนแปลงขั้วของเล็ก ๆ เล็ก ๆ 640 00:29:58,970 --> 00:30:02,850 ส่วนหนึ่งของอนุภาคโลหะซึ่ง เสื้อโค้ทพื้นผิวแต่ละจาน 641 00:30:02,850 --> 00:30:05,940 >> ชุดรูปแบบเล็ก ๆ น้อย ๆ เหล่านี้ พื้นที่เรียกเก็บอยู่บนดิสก์ 642 00:30:05,940 --> 00:30:08,470 แสดงให้เห็นถึงบิตเดียวของ ข้อมูลในเลขฐานสอง 643 00:30:08,470 --> 00:30:10,530 ระบบที่ใช้โดยคอมพิวเตอร์ 644 00:30:10,530 --> 00:30:13,775 ตอนนี้ถ้าในปัจจุบันจะถูกส่งไปทางเดียว ผ่านการอ่าน / เขียนหัวพื้นที่ 645 00:30:13,775 --> 00:30:15,970 เป็นขั้วในทิศทางเดียว 646 00:30:15,970 --> 00:30:17,950 ถ้าในปัจจุบันที่ถูกส่งใน ทิศทางที่ตรงข้าม, 647 00:30:17,950 --> 00:30:19,930 ขั้วที่ตรงกันข้ามคือ 648 00:30:19,930 --> 00:30:22,370 >> วิธีที่คุณจะได้รับข้อมูลออกจากฮาร์ดดิสก์ 649 00:30:22,370 --> 00:30:24,090 เพียงแค่ย้อนกลับกระบวนการ 650 00:30:24,090 --> 00:30:26,550 ดังนั้นจึงเป็นอนุภาคที่อยู่บนดิสก์ ที่ได้รับในปัจจุบัน 651 00:30:26,550 --> 00:30:27,960 อ่าน / เขียนหัวย้าย 652 00:30:27,960 --> 00:30:30,700 ใส่กันนับล้านเหล่านี้ ส่วนแม่เหล็กและ 653 00:30:30,700 --> 00:30:32,160 คุณมีไฟล์ 654 00:30:32,160 --> 00:30:36,060 >> ตอนนี้ชิ้นส่วนของไฟล์เดียวอาจ จะกระจัดกระจายไปทั่วทุกมุมของไดรฟ์ 655 00:30:36,060 --> 00:30:39,970 platters ชนิดเช่นระเบียบ ของเอกสารบนโต๊ะทำงานของคุณ 656 00:30:39,970 --> 00:30:43,500 ดังนั้นไฟล์สุดพิเศษติดตาม จากที่ทุกอย่าง 657 00:30:43,500 --> 00:30:45,985 คุณไม่ขอให้คุณมี สิ่งที่ต้องการที่? 658 00:30:45,985 --> 00:30:46,470 >> [เล่นวิดีโอจบ] 659 00:30:46,470 --> 00:30:47,820 >> DAVID ลัน: ตกลงอาจจะไม่ 660 00:30:47,820 --> 00:30:52,070 ดังนั้นวิธีที่หลาย ๆ ท่านครับ เติบโตขึ้นมากับเหล่านี้ได้อย่างไร 661 00:30:52,070 --> 00:30:53,970 ตกลงดังนั้นจึงน้อยลงและน้อยลง มือของทุกปี 662 00:30:53,970 --> 00:30:56,550 แต่ฉันดีใจที่คุณอย่างน้อยคุ้นเคย กับพวกเขาเพราะเรื่องนี้และของเราเอง 663 00:30:56,550 --> 00:31:00,520 การสาธิตหนังสือเศร้ากำลังจะตายมาก ตายช้าที่นี่จากความคุ้นเคย 664 00:31:00,520 --> 00:31:04,010 >> แต่นี่คือสิ่งที่ฉันอย่างน้อยย้อนกลับไปใน โรงเรียนมัธยมการใช้งานที่ใช้สำหรับการสำรองข้อมูล 665 00:31:04,010 --> 00:31:08,110 และมันก็เป็นที่น่าตื่นตาตื่นใจเพราะคุณ สามารถเก็บ 1.4 เมกะไบต์บน 666 00:31:08,110 --> 00:31:08,930 นี้ดิสก์โดยเฉพาะอย่างยิ่ง 667 00:31:08,930 --> 00:31:12,260 และนี่ก็เป็นรุ่นที่มีความหนาแน่นสูง ตามที่ระบุโดย HD ซึ่งมี 668 00:31:12,260 --> 00:31:14,240 ความหมายของวันนี้ก่อนที่จะวิดีโอ HD 669 00:31:14,240 --> 00:31:16,400 >> ความหนาแน่นมาตรฐานคือ 800 กิโลไบต์ 670 00:31:16,400 --> 00:31:18,640 และก่อนที่จะมี ดิสก์ 400 กิโลไบต์ 671 00:31:18,640 --> 00:31:23,120 และก่อนที่จะมี 5 และ 1/4 เป็น ดิสก์นิ้วซึ่งเป็นฟลอปปี้อย่างแท้จริง 672 00:31:23,120 --> 00:31:25,680 และเล็ก ๆ น้อย ๆ ที่กว้างขึ้นและสูง กว่าสิ่งเหล่านี้ที่นี่ 673 00:31:25,680 --> 00:31:29,150 แต่คุณสามารถมองเห็นสิ่งที่เรียกว่า ลักษณะของฟลอปปี้ดิสก์เหล่านี้ 674 00:31:29,150 --> 00:31:32,630 >> และหน้าที่ที่พวกเขากำลังจริง สวยคล้ายกับฮาร์ดไดรฟ์จากที่ 675 00:31:32,630 --> 00:31:33,570 ชนิดนี้อย่างน้อย 676 00:31:33,570 --> 00:31:37,270 อีกครั้ง SSDs ในคอมพิวเตอร์รุ่นใหม่ ทำงานน้อยแตกต่างกัน 677 00:31:37,270 --> 00:31:41,530 แต่ถ้าคุณย้ายแท็บโลหะที่เล็ก ๆ น้อย ๆ คุณสามารถเห็นจริงคุกกี้เล็ก ๆ น้อย ๆ 678 00:31:41,530 --> 00:31:42,560 หรือแผ่นเสียง 679 00:31:42,560 --> 00:31:43,830 >> มันไม่ใช่โลหะเช่นนี้ 680 00:31:43,830 --> 00:31:46,000 หนึ่งนี้เป็นจริงที่ถูกกว่าบาง วัสดุพลาสติก 681 00:31:46,000 --> 00:31:46,750 และคุณสามารถชนิดของมันกระดิก 682 00:31:46,750 --> 00:31:50,310 และคุณได้ trully เช็ดเพียงแค่ปิดบาง จำนวนบิตหรืออนุภาคแม่เหล็ก 683 00:31:50,310 --> 00:31:51,220 จากดิสก์นี้ 684 00:31:51,220 --> 00:31:52,710 >> ดังนั้นโชคดีมีอะไรที่เป็นของ 685 00:31:52,710 --> 00:31:55,790 ถ้าสิ่งที่อยู่ในทาง - และครอบคลุม ตาและบรรดาเพื่อนบ้านของคุณ - 686 00:31:55,790 --> 00:31:58,865 คุณสามารถเพียงแค่ชนิดของดึงนี้ ออกฝักทั้งที่ชอบ 687 00:31:58,865 --> 00:32:01,900 แต่มีฤดูใบไม้ผลิเล็ก ๆ น้อย ๆ เพื่อให้ รู้ว่ามีสายตาของคุณ 688 00:32:01,900 --> 00:32:03,620 ดังนั้นตอนนี้คุณมีอย่างแท้จริงฟล็อปปี้ดิสก์ 689 00:32:03,620 --> 00:32:07,090 >> และโดดเด่นเกี่ยวกับเรื่องนี้ว่า ที่อยู่ในมากที่สุดเท่าที่เป็น 690 00:32:07,090 --> 00:32:10,830 การแสดงขนาดเล็กขนาดใหญ่ ฮาร์ดไดรฟ์สิ่งเหล่านี้ซุปเปอร์ 691 00:32:10,830 --> 00:32:11,590 ง่ายสุด 692 00:32:11,590 --> 00:32:15,170 หากคุณหยิกด้านล่างของมันตอนนี้ที่ สิ่งที่ทำด้วยโลหะที่ปิดและเปลือก 693 00:32:15,170 --> 00:32:20,990 พวกเขาเปิดทั้งหมดที่มีเป็นสองชิ้น รู้สึกและฟล็อปปี้ดิสก์ที่เรียกว่า 694 00:32:20,990 --> 00:32:22,930 กับชิ้นส่วนของโลหะในภายใน 695 00:32:22,930 --> 00:32:25,990 >> และมีครึ่งหนึ่งของไป เนื้อหาดิสก์ของฉัน 696 00:32:25,990 --> 00:32:27,540 มีครึ่งหนึ่งของพวกเขาอีกต่อไป 697 00:32:27,540 --> 00:32:31,375 แต่นั่นคือทั้งหมดที่ได้รับการปั่นภายใน ของเครื่องคอมพิวเตอร์ของคุณในปีกลาย 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> และอีกครั้งเพื่อวางนี้ในมุมมองของ วิธีการใหญ่เป็นส่วนใหญ่ของคุณ 700 00:32:38,310 --> 00:32:39,560 ฮาร์ดดิสก์วันนี้? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 กิกะไบต์, เทราไบต์, อาจจะใน คอมพิวเตอร์เดสก์ทอป 2 เทราไบต์, 3 703 00:32:46,230 --> 00:32:47,630 เทราไบต์, 4 เทราไบต์ขวา? 704 00:32:47,630 --> 00:32:52,480 นี้เป็นหนึ่งเมกะไบต์ให้หรือใช้, ซึ่งไม่สามารถแม้แต่จะพอดีกับ MP3 ทั่วไป 705 00:32:52,480 --> 00:32:55,310 อีกต่อไปวันนี้หรือบาง ไฟล์เพลงที่คล้ายกัน 706 00:32:55,310 --> 00:32:59,500 >> ดังนั้นของที่ระลึกเล็ก ๆ น้อย ๆ สำหรับคุณในวันนี้และ นอกจากนี้ยังจะช่วยให้สิ่ง contextualize 707 00:32:59,500 --> 00:33:03,570 เราจะได้รับการ ในขณะนี้ปัญหาตั้งห้า 708 00:33:03,570 --> 00:33:04,820 ดังนั้นผู้ที่มีของคุณเพื่อให้ 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 เพื่อให้การเปลี่ยนแปลงไปยังที่ที่ฉันจะ การใช้จ่าย pset ต่อไปเช่นกัน 711 00:33:13,370 --> 00:33:18,470 ดังนั้นเราจึงได้ตั้งค่าในขณะนี้หน้านี้เพื่อ - โอ้ คู่ของประกาศได้อย่างรวดเร็ว 712 00:33:18,470 --> 00:33:21,730 >> ศุกร์นี้ถ้าคุณต้องการเข้าร่วม CS50 เพื่อรับประทานอาหารกลางวันให้ไปที่สถานที่ที่ปกติ 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp 714 00:33:23,610 --> 00:33:25,100 และโครงการสุดท้าย - 715 00:33:25,100 --> 00:33:28,520 ดังนั้นต่อหลักสูตรที่เราได้โพสต์ สเปคโครงการสุดท้ายแล้ว 716 00:33:28,520 --> 00:33:31,410 ตระหนักดีว่าไม่ได้หมายความว่า เนื่องจากมันโดยเฉพาะอย่างยิ่งในเร็ว ๆ นี้ 717 00:33:31,410 --> 00:33:33,990 มันโพสต์จริงๆเพียงเพื่อให้ได้ พวกคุณคิดเกี่ยวกับมัน 718 00:33:33,990 --> 00:33:37,620 และแน่นอนสุดอย่างมีนัยสำคัญ ร้อยละของคุณจะได้รับการแก้ปัญหา 719 00:33:37,620 --> 00:33:40,780 โครงการสุดท้ายบนวัสดุที่เรา ยังไม่ได้รับแม้จะอยู่ในชั้นเรียน, 720 00:33:40,780 --> 00:33:42,730 แต่จะเป็นช่วงต้นของสัปดาห์ถัดไป 721 00:33:42,730 --> 00:33:45,530 >> แจ้งให้ทราบว่าที่สเปคเรียกร้องให้ ส่วนประกอบที่แตกต่างกันไม่กี่ 722 00:33:45,530 --> 00:33:46,190 โครงการสุดท้าย 723 00:33:46,190 --> 00:33:49,590 เป็นครั้งแรกในอีกไม่กี่สัปดาห์เป็น ก่อน-proposal, อีเมล์ลำลองสวย 724 00:33:49,590 --> 00:33:52,760 TF ที่จะบอกเขาหรือของคุณสิ่งที่คุณ คิดเกี่ยวกับการสำหรับโครงการของคุณด้วย 725 00:33:52,760 --> 00:33:53,650 ความมุ่งมั่นไม่มี 726 00:33:53,650 --> 00:33:56,710 ข้อเสนอที่จะเป็นของคุณโดยเฉพาะ ความมุ่งมั่นว่านี่เป็นสิ่งที่ 727 00:33:56,710 --> 00:33:57,770 ฉันต้องการที่จะทำสำหรับโครงการของฉัน 728 00:33:57,770 --> 00:33:58,250 คุณคิดอย่างไร? 729 00:33:58,250 --> 00:33:58,650 มีขนาดใหญ่เกินไป? 730 00:33:58,650 --> 00:33:59,145 ขนาดเล็กเกินไป? 731 00:33:59,145 --> 00:34:00,330 มันเป็นเรื่องที่จัดการได้? 732 00:34:00,330 --> 00:34:02,230 และคุณจะเห็นข้อมูลจำเพาะสำหรับรายละเอียดเพิ่มเติม 733 00:34:02,230 --> 00:34:05,060 >> สองสามสัปดาห์หลังจากที่มีสถานะ รายงานซึ่งเป็นในทำนองเดียวกัน 734 00:34:05,060 --> 00:34:08,260 อีเมล์ลำลองเพื่อ TF ของคุณที่จะพูดเพียงแค่ว่า ไกลหลังที่คุณอยู่ในขั้นสุดท้ายของคุณ 735 00:34:08,260 --> 00:34:12,360 การดำเนินโครงการตามด้วย CS50 hackathon เพื่อที่ทุกคน 736 00:34:12,360 --> 00:34:17,520 เป็นรับเชิญซึ่งจะเป็นเหตุการณ์จาก 20:00 เมื่อเย็นวันหนึ่งจนถึง 07:00 737 00:34:17,520 --> 00:34:19,150 AM เช้าวันรุ่งขึ้น 738 00:34:19,150 --> 00:34:22,560 พิซซ่าที่ผมอาจจะมีการกล่าวถึงในสัปดาห์ ศูนย์ wil ที่ได้รับการบริการที่ 09:00, 739 00:34:22,560 --> 00:34:24,120 อาหารจีนที่ 01:00 740 00:34:24,120 --> 00:34:27,929 และถ้าคุณยังคงตื่นตัวที่ 05:00, เราจะพาคุณไป IHOP สำหรับอาหารเช้า 741 00:34:27,929 --> 00:34:31,310 >> ดังนั้น hackathon เป็นหนึ่งในมากขึ้น ประสบการณ์ที่น่าจดจำในชั้นเรียน 742 00:34:31,310 --> 00:34:35,290 จากนั้นการดำเนินการครบกำหนดและ แล้วยอด CS50 พอใช้ 743 00:34:35,290 --> 00:34:38,070 รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ ในสัปดาห์ที่จะมาถึง 744 00:34:38,070 --> 00:34:40,739 >> แต่ขอกลับไปที่บางสิ่งบางอย่าง โรงเรียนเก่า - 745 00:34:40,739 --> 00:34:41,920 อีกครั้งอาร์เรย์ 746 00:34:41,920 --> 00:34:45,040 ดังนั้นอาร์เรย์ was nice เพราะมันแก้ ปัญหาเช่นที่เราเห็นเพียงแค่ 747 00:34:45,040 --> 00:34:49,290 ช่วงเวลาที่ผ่านมาด้วยโครงสร้างของนักเรียน ได้รับการออกจากการควบคุมของเล็ก ๆ น้อย ๆ ถ้าเรา 748 00:34:49,290 --> 00:34:52,405 ต้องการที่จะมีนักศึกษาคนหนึ่ง, สองนักศึกษา สามนักเรียนนักศึกษา dot dot dot, 749 00:34:52,405 --> 00:34:54,400 บางจำนวนข้อของนักเรียน 750 00:34:54,400 --> 00:34:58,850 >> ดังนั้นอาร์เรย์ไม่กี่สัปดาห์ที่ผ่านมาบินโฉบใน และแก้ไขทุกปัญหาของเราไม่ได้ 751 00:34:58,850 --> 00:35:03,340 รู้ล่วงหน้าว่าหลายสิ่ง บางประเภทที่เราอาจต้องการ 752 00:35:03,340 --> 00:35:07,390 และเราได้เห็นว่า structs สามารถช่วยให้เรา จัดระเบียบรหัสของเราและเก็บ 753 00:35:07,390 --> 00:35:11,660 ตัวแปรที่คล้ายกันแนวคิดเช่น ชื่อและที่บ้านด้วยกันเพื่อให้เรา 754 00:35:11,660 --> 00:35:15,570 สามารถรักษาพวกเขาเป็นหนึ่งในกิจการภายใน ซึ่งมีชิ้นเล็ก ๆ เป็น 755 00:35:15,570 --> 00:35:17,810 >> แต่อาร์เรย์มีข้อเสียบางอย่าง 756 00:35:17,810 --> 00:35:19,780 สิ่งที่บางส่วนของข้อเสียคือ ที่เราได้พบ 757 00:35:19,780 --> 00:35:22,320 กับอาร์เรย์ป่านนี้? 758 00:35:22,320 --> 00:35:23,450 ว่าคืออะไร? 759 00:35:23,450 --> 00:35:28,130 ขนาดคงที่ - ดังนั้นแม้ว่าคุณอาจจะ จะสามารถจัดสรรหน่วยความจำสำหรับ 760 00:35:28,130 --> 00:35:32,310 อาร์เรย์เมื่อคุณรู้วิธีการที่นักเรียนจำนวนมาก คุณจะมีตัวอักษรหลายวิธีที่คุณมี 761 00:35:32,310 --> 00:35:35,460 จากผู้ใช้เมื่อคุณได้รับการจัดสรร อาร์เรย์ที่คุณได้ทาสีชนิดของ 762 00:35:35,460 --> 00:35:36,740 ตัวเองเป็นมุม 763 00:35:36,740 --> 00:35:40,600 >> เนื่องจากคุณไม่สามารถแทรกองค์ประกอบใหม่ เข้ากลางของอาร์เรย์ 764 00:35:40,600 --> 00:35:43,660 คุณไม่สามารถแทรกองค์ประกอบอื่น ๆ ในตอนท้ายของอาร์เรย์ 765 00:35:43,660 --> 00:35:47,750 จริงๆคุณต้องรีสอร์ทเพื่อการสร้าง แถวใหม่ทั้งหมดที่เราได้พูดคุย 766 00:35:47,750 --> 00:35:49,320 คัดลอกเก่าเป็นใหม่ 767 00:35:49,320 --> 00:35:52,610 และอีกครั้งที่จะปวดหัวว่า ข้อเสนอ GetString ด้วยสำหรับคุณ 768 00:35:52,610 --> 00:35:56,170 >> แต่อีกครั้งคุณไม่สามารถแม้แต่จะใส่ สิ่งที่เป็นตรงกลางของแถว 769 00:35:56,170 --> 00:35:58,200 ถ้าอัตราการไม่ได้รับการเติมเต็มอย่างสิ้นเชิง 770 00:35:58,200 --> 00:36:03,010 ตัวอย่างเช่นถ้าแถวนี้นี่ขนาด หกมีเพียงห้าสิ่งที่อยู่ในนั้น 771 00:36:03,010 --> 00:36:06,080 ดีคุณสามารถตะปูเพียง บางสิ่งบางอย่างลงบนปลาย 772 00:36:06,080 --> 00:36:08,200 แต่ถ้าคุณต้องการแทรกบางสิ่งบางอย่าง ในช่วงกลางของ 773 00:36:08,200 --> 00:36:11,280 อาร์เรย์แม้ว่ามันอาจจะมี ห้าหกออกมาจากสิ่งที่อยู่ในนั้น? 774 00:36:11,280 --> 00:36:14,250 >> ดีเราทำอะไรเมื่อเรามีทั้งหมด ของอาสาสมัครมนุษย์ของเราในเวที 775 00:36:14,250 --> 00:36:15,110 สัปดาห์ที่ผ่านมา? 776 00:36:15,110 --> 00:36:18,710 ถ้าเราต้องการที่จะนำคนที่นี่อย่างใดอย่างหนึ่ง คนเหล่านี้วิธีการย้ายนี้ 777 00:36:18,710 --> 00:36:22,540 วิธีการที่คนเหล่านี้หรือวิธีการย้ายนี้ วิธีการและที่กลายเป็นแพง 778 00:36:22,540 --> 00:36:26,950 ขยับจากคนที่อยู่ภายใน อาร์เรย์จบลงด้วยการเพิ่มขึ้นและต้นทุน 779 00:36:26,950 --> 00:36:31,240 เวลาเราจึงจำนวนมาก n squared ของเรา ใช้เวลาเช่นจัดเรียงแทรกสำหรับ 780 00:36:31,240 --> 00:36:32,550 ตัวอย่างเช่นในกรณีที่เลวร้ายที่สุด 781 00:36:32,550 --> 00:36:36,520 ดังนั้นอาร์เรย์ที่ดี แต่คุณจะต้อง รู้ล่วงหน้าว่าใหญ่ที่คุณต้องการให้พวกเขา 782 00:36:36,520 --> 00:36:38,030 >> ดังนั้นตกลงนี่คือการแก้ปัญหา 783 00:36:38,030 --> 00:36:43,860 ถ้าฉันไม่ได้รู้ล่วงหน้าว่าหลาย นักเรียนผมอาจจะมีและฉันรู้ว่าครั้งหนึ่ง 784 00:36:43,860 --> 00:36:47,870 ผมตัดสินใจว่าผมติดอยู่กับที่ นักเรียนหลายคนทำไม่ได้ทำไมฉันเพียงแค่เสมอ 785 00:36:47,870 --> 00:36:51,740 จัดสรรพื้นที่มากที่สุดเท่าที่สอง ขณะที่ผมอาจจะคิดว่าฉันต้อง? 786 00:36:51,740 --> 00:36:54,450 ที่ไม่ได้เป็นทางออกที่เหมาะสม? 787 00:36:54,450 --> 00:36:58,240 >> แนบเนียนฉันไม่คิดว่าเรา จะต้องมากกว่า 50 ช่อง 788 00:36:58,240 --> 00:37:02,190 ในอาร์เรย์สำหรับชั้นเรียนขนาดกลาง, เพื่อให้เพียงรอบขึ้น 789 00:37:02,190 --> 00:37:07,040 ฉันจะทำให้ช่องว่าง 100 ช่องในอาร์เรย์ของฉันเพียง เพื่อที่เราจะได้รับแน่นอน 790 00:37:07,040 --> 00:37:10,330 จำนวนนักเรียนที่ผมคาดหวังที่จะ จะอยู่ในบางชั้นเรียนขนาดกลาง 791 00:37:10,330 --> 00:37:14,320 ดังนั้นทำไมไม่เพียงแค่รอบขึ้นและจัดสรร หน่วยความจำมากขึ้นโดยทั่วไปสำหรับอาร์เรย์ 792 00:37:14,320 --> 00:37:16,290 กว่าที่คุณคิดว่าคุณอาจจะต้อง? 793 00:37:16,290 --> 00:37:20,190 นี้ pushback ง่ายอะไร ความคิดที่ว่า? 794 00:37:20,190 --> 00:37:21,440 >> คุณเพียงแค่การสูญเสียความทรงจำ 795 00:37:21,440 --> 00:37:25,350 ตัวอักษรโปรแกรมที่คุณเขียนแล้วทุก อาจจะมีการใช้หน่วยความจำมากเป็นสองเท่า 796 00:37:25,350 --> 00:37:26,680 ที่คุณต้องการจริง 797 00:37:26,680 --> 00:37:28,990 และนั่นก็ไม่ได้รู้สึกเหมือน ทางออกที่สวยงามโดยเฉพาะอย่างยิ่ง 798 00:37:28,990 --> 00:37:31,990 นอกจากนี้มันก็ลดลง ความน่าจะเป็นของปัญหา 799 00:37:31,990 --> 00:37:35,300 หากคุณเกิดขึ้นจะมีหลักสูตรที่เป็นที่นิยม หนึ่งภาคการศึกษาและคุณมี 101 800 00:37:35,300 --> 00:37:39,610 นักเรียนโปรแกรมของคุณยังคงเป็น พื้นฐานเผชิญปัญหาเดียวกัน 801 00:37:39,610 --> 00:37:44,280 >> ดังนั้นโชคดีที่มีวิธีการแก้อะไร โฆษณานี้ทุกปัญหาเราในรูปแบบ 802 00:37:44,280 --> 00:37:46,790 ของโครงสร้างข้อมูลที่มี ที่ซับซ้อนมากขึ้นกว่าคน 803 00:37:46,790 --> 00:37:47,970 ที่เราเคยเห็นป่านนี้ 804 00:37:47,970 --> 00:37:50,530 นี้ผมเรียกร้องเป็นรายการที่เชื่อมโยง 805 00:37:50,530 --> 00:37:51,920 นี่คือรายการของตัวเลข - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, และ 34 - 807 00:37:54,970 --> 00:38:00,120 ที่ได้รับการเชื่อมโยงกันโดยวิธีการ จากสิ่งที่ผมเคยวาดลูกศร 808 00:38:00,120 --> 00:38:03,580 >> ในคำอื่น ๆ ถ้าผมต้องการที่จะเป็นตัวแทน อาร์เรย์ที่ฉันจะทำ 809 00:38:03,580 --> 00:38:04,910 บางอย่างเช่นนี้ 810 00:38:04,910 --> 00:38:07,310 และฉันจะใส่นี้ค่าใช้จ่าย ในเวลาเพียงสักครู่ 811 00:38:07,310 --> 00:38:09,970 ฉันจะทำ - 812 00:38:09,970 --> 00:38:12,520 สวัสดีทั้งหมดขวา 813 00:38:12,520 --> 00:38:14,470 ยืนตาม 814 00:38:14,470 --> 00:38:17,360 คอมพิวเตอร์เครื่องใหม่ที่นี่ชัดเจน - 815 00:38:17,360 --> 00:38:18,090 สิทธิทั้งหมด 816 00:38:18,090 --> 00:38:21,730 >> ดังนั้นถ้าฉันมีตัวเลขเหล่านี้ในอาร์เรย์ - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 ไม่จำเป็นต้องไปที่วัด 819 00:38:30,530 --> 00:38:33,730 ทั้งหมดที่เหมาะสมเพื่อให้ที่นี่เป็นอาร์เรย์ของฉัน - 820 00:38:33,730 --> 00:38:34,980 พระเจ้าช่วย 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 ขวาทั้งหมดเพื่อให้ที่นี่เป็นอาร์เรย์ของฉัน 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 พระเจ้าช่วย 825 00:38:45,050 --> 00:38:48,820 >> [เสียงหัวเราะ] 826 00:38:48,820 --> 00:38:49,440 >> DAVID ลัน: Pretend 827 00:38:49,440 --> 00:38:52,330 มันเป็นความพยายามมากเกินไปที่จะกลับไป และแก้ไขที่นั่น - 828 00:38:52,330 --> 00:38:54,290 26 829 00:38:54,290 --> 00:38:57,650 ดังนั้นเราจึงมีอาร์เรย์ของนี้ 9, 17, 22, 26, และ 34 830 00:38:57,650 --> 00:39:00,260 สำหรับบรรดาของคุณสามารถมองเห็นได้ ความผิดพลาดที่น่าอายที่ผมเพิ่งทำ, 831 00:39:00,260 --> 00:39:00,830 มีเป็น 832 00:39:00,830 --> 00:39:04,490 >> ดังนั้นผมจึงเรียกร้องว่านี่คือ โซลูชันที่มีประสิทธิภาพมาก 833 00:39:04,490 --> 00:39:07,310 ผมเคยจัดสรรเป็น ints มากที่สุดเท่าที่ ฉันจำเป็นต้อง - หนึ่งสองสาม 834 00:39:07,310 --> 00:39:09,100 สี่ห้าหรือหก - 835 00:39:09,100 --> 00:39:11,660 และฉันได้เก็บไว้แล้วตัวเลขที่ ภายในของอาร์เรย์นี้ 836 00:39:11,660 --> 00:39:15,220 แต่คิดว่าแล้วฉันต้องการแทรก มูลค่าเช่นหมายเลข 8? 837 00:39:15,220 --> 00:39:16,100 ดีก็ไม่ไปไหน 838 00:39:16,100 --> 00:39:18,530 สมมติว่าฉันต้องการแทรก จำนวนเช่น 20 839 00:39:18,530 --> 00:39:19,790 ดีก็ไม่ไปไหน 840 00:39:19,790 --> 00:39:23,160 ที่ไหนสักแห่งมีที่อยู่ตรงกลาง, หรือเลขที่ 35 ได้ไป 841 00:39:23,160 --> 00:39:24,010 ที่ไหนสักแห่งในตอนท้าย 842 00:39:24,010 --> 00:39:25,320 แต่ฉันออกจากพื้นที่ทั้งหมด 843 00:39:25,320 --> 00:39:29,120 >> และนี้จึงเป็นความท้าทายขั้นพื้นฐาน ของอาร์เรย์ที่ไม่เป็นทางออก 844 00:39:29,120 --> 00:39:32,280 ผมอ้างว่าช่วงเวลาที่ผ่านมา getString แก้ปัญหานี้ได้ 845 00:39:32,280 --> 00:39:37,380 ถ้าคุณต้องการที่จะแทรกหมายเลขหก เป็น array นี้สิ่งที่อย่างน้อยหนึ่ง 846 00:39:37,380 --> 00:39:40,090 แก้ปัญหาที่คุณสามารถถอยกลับเพื่อตรวจสอบว่า เช่นเดียวกับที่เราทำกับ GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 ว่าคืออะไร? 849 00:39:46,030 --> 00:39:48,190 >> กันทำให้มันมีขนาดใหญ่เป็น พูดง่ายกว่าทำ 850 00:39:48,190 --> 00:39:52,810 เราสามารถไม่จำเป็นต้องทำให้อาร์เรย์ ที่ใหญ่กว่า แต่สิ่งที่เราจะทำอย่างไร 851 00:39:52,810 --> 00:39:56,570 ทำให้แถวใหม่ที่ใหญ่กว่าขนาด 6 หรืออาจจะขนาด 10 ถ้าเราต้องการ 852 00:39:56,570 --> 00:40:00,490 ได้รับล่วงหน้าของสิ่งนั้นคัดลอก อาร์เรย์เก่าเป็นใหม่และจากนั้น 853 00:40:00,490 --> 00:40:01,680 ฟรีอาร์เรย์เก่า 854 00:40:01,680 --> 00:40:05,770 >> แต่เวลาทำงานอะไร ตอนของกระบวนการที่? 855 00:40:05,770 --> 00:40:09,870 มัน O ใหญ่ของ n เพราะการคัดลอก จะเสียค่าใช้จ่ายบางส่วนของหน่วย 856 00:40:09,870 --> 00:40:13,480 เวลาดังนั้นไม่เหมาะดังนั้นหากเราจะต้อง จัดสรรแถวใหม่ซึ่งเป็นไป 857 00:40:13,480 --> 00:40:15,610 ที่จะบริโภคสองเท่า หน่วยความจำชั่วคราว 858 00:40:15,610 --> 00:40:16,660 คัดลอกเก่าเป็นใหม่ - 859 00:40:16,660 --> 00:40:18,800 ฉันหมายความว่ามันเป็นแค่อาการปวดหัวซึ่ง เป็นอีกเหตุผลที่เราเขียน 860 00:40:18,800 --> 00:40:19,920 getString สำหรับคุณ 861 00:40:19,920 --> 00:40:21,380 >> ดังนั้นสิ่งที่เราอาจจะทำแทน? 862 00:40:21,380 --> 00:40:25,000 ดีสิ่งที่ถ้าโครงสร้างข้อมูลของเรา จริงมีช่องว่างในการหรือไม่ 863 00:40:25,000 --> 00:40:30,790 สมมติว่าผมผ่อนคลายเป้าหมายของฉันของการมี ชิ้นที่อยู่ติดกันของหน่วยความจำที่ 9 864 00:40:30,790 --> 00:40:34,500 ที่ถูกต้องต่อไปถึง 17 ซึ่งเป็น ที่เหมาะสมต่อไปถึงวันที่ 22 และอื่น ๆ 865 00:40:34,500 --> 00:40:39,570 >> และคิดว่า 9 สามารถไปที่นี่ใน แรม 17 และสามารถไปที่นี่ใน RAM, 866 00:40:39,570 --> 00:40:40,990 และ 22 สามารถไปที่นี่ใน RAM 867 00:40:40,990 --> 00:40:43,610 ในคำอื่น ๆ ที่ฉันไม่ต้องการพวกเขา แม้จะกลับไปกลับอีกต่อไป 868 00:40:43,610 --> 00:40:47,850 ฉันต้องอย่างใดด้ายเข็ม ผ่านแต่ละตัวเลขเหล่านี้หรือแต่ละ 869 00:40:47,850 --> 00:40:51,010 ของโหนดเหล่านี้ที่เราจะเรียก สี่เหลี่ยมที่ผมเคยวาดพวกเขาไป 870 00:40:51,010 --> 00:40:55,670 จำวิธีการได้รับไปยังหน้าล่​​าสุด โหนดดังกล่าวตั้งแต่แรก 871 00:40:55,670 --> 00:40:59,940 >> ดังนั้นการเขียนโปรแกรมสร้างสิ่ง ที่เราเคยเห็นค่อนข้างเร็ว ๆ นี้กับที่ฉัน 872 00:40:59,940 --> 00:41:03,030 สามารถใช้ด้ายที่หรือ วาดที่นี่กับที่ฉันสามารถ 873 00:41:03,030 --> 00:41:05,430 ใช้ลูกศรเหล่านั้นหรือไม่ 874 00:41:05,430 --> 00:41:06,500 ดังนั้นตัวชี้ขวา? 875 00:41:06,500 --> 00:41:09,560 ถ้าฉันไม่ได้เป็นเพียงการจัดสรร int แต่โหนด - และ 876 00:41:09,560 --> 00:41:10,810 โหนดผมก็หมายถึงภาชนะ 877 00:41:10,810 --> 00:41:12,900 และสายตาผมหมายถึงรูปสี่เหลี่ยมผืนผ้า 878 00:41:12,900 --> 00:41:16,420 ดังนั้นโหนดที่เห็นได้ชัดว่าต้องการ จะมีสองค่า - 879 00:41:16,420 --> 00:41:21,490 int ตัวเองและจากนั้นส่อให้เห็นเป็นไปตามที่ ครึ่งล่างของรูปสี่เหลี่ยมผืนผ้า, 880 00:41:21,490 --> 00:41:23,010 พื้นที่เพียงพอสำหรับ int 881 00:41:23,010 --> 00:41:26,130 >> ดังนั้นเพียงแค่คิดล่วงหน้าที่นี่ วิธีการใหญ่โหนดนี้คือนี้ 882 00:41:26,130 --> 00:41:27,170 ภาชนะในคำถาม? 883 00:41:27,170 --> 00:41:29,250 กี่ไบต์สำหรับ int? 884 00:41:29,250 --> 00:41:31,310 สันนิษฐาน 4 ถ้ามัน เช่นเดียวกับปกติ 885 00:41:31,310 --> 00:41:33,270 แล้วกี่ไบต์ สำหรับตัวชี้? 886 00:41:33,270 --> 00:41:33,650 4 887 00:41:33,650 --> 00:41:37,940 ดังนั้นภาชนะบรรจุหรือโหนดนี้คือ จะเป็นโครงสร้างที่ 8 ไบต​​์ 888 00:41:37,940 --> 00:41:41,760 Oh, และที่บังเอิญมีความสุขที่ เราเพียงแค่นำความคิดนี้ 889 00:41:41,760 --> 00:41:44,400 struct หรือโครงสร้าง C 890 00:41:44,400 --> 00:41:48,890 >> ดังนั้นผมจึงเรียกร้องว่าฉันต้องการที่จะใช้ขั้นตอน ไปนี้ความซับซ้อนมากขึ้น 891 00:41:48,890 --> 00:41:52,560 การดำเนินงานของรายการของตัวเลข รายการที่เชื่อมโยงของตัวเลขที่ฉันต้องทำ 892 00:41:52,560 --> 00:41:56,920 ความคิดเล็ก ๆ น้อย ๆ ขึ้นด้านหน้าและ ประกาศไม่เพียง แต่ int แต่ struct 893 00:41:56,920 --> 00:41:58,620 ที่ฉันจะโทรตามอัตภาพ ที่นี่โหนด 894 00:41:58,620 --> 00:42:01,630 เราสามารถเรียกมันว่าสิ่งที่เราต้องการ แต่ โหนดเป็นไปได้ในหลายใจ 895 00:42:01,630 --> 00:42:03,560 สิ่งที่เราเริ่มมองในขณะนี้ 896 00:42:03,560 --> 00:42:06,480 >> ภายในของโหนดที่ int n คือ 897 00:42:06,480 --> 00:42:09,350 แล้วรูปแบบนี้เล็ก ๆ น้อย ๆ แปลกได้อย่างรวดเร็วก่อน - 898 00:42:09,350 --> 00:42:12,960 struct โหนดต่อไป 899 00:42:12,960 --> 00:42:16,900 pictorially ดีว่าเป็นสิ่งที่? 900 00:42:16,900 --> 00:42:21,000 นั่นคือครึ่งล่างของ สี่เหลี่ยมผืนผ้าที่เราเห็น 901 00:42:21,000 --> 00:42:22,730 เมื่อตะกี้ 902 00:42:22,730 --> 00:42:27,600 >> แต่ทำไมฉันบอกว่าโหนด struct * เมื่อเทียบกับเพียงโหนด *? 903 00:42:27,600 --> 00:42:31,370 เพราะถ้าตัวชี้เป็นชี้ว่า ที่โหนดอื่นก็เพียง 904 00:42:31,370 --> 00:42:32,760 ที่อยู่ของโหนด 905 00:42:32,760 --> 00:42:35,630 ที่สอดคล้องกับสิ่งที่เราได้ พูดคุยเกี่ยวกับตัวชี้ป่านนี้ 906 00:42:35,630 --> 00:42:39,690 แต่ทำไมถ้าผมเรียกร้องโครงสร้างนี้คือ ที่เรียกว่าโหนดฉันไม่ได้ที่จะบอกว่า struct 907 00:42:39,690 --> 00:42:42,660 โหนดภายในที่นี่? 908 00:42:42,660 --> 00:42:43,190 >> อย่างแน่นอน 909 00:42:43,190 --> 00:42:46,490 มันเรียงลำดับของความเป็นจริงโง่ซี typedef เพื่อที่จะพูดมีไม่ได้ 910 00:42:46,490 --> 00:42:47,220 ที่เกิดขึ้นยัง 911 00:42:47,220 --> 00:42:48,510 C เป็นซุปเปอร์ตัวอักษร 912 00:42:48,510 --> 00:42:51,050 มันอ่านบนรหัสของคุณ ด้านล่างซ้ายไปขวา 913 00:42:51,050 --> 00:42:54,930 และจนฮิตอัฒภาคว่า บรรทัดล่างคาดเดาอะไรไม่ได้ 914 00:42:54,930 --> 00:42:57,590 อยู่เป็นชนิดข้อมูล? 915 00:42:57,590 --> 00:42:59,060 โหนดโหนดอ้างไม่ได้นำมาอ้าง 916 00:42:59,060 --> 00:43:03,050 >> แต่เป็นเพราะ verbose เพิ่มเติม ประกาศผมในบรรทัดแรก - 917 00:43:03,050 --> 00:43:05,340 โหนด typedef struct - 918 00:43:05,340 --> 00:43:08,790 เพราะที่มาก่อนที่ วงเล็บปีกกาที่ประเภทเช่น 919 00:43:08,790 --> 00:43:11,800 ก่อนการให้ความรู้-เสียงดังกราวว่าคุณ รู้ว่าสิ่งที่ให้ฉัน struct 920 00:43:11,800 --> 00:43:13,570 ที่เรียกว่าโหนด struct 921 00:43:13,570 --> 00:43:16,270 ตรงไปตรงมาผมไม่ชอบสิ่งที่เรียก struct โหนดโหนด struct ทั้งหมด 922 00:43:16,270 --> 00:43:17,090 ตลอดรหัสของฉัน 923 00:43:17,090 --> 00:43:20,660 แต่ฉันเท่านั้นที่จะใช้ครั้งเดียวเพียงแค่ภายใน เพื่อที่ฉันสามารถได้อย่างมีประสิทธิภาพ 924 00:43:20,660 --> 00:43:25,010 สร้างการเรียงลำดับของการอ้างอิงแบบวงกลมไม่ ตัวชี้ไปยังตัวเองต่อ แต่ 925 00:43:25,010 --> 00:43:29,400 ตัวชี้ไปยังอีกคนหนึ่งของ ประเภทเหมือนกัน 926 00:43:29,400 --> 00:43:32,330 >> ดังนั้นจึงปรากฎว่าเมื่อโครงสร้างข้อมูล เช่นนี้มีไม่กี่คน 927 00:43:32,330 --> 00:43:34,470 การดำเนินการที่อาจจะมี ความสนใจของเรา 928 00:43:34,470 --> 00:43:37,460 เราอาจต้องการแทรก ลงในรายการเช่นนี้ 929 00:43:37,460 --> 00:43:39,850 เราอาจต้องการลบ จากรายการเช่นนี้ 930 00:43:39,850 --> 00:43:43,490 เราอาจจะต้องการค้นหารายการสำหรับ มูลค่าหรือมากกว่าโดยทั่วไปการสำรวจ 931 00:43:43,490 --> 00:43:46,410 และการสำรวจเป็นเพียงวิธีแฟนซีของ บอกว่าเริ่มต้นที่ด้านซ้ายและย้ายทั้งหมด 932 00:43:46,410 --> 00:43:47,650 วิธีการที่เหมาะสม 933 00:43:47,650 --> 00:43:52,640 >> และแจ้งให้ทราบล่วงหน้านี้แม้จะมีมากขึ้นเล็กน้อย โครงสร้างข้อมูลที่มีความซับซ้อนให้ 934 00:43:52,640 --> 00:43:56,510 ผมเสนอว่าเราสามารถยืมบางส่วนของ ความคิดของที่ผ่านมาสองสัปดาห์และ 935 00:43:56,510 --> 00:43:58,410 ใช้ฟังก์ชันที่เรียกว่า ค้นหาเช่นนี้ 936 00:43:58,410 --> 00:44:01,360 มันจะกลับจริงหรือ เท็จชี้ใช่หรือ 937 00:44:01,360 --> 00:44:03,390 ไม่มี n คือในรายการ 938 00:44:03,390 --> 00:44:05,960 อาร์กิวเมนต์ที่สองมันเป็นตัวชี้ ไปยังรายการของตัวเองดังนั้น 939 00:44:05,960 --> 00:44:07,920 ตัวชี้ไปยังโหนด 940 00:44:07,920 --> 00:44:10,350 >> ทั้งหมดที่ฉันจะทำคือการแล้วประกาศ ตัวแปรชั่วคราว 941 00:44:10,350 --> 00:44:12,730 เราจะเรียกว่า PTR โดยการประชุม, สำหรับตัวชี้ 942 00:44:12,730 --> 00:44:15,220 และฉันกำหนดให้เท่ากับ จุดเริ่มต้นของรายการ 943 00:44:15,220 --> 00:44:16,680 >> และตอนนี้สังเกตเห็นห่วงขณะ 944 00:44:16,680 --> 00:44:20,640 ตราบใดที่ตัวชี้ไม่เท่ากับ ให้เป็นโมฆะ, ฉันจะตรวจสอบ 945 00:44:20,640 --> 00:44:24,520 คือลูกศรตัวชี้ n เท่ากับ n ที่ถูกส่งผ่านไปใน? 946 00:44:24,520 --> 00:44:26,410 และรอนาที - ใหม่ ชิ้นส่วนของไวยากรณ์ 947 00:44:26,410 --> 00:44:29,324 อะไรคือสิ่งที่ลูกศรทั้งหมดในทันที? 948 00:44:29,324 --> 00:44:30,574 อ้าง? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> อย่างแน่นอน 951 00:44:34,810 --> 00:44:38,860 ดังนั้นในขณะที่ไม่กี่นาทีที่ผ่านมาเราใช้ สัญกรณ์ในการเข้าถึงจุดบางสิ่งบางอย่าง 952 00:44:38,860 --> 00:44:43,080 ภายในของ struct ถ้าตัวแปร คุณไม่ได้เป็น struct 953 00:44:43,080 --> 00:44:47,420 ตัวเอง แต่ตัวชี้ไปที่ struct, ขอบคุณที่ชิ้นส่วนของไวยากรณ์ที่ 954 00:44:47,420 --> 00:44:48,620 ในที่สุดก็ทำให้ความรู้สึกที่ใช้งานง่าย 955 00:44:48,620 --> 00:44:52,360 ลูกศรหมายถึงการปฏิบัติตามตัวชี้ เหมือนลูกศรของเรามักจะหมายถึง 956 00:44:52,360 --> 00:44:56,570 pictorially และไปที่ ข้อมูลฟิลด์ภายใน 957 00:44:56,570 --> 00:44:59,700 ดังนั้นลูกศรเป็นสิ่งเดียวกันเป็นจุด แต่ คุณจะใช้มันเมื่อคุณมีตัวชี้ 958 00:44:59,700 --> 00:45:05,270 >> ดังนั้นเพียงเพื่อปะยางรถแล้วถ้าสนาม n ภายในของโครงสร้างที่เรียกว่าตัวชี้ 959 00:45:05,270 --> 00:45:07,760 เท่ากับเท่ากับ n, return true 960 00:45:07,760 --> 00:45:11,970 มิฉะนั้นเส้นที่นี่ - ชี้ เท่ากับตัวชี้ต่อไป 961 00:45:11,970 --> 00:45:17,540 ดังนั้นสิ่งนี้จะทำแจ้งให้ทราบคือถ้าผม กำลังชี้ไปที่ struct 962 00:45:17,540 --> 00:45:21,430 ที่มี 9, 9 และไม่ได้เป็นจำนวน ฉันกำลังมองหา - คิดว่าฉันกำลังมองหา 963 00:45:21,430 --> 00:45:22,830 สำหรับ n เท่ากับ 50 - 964 00:45:22,830 --> 00:45:25,930 ฉันจะปรับปรุงตัวชี้ชั่วคราวของฉัน ที่จะไม่ชี้ที่โหนดนี้ 965 00:45:25,930 --> 00:45:31,190 อีกต่อไป แต่ตัวชี้ลูกศรถัดจากที่ จะวางฉันขึ้นที่นี่ 966 00:45:31,190 --> 00:45:34,270 >> ตอนนี้ฉันรู้ว่าเป็นลมบ้าหมู การแนะนำ 967 00:45:34,270 --> 00:45:37,380 เมื่อวันพุธที่เราจริงจะทำเช่นนี้ กับมนุษย์บางส่วนและบางส่วนที่มีมากขึ้น 968 00:45:37,380 --> 00:45:38,900 รหัสอัตราที่ชะลอลง 969 00:45:38,900 --> 00:45:42,990 แต่รู้ว่าเรากำลังทำข้อมูลของเรา โครงสร้างที่ซับซ้อนมากขึ้นเพื่อให้เรา 970 00:45:42,990 --> 00:45:45,780 อัลกอริทึมจะได้รับมีประสิทธิภาพมากขึ้นซึ่ง เป็นไปได้ที่จำเป็นสำหรับการ 971 00:45:45,780 --> 00:45:50,500 pset หกเมื่อเราโหลดในครั้งนั้น 150,000 คำ แต่จำเป็นต้องทำเช่นนั้น 972 00:45:50,500 --> 00:45:55,650 ได้อย่างมีประสิทธิภาพและความนึกคิดสร้าง โปรแกรมที่ทำงานสำหรับผู้ใช้ของเราไม่ได้อยู่ใน 973 00:45:55,650 --> 00:46:00,460 เชิงเส้นไม่ได้อยู่ใน n squared แต่ใน เวลาคงที่ในอุดมคติ 974 00:46:00,460 --> 00:46:02,300 >> เราจะเห็นคุณในวันพุธที่ 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: ที่ CS50 ต่อไปเดวิด ลืมกรณีฐานของเขา 976 00:46:07,240 --> 00:46:12,770 >> DAVID ลัน: และนั่นเป็นวิธีที่คุณส่ง ข้อความ c กับอะไร - 977 00:46:12,770 --> 00:46:14,020 >> ข้อความ [ต่างๆ ประกาศเสียง] 978 00:46:14,020 --> 00:46:19,734