1 00:00:00,000 --> 00:00:09,572 2 00:00:09,572 --> 00:00:12,030 ปล้นสลิง: สวัสดีครับผมร็อบโบว์ และขอพูดคุยเกี่ยว quiz0 3 00:00:12,030 --> 00:00:13,280 4 00:00:13,280 --> 00:00:14,545 >> ดังนั้นคำถามแรก 5 00:00:14,545 --> 00:00:17,750 นี่คือคำถามที่ คุณจำเป็นต้องรหัสตัวเลข 6 00:00:17,750 --> 00:00:21,270 127 ในหลอดไบนารี 7 00:00:21,270 --> 00:00:23,550 ถ้าคุณต้องการคุณสามารถ ทำแปลงปกติ 8 00:00:23,550 --> 00:00:25,950 จาก bi-- หรือจากทศนิยมเพื่อไบนารี 9 00:00:25,950 --> 00:00:28,300 แต่ที่อาจจะ ที่จะใช้เวลามาก 10 00:00:28,300 --> 00:00:31,750 ฉันหมายความว่าคุณสามารถคิดออกว่า ตกลง 1 ในนั้น 2 ในนั้น 11 00:00:31,750 --> 00:00:33,650 4 อยู่ในนั้น 8 อยู่ในนั้น 12 00:00:33,650 --> 00:00:39,280 วิธีที่ง่าย, 127 เป็น 128 ลบหนึ่ง 13 00:00:39,280 --> 00:00:42,013 ที่หลอดไฟซ้ายสุดเป็น 128 บิต 14 00:00:42,013 --> 00:00:43,490 15 00:00:43,490 --> 00:00:47,860 ดังนั้น 127 เป็นจริงเพียงทั้งหมด ของหลอดไฟอื่น ๆ 16 00:00:47,860 --> 00:00:51,420 ตั้งแต่ที่ซ้ายสุด หลอดไฟลบ 1 17 00:00:51,420 --> 00:00:52,800 ที่มันสำหรับคำถามที่ 18 00:00:52,800 --> 00:00:54,060 >> คำถามหนึ่ง 19 00:00:54,060 --> 00:00:56,710 ดังนั้นด้วย 3 บิตที่คุณสามารถ เป็นตัวแทนของ 8 ค่าที่แตกต่าง 20 00:00:56,710 --> 00:01:01,000 ทำไมจึงเป็น 7 ที่ใหญ่ที่สุดที่ไม่ใช่เชิงลบ จำนวนเต็มทศนิยมที่คุณสามารถแสดง? 21 00:01:01,000 --> 00:01:04,050 ดีถ้าเราสามารถทำได้เท่านั้น เป็นตัวแทนของ 8 ค่าแตกต่าง 22 00:01:04,050 --> 00:01:07,430 แล้วสิ่งที่เรากำลังจะเป็น ที่เป็นตัวแทนเป็น 0 ถึง 7 23 00:01:07,430 --> 00:01:08,745 0 จะขึ้นค่าใดค่าหนึ่ง 24 00:01:08,745 --> 00:01:09,980 25 00:01:09,980 --> 00:01:11,190 >> คำถามที่สอง 26 00:01:11,190 --> 00:01:14,610 ด้วยบิต n กี่ที่แตกต่าง ค่าที่คุณสามารถแสดง? 27 00:01:14,610 --> 00:01:19,080 ดังนั้นด้วยบิต n คุณมี 2 ค่าที่เป็นไปสำหรับแต่ละบิต 28 00:01:19,080 --> 00:01:22,300 ดังนั้นเราจึงมี 2 ค่าที่เป็นไปได้ บิตแรก 2 ค่าที่เป็นไป 29 00:01:22,300 --> 00:01:24,450 เป็นครั้งที่สอง 2 เป็นไปได้สำหรับที่สาม 30 00:01:24,450 --> 00:01:28,730 และเพื่อให้เป็น 2 ครั้ง 2 ครั้งที่ 2 และ ในที่สุดคำตอบคือ 2 ถึง n 31 00:01:28,730 --> 00:01:30,010 32 00:01:30,010 --> 00:01:31,100 >> คำถามที่สาม 33 00:01:31,100 --> 00:01:33,450 อะไร 0x50 ในไบนารี? 34 00:01:33,450 --> 00:01:39,490 ดังนั้นจำไว้ว่าเลขฐานสิบหกมีมาก การแปลงเลขฐานสองตรงไปตรงมา 35 00:01:39,490 --> 00:01:43,180 ดังนั้นที่นี่เราก็ต้องมองไปที่ 5 และ 0 อิสระ 36 00:01:43,180 --> 00:01:45,110 ดังนั้นสิ่งที่ 5 ในไบนารี? 37 00:01:45,110 --> 00:01:48,400 0101 ที่เป็นบิตที่ 1 และ 4 บิต 38 00:01:48,400 --> 00:01:49,900 มีอะไรในไบนารี 0? 39 00:01:49,900 --> 00:01:50,520 ไม่ยุ่งยาก 40 00:01:50,520 --> 00:01:52,180 0000 41 00:01:52,180 --> 00:01:54,970 ดังนั้นเพียงแค่นำพวกเขาเข้าด้วยกันและ ที่เต็มจำนวนในไบนารี 42 00:01:54,970 --> 00:01:57,640 01010000 43 00:01:57,640 --> 00:02:00,439 และถ้าคุณต้องการคุณสามารถ ถอดที่ศูนย์ซ้ายสุด 44 00:02:00,439 --> 00:02:01,105 มันเป็นเรื่องที่ไม่เกี่ยวข้อง 45 00:02:01,105 --> 00:02:02,920 46 00:02:02,920 --> 00:02:05,733 >> ดังนั้นแล้วอีกทางเลือกหนึ่ง สิ่งที่เป็น 0x50 ในทศนิยม? 47 00:02:05,733 --> 00:02:08,649 หากคุณต้องการคุณ could-- ถ้าคุณ สะดวกสบายมากขึ้นกับไบนารี, 48 00:02:08,649 --> 00:02:11,340 คุณสามารถใช้คำตอบไบนารีที่ และแปลงที่เป็นทศนิยม 49 00:02:11,340 --> 00:02:13,870 หรือเราก็สามารถจำได้ เลขฐานสิบหกที่ 50 00:02:13,870 --> 00:02:21,140 เพื่อให้ 0 อยู่ในสถานที่ที่ 0-th และ 5 ที่อยู่ใน 16 ไปยังสถานที่แรก 51 00:02:21,140 --> 00:02:25,990 ดังนั้นที่นี่เรามี 5 ครั้งที่ 16 ครั้งแรกบวก 0 ครั้งที่ 16 ให้เป็นศูนย์, 52 00:02:25,990 --> 00:02:27,520 คือ 80 53 00:02:27,520 --> 00:02:29,710 และถ้าคุณมองไปที่ ชื่อเพื่อคำถามที่ว่า 54 00:02:29,710 --> 00:02:32,920 มันเป็นซี 80 ซึ่งเป็นชนิดของ คำใบ้ที่จะตอบปัญหานี้ 55 00:02:32,920 --> 00:02:34,460 56 00:02:34,460 --> 00:02:35,420 >> คำถามที่ห้า 57 00:02:35,420 --> 00:02:40,320 เรามีสคริปต์ Scratch นี้ซึ่งเป็น การทำซ้ำ 4 ครั้งเนยถั่วเยลลี่ 58 00:02:40,320 --> 00:02:42,800 ดังนั้นวิธีการที่เราทำตอนนี้รหัสที่ใน C? 59 00:02:42,800 --> 00:02:47,730 ดีที่เรามีตรงนี้ส่วนหนึ่งเป็นตัวหนา เป็นเพียงส่วนหนึ่งที่คุณมีในการดำเนินการ 60 00:02:47,730 --> 00:02:51,950 ดังนั้นเราจึงมี 4 วงที่วนลูป 4 ครั้ง printf ไอเอ็นจีเนยถั่วลิสงวุ้น 61 00:02:51,950 --> 00:02:53,910 กับสายใหม่เป็นปัญหาขอ 62 00:02:53,910 --> 00:02:55,250 63 00:02:55,250 --> 00:02:57,490 >> คำถามที่หกปัญหา Scratch อื่น 64 00:02:57,490 --> 00:03:00,210 เรามาดูกันว่าเราอยู่ในวงตลอดไป 65 00:03:00,210 --> 00:03:05,000 เรากำลังจะบอกว่าฉันตัวแปร แล้วการเพิ่มฉัน 1 66 00:03:05,000 --> 00:03:09,580 ตอนนี้เราต้องการที่จะทำในซีมี หลายวิธีที่เราจะได้ทำอย่างนี้ 67 00:03:09,580 --> 00:03:12,840 ที่นี่เราที่เกิดขึ้นกับรหัส ห่วงตลอดไปในขณะที่ (จริง) 68 00:03:12,840 --> 00:03:16,600 ดังนั้นเราประกาศตัวแปรฉันเพียง เหมือนเรามีฉันตัวแปรในเกา 69 00:03:16,600 --> 00:03:21,950 ประกาศฉันตัวแปรและตลอดไป ในขณะที่ (จริง) เราบอกฉันตัวแปร 70 00:03:21,950 --> 00:03:25,260 ดังนั้น printf% i-- หรือคุณอาจจะเคยใช้% d 71 00:03:25,260 --> 00:03:27,985 เราบอกว่าตัวแปรที่และ แล้วเพิ่มมัน i ++ 72 00:03:27,985 --> 00:03:29,560 73 00:03:29,560 --> 00:03:30,830 >> คำถามที่เจ็ด 74 00:03:30,830 --> 00:03:35,560 ตอนนี้เราต้องการที่จะทำบางสิ่งบางอย่างที่คล้ายกันมาก กับมาริโอจุด C จากปัญหาตั้งหนึ่ง 75 00:03:35,560 --> 00:03:39,110 เราต้องการที่จะพิมพ์ hashtags เหล่านี้ เราต้องการที่จะพิมพ์ห้า 76 00:03:39,110 --> 00:03:40,700 โดยสามสี่เหลี่ยมผืนผ้า hashes เหล่านี้ 77 00:03:40,700 --> 00:03:41,770 78 00:03:41,770 --> 00:03:43,162 ดังนั้นเราจึงมีวิธีการที่จะทำเช่นนั้น? 79 00:03:43,162 --> 00:03:45,370 ดีเราจะให้คุณทั้ง พวงของรหัสและคุณก็ 80 00:03:45,370 --> 00:03:47,560 ต้องกรอกข้อมูลในฟังก์ชั่นการพิมพ์ตาราง 81 00:03:47,560 --> 00:03:49,540 >> ดังนั้นสิ่งที่จะ PrintGrid มีลักษณะอย่างไร 82 00:03:49,540 --> 00:03:51,480 ที่ดีที่คุณกำลังที่ผ่านมา ความกว้างและความสูง 83 00:03:51,480 --> 00:03:53,520 ดังนั้นเราจึงมีด้านนอก 4 ห่วงที่วนลูป 84 00:03:53,520 --> 00:03:57,650 ทั้งหมดแถวนี้ ตารางที่เราต้องการที่จะพิมพ์ออกมา 85 00:03:57,650 --> 00:04:01,250 แล้วเรามีที่ซ้อนกันระหว่างวงที่ 4 ที่พิมพ์ไปแต่ละคอลัมน์ 86 00:04:01,250 --> 00:04:06,210 ดังนั้นสำหรับแต่ละแถวเราพิมพ์สำหรับ แต่ละคอลัมน์กัญชาเดียว 87 00:04:06,210 --> 00:04:10,045 จากนั้นที่ท้ายแถวที่เราพิมพ์ บรรทัดใหม่เดียวจะไปแถวถัดไป 88 00:04:10,045 --> 00:04:11,420 และที่มันสำหรับตารางทั้ง 89 00:04:11,420 --> 00:04:12,810 90 00:04:12,810 --> 00:04:13,675 >> คำถามที่แปด 91 00:04:13,675 --> 00:04:17,170 ฟังก์ชั่นเช่น PrintGrid มีการกล่าวถึง มีผลข้างเคียง แต่ไม่กลับมา 92 00:04:17,170 --> 00:04:17,670 มูลค่า 93 00:04:17,670 --> 00:04:19,209 อธิบายความแตกต่าง 94 00:04:19,209 --> 00:04:23,080 ดังนั้นนี้ขึ้นอยู่กับคุณความทรงจำ สิ่งที่มีผลข้างเคียงคือ 95 00:04:23,080 --> 00:04:25,180 ดีกลับ value-- เรารู้ว่า PrintGrid ไม่ 96 00:04:25,180 --> 00:04:28,180 มีค่าตอบแทนตั้งแต่ ที่นี่มันบอกว่าเป็นโมฆะ 97 00:04:28,180 --> 00:04:31,150 ดังนั้นสิ่งที่จะกลับมาเป็นโมฆะ ไม่ได้จริงๆกลับอะไร 98 00:04:31,150 --> 00:04:32,200 99 00:04:32,200 --> 00:04:33,620 ดังนั้นสิ่งที่เป็นผลข้างเคียงหรือไม่ 100 00:04:33,620 --> 00:04:36,620 ดีผลข้างเคียงคือ สิ่งที่จัดเรียงของยังคงมีอยู่ 101 00:04:36,620 --> 00:04:39,500 หลังจากเสร็จสิ้นการทำงาน ที่ไม่ได้กลับมาเพียงแค่ 102 00:04:39,500 --> 00:04:41,340 และมันก็ไม่ได้เป็นเพียงปัจจัยการผลิตจาก 103 00:04:41,340 --> 00:04:44,970 >> ดังนั้นสำหรับตัวอย่างเช่นเราอาจจะ เปลี่ยนตัวแปรทั่วโลก 104 00:04:44,970 --> 00:04:46,590 ที่จะมีผลข้างเคียง 105 00:04:46,590 --> 00:04:49,000 ในกรณีนี้โดยเฉพาะอย่างยิ่ง ผลข้างเคียงที่สำคัญมาก 106 00:04:49,000 --> 00:04:51,070 เป็นพิมพ์ที่หน้าจอ 107 00:04:51,070 --> 00:04:53,110 เพื่อให้เป็นผลข้างเคียง ที่ PrintGrid มี 108 00:04:53,110 --> 00:04:54,980 เราพิมพ์สิ่งเหล่านี้ไปยังหน้าจอ 109 00:04:54,980 --> 00:04:56,370 และคุณสามารถคิด ที่เป็นผลข้างเคียง, 110 00:04:56,370 --> 00:04:58,690 นับว่าเป็นสิ่งที่ คงอยู่หลังจากที่ฟังก์ชั่นนี้จะสิ้นสุดลง 111 00:04:58,690 --> 00:05:01,481 นั่นคือสิ่งที่อยู่นอกขอบเขต ของฟังก์ชันนี้ว่าในท้ายที่สุด 112 00:05:01,481 --> 00:05:03,380 จะถูกเปลี่ยนแปลง เนื้อหาของหน้าจอ 113 00:05:03,380 --> 00:05:05,200 114 00:05:05,200 --> 00:05:05,839 >> คำถามที่เก้า 115 00:05:05,839 --> 00:05:07,880 พิจารณาโปรแกรมด้านล่าง ที่หมายเลขบรรทัด 116 00:05:07,880 --> 00:05:09,740 ได้ถูกเพิ่มสำหรับ ประโยชน์ของการสนทนา 117 00:05:09,740 --> 00:05:13,480 ดังนั้นในโปรแกรมนี้เราเป็นเพียง โทร GetString, เก็บไว้ 118 00:05:13,480 --> 00:05:16,220 ใน S ตัวแปรแล้ว พิมพ์ว่าตัวแปร S 119 00:05:16,220 --> 00:05:16,720 ตกลง 120 00:05:16,720 --> 00:05:19,090 เพื่ออธิบายว่าทำไมสายหนึ่งอยู่ 121 00:05:19,090 --> 00:05:20,920 CS50 #include จุดชั่วโมง 122 00:05:20,920 --> 00:05:23,820 เราไม่จำเป็นต้อง # include CS50 จุดชั่วโมงทำไม? 123 00:05:23,820 --> 00:05:26,180 ดีที่เรากำลังเรียกร้อง getString ฟังก์ชั่น 124 00:05:26,180 --> 00:05:28,840 และ GetString ถูกกำหนด ในห้องสมุด CS50 125 00:05:28,840 --> 00:05:31,600 ดังนั้นถ้าเราไม่ได้มี #include CS50 จุดชั่วโมง 126 00:05:31,600 --> 00:05:35,760 เราจะได้รับการประกาศโดยปริยายว่า ของข้อผิดพลาดการทำงานของ GetString 127 00:05:35,760 --> 00:05:36,840 จากคอมไพเลอร์ 128 00:05:36,840 --> 00:05:40,110 ดังนั้นเราจึงจำเป็นที่จะรวม library-- เราต้องรวมไฟล์ส่วนหัว 129 00:05:40,110 --> 00:05:42,870 หรืออื่น ๆ คอมไพเลอร์จะไม่ ยอมรับว่ามีอยู่ GetString 130 00:05:42,870 --> 00:05:44,380 131 00:05:44,380 --> 00:05:46,140 >> อธิบายว่าทำไมสายที่สองคือปัจจุบัน 132 00:05:46,140 --> 00:05:47,890 มาตรฐานดังนั้นจุดชั่วโมง io 133 00:05:47,890 --> 00:05:50,430 มันตรงเดียวกัน เป็นปัญหาที่เกิดขึ้นก่อนหน้านี้ 134 00:05:50,430 --> 00:05:53,310 ยกเว้นแทนของการจัดการกับ getString เรากำลังพูดเกี่ยวกับ printf 135 00:05:53,310 --> 00:05:56,654 ดังนั้นถ้าเราไม่ได้บอกว่าเราต้อง รวมถึงมาตรฐาน io จุดชั่วโมง 136 00:05:56,654 --> 00:05:58,820 แล้วเราจะไม่สามารถ ที่จะใช้ฟังก์ชั่น printf, 137 00:05:58,820 --> 00:06:00,653 เพราะคอมไพเลอร์ จะไม่ทราบเกี่ยวกับเรื่องนี้ 138 00:06:00,653 --> 00:06:01,750 139 00:06:01,750 --> 00:06:05,260 >> Why-- สิ่งที่สำคัญ ของโมฆะในสายสี่ 140 00:06:05,260 --> 00:06:08,010 ดังนั้นที่นี่เรามีหลัก int (void) 141 00:06:08,010 --> 00:06:10,600 ที่เพียงแค่บอกว่าเราว่า ไม่ได้รับบรรทัดคำสั่งใด ๆ 142 00:06:10,600 --> 00:06:12,280 ข้อโต้แย้งหลัก 143 00:06:12,280 --> 00:06:17,390 จำไว้ว่าเราจะพูด int หลัก int argc สตริงวงเล็บ argv 144 00:06:17,390 --> 00:06:20,400 ดังนั้นที่นี่เราก็บอกว่าเป็นโมฆะจะบอกว่าเรา ปฏิเสธอาร์กิวเมนต์บรรทัดคำสั่ง 145 00:06:20,400 --> 00:06:21,840 146 00:06:21,840 --> 00:06:25,225 >> อธิบายเกี่ยวกับหน่วยความจำว่า สิ่งที่ GetString ในสายหกผลตอบแทน 147 00:06:25,225 --> 00:06:27,040 148 00:06:27,040 --> 00:06:31,640 GetString จะกลับมาบล็อก หน่วยความจำอาร์เรย์ของตัวอักษร 149 00:06:31,640 --> 00:06:34,870 มันจริงๆกลับ ตัวชี้ไปยังตัวอักษรตัวแรก 150 00:06:34,870 --> 00:06:37,170 โปรดจำไว้ว่าสตริงเป็นดาวถ่าน 151 00:06:37,170 --> 00:06:41,360 ดังนั้นพวกเขาเป็นตัวชี้ไปครั้งแรก ตัวละครในสิ่งที่เป็นสตริง 152 00:06:41,360 --> 00:06:43,510 ที่ผู้ใช้ป้อนที่แป้นพิมพ์ 153 00:06:43,510 --> 00:06:47,070 และหน่วยความจำที่เกิดขึ้นจะ malloced, เพื่อให้หน่วยความจำที่อยู่ในกอง 154 00:06:47,070 --> 00:06:49,080 155 00:06:49,080 --> 00:06:50,450 >> คำถามที่ 13 156 00:06:50,450 --> 00:06:51,960 พิจารณาโปรแกรมด้านล่าง 157 00:06:51,960 --> 00:06:55,579 ดังนั้นสิ่งที่โปรแกรมนี้จะทำ เป็น printf ไอเอ็นจี 1 หารด้วย 10 158 00:06:55,579 --> 00:06:57,370 ดังนั้นเมื่อรวบรวมและ ดำเนินการโครงการนี​​้ 159 00:06:57,370 --> 00:07:01,170 เอาท์พุท 0.0 แม้ว่า 1 หารด้วย 10 เป็น 0.1 160 00:07:01,170 --> 00:07:02,970 ดังนั้นทำไมมัน 0.0 คืออะไร? 161 00:07:02,970 --> 00:07:05,510 ดีนี้เป็นเพราะ ส่วนจำนวนเต็ม 162 00:07:05,510 --> 00:07:08,580 ดังนั้น 1 เป็นจำนวนเต็ม, 10 เป็นจำนวนเต็ม 163 00:07:08,580 --> 00:07:11,980 ดังนั้น 1 หารด้วย 10 ทุกอย่าง จะถือว่าเป็นจำนวนเต็ม 164 00:07:11,980 --> 00:07:16,380 และใน C, เมื่อเราทำส่วนจำนวนเต็ม เราตัดทศนิยม 165 00:07:16,380 --> 00:07:19,590 ดังนั้น 1 หารด้วย 10 คือ 0 แล้วเรากำลังพยายาม 166 00:07:19,590 --> 00:07:24,410 ในการพิมพ์ที่เป็นลอยดังนั้น ศูนย์พิมพ์เป็นลอยเป็น 0.0 167 00:07:24,410 --> 00:07:27,400 และนั่นเป็นเหตุผลที่เราได้รับ 0.0 168 00:07:27,400 --> 00:07:28,940 >> พิจารณาโปรแกรมด้านล่าง 169 00:07:28,940 --> 00:07:31,280 ตอนนี้เรากำลังพิมพ์ 0.1 170 00:07:31,280 --> 00:07:34,280 จึงไม่มีการแบ่งจำนวนเต็ม เราเพียงแค่พิมพ์ 0.1, 171 00:07:34,280 --> 00:07:37,100 แต่เรากำลังพิมพ์ ถึง 28 ตำแหน่งทศนิยม 172 00:07:37,100 --> 00:07:41,810 และเราได้รับนี้ 0.1000, ทั้งกลุ่ม ของศูนย์, 5 5 5, blah blah blah 173 00:07:41,810 --> 00:07:45,495 ดังนั้นคำถามที่นี่คือเหตุผลที่ไม่ได้ พิมพ์ว่าแทนที่จะว่า 0.1? 174 00:07:45,495 --> 00:07:46,620 175 00:07:46,620 --> 00:07:49,640 >> ดังนั้นเหตุผลที่นี่คือตอนนี้ ลอยไม่แน่ชัดจุด 176 00:07:49,640 --> 00:07:53,410 โปรดจำไว้ว่าลอยเป็นเพียง 32 บิต 177 00:07:53,410 --> 00:07:57,540 ดังนั้นเราสามารถเป็นตัวแทนของจำนวน จำกัด ลอยค่าจุดกับผู้ที่ 32 178 00:07:57,540 --> 00:07:58,560 เกร็ด 179 00:07:58,560 --> 00:08:01,760 ดีที่สุดมีเพียบ ลอยตัวค่าหลายจุด 180 00:08:01,760 --> 00:08:04,940 และมีมากมายหลายแบบลอยตัว ค่าจุดในระหว่าง 0 และ 1, 181 00:08:04,940 --> 00:08:07,860 และเราสามารถที่จะเห็นได้ชัด แสดงค่ามากขึ้นกว่าที่ 182 00:08:07,860 --> 00:08:13,230 ดังนั้นเราจะต้องเสียสละเพื่อ จะสามารถที่จะแสดงค่ามากที่สุด 183 00:08:13,230 --> 00:08:16,960 >> ดังนั้นค่าเช่น 0.1 เห็นได้ชัด เราไม่สามารถเป็นตัวแทนที่ว่า 184 00:08:16,960 --> 00:08:22,500 ดังนั้นแทนที่จะเป็น 0.1 ที่เราทำ ดีที่สุดที่เราสามารถเป็นตัวแทนนี้ 0.100000 5 5 185 00:08:22,500 --> 00:08:23,260 5 186 00:08:23,260 --> 00:08:26,306 และที่ใกล้สวย แต่ สำหรับจำนวนมากของการใช้งาน 187 00:08:26,306 --> 00:08:28,430 คุณต้องกังวลเกี่ยวกับ ลอยไม่แน่ชัดจุด 188 00:08:28,430 --> 00:08:30,930 เพราะเราก็ไม่สามารถเป็นตัวแทนของ จุดที่ลอยอยู่ทั้งหมดว่า 189 00:08:30,930 --> 00:08:32,500 190 00:08:32,500 --> 00:08:33,380 >> คำถามที่ 15 191 00:08:33,380 --> 00:08:34,679 พิจารณาโค้ดด้านล่าง 192 00:08:34,679 --> 00:08:36,630 เราแค่พิมพ์ 1 บวก 1 193 00:08:36,630 --> 00:08:38,289 ดังนั้นจึงไม่มีเคล็ดลับที่นี่ 194 00:08:38,289 --> 00:08:41,780 1 บวก 1 ประเมินที่ 2 และ แล้วเราพิมพ์ว่า 195 00:08:41,780 --> 00:08:42,789 เพียงแค่นี้ก็พิมพ์ 2 196 00:08:42,789 --> 00:08:43,850 197 00:08:43,850 --> 00:08:44,700 >> คำถามที่ 16 198 00:08:44,700 --> 00:08:49,450 ตอนนี้เรากำลังพิมพ์ตัวอักษร 1 บวก 1 ตัว 199 00:08:49,450 --> 00:08:52,110 ดังนั้นทำไมทำอย่างนี้ไม่ได้ พิมพ์สิ่งเดียวกัน 200 00:08:52,110 --> 00:08:57,680 ดีตัวละคร 1 บวกตัวละคร 1 ตัวละครที่ 1 มีค่า ASCII 49 201 00:08:57,680 --> 00:09:04,840 ดังนั้นนี้จริงๆบอกว่า 49 บวก 49, และ ในท้ายที่สุดนี้จะพิมพ์ 98 202 00:09:04,840 --> 00:09:06,130 ดังนั้นนี้ไม่ได้พิมพ์ 2 203 00:09:06,130 --> 00:09:08,070 204 00:09:08,070 --> 00:09:09,271 >> คำถามที่ 17 205 00:09:09,271 --> 00:09:11,520 เสร็จสิ้นการดำเนินการ ของแปลกด้านล่างในลักษณะดังกล่าว 206 00:09:11,520 --> 00:09:14,615 ที่ฟังก์ชันจะส่งกลับจริงถ้า n เป็นเลขคี่และเท็จถ้า n คือแม้ 207 00:09:14,615 --> 00:09:16,710 208 00:09:16,710 --> 00:09:19,330 นี่คือจุดประสงค์ที่ดี สำหรับผู้ประกอบการสมัย 209 00:09:19,330 --> 00:09:24,530 ดังนั้นเราจึงใช้เวลา n โต้แย้งของเรา ถ้าสมัย n 2 เท่ากับ 1 ดี 210 00:09:24,530 --> 00:09:28,030 นั่นหมายความว่า n แบ่ง โดยมี 2 ส่วนที่เหลือ 211 00:09:28,030 --> 00:09:33,270 ถ้า n หารด้วย 2 มีส่วนที่เหลือที่ หมายความว่า n เป็นเลขคี่ดังนั้นเราจึงกลับจริง 212 00:09:33,270 --> 00:09:34,910 อื่นที่เรากลับเท็จ 213 00:09:34,910 --> 00:09:39,070 นอกจากนี้คุณยังสามารถทำได้ n mod 2 เท่ากับ ศูนย์กลับเท็จอื่นกลับจริง 214 00:09:39,070 --> 00:09:41,600 215 00:09:41,600 --> 00:09:43,640 >> พิจารณาฟังก์ชัน recursive ด้านล่าง 216 00:09:43,640 --> 00:09:46,920 ดังนั้นถ้า n เป็นน้อยกว่าหรือ เท่ากับ 1 กลับ 1 217 00:09:46,920 --> 00:09:50,430 อื่นกลับมาครั้ง n f ของ n ลบ 1 218 00:09:50,430 --> 00:09:52,556 ดังนั้นสิ่งที่เป็นฟังก์ชั่นนี้หรือไม่? 219 00:09:52,556 --> 00:09:54,305 ดีนี้เป็นเพียงแค่ ฟังก์ชั่นแฟกทอ 220 00:09:54,305 --> 00:09:55,410 221 00:09:55,410 --> 00:09:57,405 นี้จะแสดงเป็นอย่างดี n เป็นปัจจัย 222 00:09:57,405 --> 00:09:58,720 223 00:09:58,720 --> 00:10:02,310 >> ดังนั้นคำถาม 19 ตอนนี้เราต้องการที่จะ ใช้ฟังก์ชัน recursive นี้ 224 00:10:02,310 --> 00:10:04,530 เราต้องการที่จะให้มันซ้ำแล้วซ้ำอีก 225 00:10:04,530 --> 00:10:05,874 ดังนั้นเราจะทำอย่างไรที่? 226 00:10:05,874 --> 00:10:07,790 ดีสำหรับพนักงาน การแก้ปัญหาและอีกครั้งมี 227 00:10:07,790 --> 00:10:11,090 หลายวิธีที่คุณสามารถทำได้ ที่เราเริ่มต้นกับผลิตภัณฑ์ int นี้ 228 00:10:11,090 --> 00:10:11,812 เท่ากับ 1 229 00:10:11,812 --> 00:10:13,520 และตลอดนี้ สำหรับวงเราจะ 230 00:10:13,520 --> 00:10:17,590 ที่จะคูณผลิตภัณฑ์เพื่อในที่สุด จบลงด้วยปัจจัยแบบเต็ม 231 00:10:17,590 --> 00:10:21,870 ดังนั้นสำหรับฉัน int เท่ากับ 2 ฉันเป็น น้อยกว่าหรือเท่ากับ n, i ++ 232 00:10:21,870 --> 00:10:24,130 >> คุณอาจจะสงสัยว่าทำไมฉันเท่ากับ 2 233 00:10:24,130 --> 00:10:28,380 ดีจำไว้ว่าที่นี่เรามีให้ ให้แน่ใจว่ากรณีฐานของเราถูกต้อง 234 00:10:28,380 --> 00:10:32,180 ดังนั้นถ้า n มีค่าน้อยกว่าหรือเท่ากับ 1, เรากำลังกลับมา 1 235 00:10:32,180 --> 00:10:34,830 ดังนั้นกว่าที่นี่เราเริ่มต้นที่ฉันเท่ากับ 2 236 00:10:34,830 --> 00:10:39,090 ดีถ้าฉันเป็น 1 แล้วยกกำลังหรือ ถ้า n เป็น 1 แล้วสำหรับวง 237 00:10:39,090 --> 00:10:40,600 จะไม่ดำเนินการในทุก 238 00:10:40,600 --> 00:10:43,190 และเพื่อให้เราจะเพียงแค่ ผลิตภัณฑ์กลับมาซึ่งเป็น 1 239 00:10:43,190 --> 00:10:45,920 ในทำนองเดียวกันถ้า n เป็น อะไรที่น้อยกว่า 1-- 240 00:10:45,920 --> 00:10:49,290 ถ้าเป็น 0, ลบ 1, อะไรก็ตาม เราจะยังคงได้รับกลับมาที่ 1 241 00:10:49,290 --> 00:10:52,260 ซึ่งเป็นสิ่งที่ รุ่น recursive จะทำ 242 00:10:52,260 --> 00:10:54,660 >> ตอนนี้ถ้า n เป็นมากขึ้น กว่า 1 แล้วเราจะ 243 00:10:54,660 --> 00:10:56,550 ที่จะทำอย่างน้อยหนึ่ง ทวนของวงนี้ 244 00:10:56,550 --> 00:11:00,630 ดังนั้นสมมติว่า n คือ 5 แล้วเรา จะทำผลิตภัณฑ์ครั้งเท่ากับ 2 245 00:11:00,630 --> 00:11:02,165 ดังนั้นตอนนี้ผลิตภัณฑ์ที่ 2 246 00:11:02,165 --> 00:11:04,040 ตอนนี้เรากำลังจะทำ ครั้งผลิตภัณฑ์เท่ากับ 3 247 00:11:04,040 --> 00:11:04,690 ตอนนี้ก็ 6 248 00:11:04,690 --> 00:11:07,500 สินค้าเท่ากับครั้งที่ 4 ตอนนี้ก็ 24 249 00:11:07,500 --> 00:11:10,420 สินค้าเท่ากับครั้งที่ 5 ตอนนี้ก็ 120 250 00:11:10,420 --> 00:11:16,730 ดังนั้นแล้วในที่สุดเราก็กลับมา 120 ซึ่งเป็นปัจจัย 5 อย่างถูกต้อง 251 00:11:16,730 --> 00:11:17,510 >> คำถามที่ 20 252 00:11:17,510 --> 00:11:22,480 นี้เป็นหนึ่งในสถานที่ที่คุณต้องกรอกข้อมูล ในตารางด้วยวิธีใดก็ตามนี้ 253 00:11:22,480 --> 00:11:25,735 สิ่งที่เราได้เห็นว่า เหมาะกับการทำงานขั้นตอนเหล่านี้ 254 00:11:25,735 --> 00:11:28,060 ครั้งนี้ครั้งการทำงานเชิง 255 00:11:28,060 --> 00:11:33,270 เพื่อให้เป็นอัลกอริทึมสิ่งที่ เป็นโอเมก้า 1 แต่ O ใหญ่ของ n? 256 00:11:33,270 --> 00:11:35,970 ดังนั้นอาจจะมีเพียบ คำตอบมากมายที่นี่ 257 00:11:35,970 --> 00:11:39,790 หนึ่งที่เราอาจจะได้เห็นมากที่สุด บ่อยครั้งที่เป็นเพียงการค้นหาเชิงเส้น 258 00:11:39,790 --> 00:11:42,050 >> ดังนั้นในกรณีที่ดีที่สุด สถานการณ์สินค้าเรา 259 00:11:42,050 --> 00:11:44,050 มองหาอยู่ที่ จุดเริ่มต้นของรายการ 260 00:11:44,050 --> 00:11:47,400 และในโอเมก้า 1 ขั้นตอน สิ่งแรกที่เราตรวจสอบ 261 00:11:47,400 --> 00:11:49,740 เราก็กลับมาทันที ที่เราพบรายการ 262 00:11:49,740 --> 00:11:52,189 ในสถานการณ์กรณีที่เลวร้ายที่สุด รายการที่อยู่ในท้ายที่สุด 263 00:11:52,189 --> 00:11:53,730 หรือรายการไม่ได้อยู่ในรายชื่อที่ทั้งหมด 264 00:11:53,730 --> 00:11:56,700 ดังนั้นเราจึงต้องค้นหา รายการทั้งหมดทั้งหมด n 265 00:11:56,700 --> 00:11:58,480 องค์ประกอบและที่ว่าทำไมมัน o ของ n 266 00:11:58,480 --> 00:11:59,670 267 00:11:59,670 --> 00:12:04,880 >> ดังนั้นตอนนี้มันเป็นสิ่งที่ทั้ง โอเมก้าของบันทึก n n และ O ใหญ่ของ n บันทึก n 268 00:12:04,880 --> 00:12:08,650 ดีสิ่งที่เกี่ยวข้องมากที่สุด เราได้เห็นที่นี่เป็นที่รวมการจัดเรียง 269 00:12:08,650 --> 00:12:12,950 ดังนั้นรวมการจัดเรียงจำ เป็นที่สุดที 270 00:12:12,950 --> 00:12:16,920 ของ n บันทึก n โดยที่ทีถูกกำหนดไว้ ถ้าทั้งสองโอเมก้าและโอใหญ่จะเหมือนกัน 271 00:12:16,920 --> 00:12:17,580 ทั้ง n log n 272 00:12:17,580 --> 00:12:18,690 273 00:12:18,690 --> 00:12:21,970 >> อะไรคือสิ่งที่โอเมก้า ของ n และ n O ของตาราง? 274 00:12:21,970 --> 00:12:23,990 ดีอีกครั้งมี คำตอบที่เป็นไปได้หลาย 275 00:12:23,990 --> 00:12:26,440 ที่นี่เราเกิดขึ้นที่จะบอกว่าการจัดเรียงฟอง 276 00:12:26,440 --> 00:12:28,840 จัดเรียงแทรกก็จะทำงานที่นี่ 277 00:12:28,840 --> 00:12:31,400 โปรดจำไว้ว่าการจัดเรียงฟองที่ มีการเพิ่มประสิทธิภาพที่ที่ 278 00:12:31,400 --> 00:12:34,630 ถ้าคุณมีความสามารถที่จะได้รับ ผ่านรายการทั้งหมด 279 00:12:34,630 --> 00:12:37,402 โดยไม่จำเป็นต้องทำ การแลกเปลี่ยนใด ๆ แล้วดี 280 00:12:37,402 --> 00:12:40,110 เราสามารถกลับทันทีว่า รายชื่อที่ถูกแยกจะเริ่มต้นด้วย 281 00:12:40,110 --> 00:12:43,185 ดังนั้นในสถานการณ์กรณีที่ดีที่สุด มันเป็นเพียงแค่โอเมก้าของ n 282 00:12:43,185 --> 00:12:45,960 ถ้ามันไม่ได้เป็นเพียงอย่าง รายการที่จัดเรียงจะเริ่มต้นด้วย 283 00:12:45,960 --> 00:12:48,270 แล้วเรามี O ของ n ยกกำลังแลกเปลี่ยน 284 00:12:48,270 --> 00:12:49,330 285 00:12:49,330 --> 00:12:55,610 และในที่สุดเรามีการจัดเรียงตัวเลือก สำหรับ n ยกกำลังทั้งโอเมก้าและขนาดใหญ่ทุม 286 00:12:55,610 --> 00:12:56,850 >> คำถามที่ 21 287 00:12:56,850 --> 00:12:58,870 อะไรจำนวนเต็มล้น? 288 00:12:58,870 --> 00:13:02,160 ดีอีกครั้งเช่นเดียวกับก่อนหน้านี้ เรามีเพียงบิตหลายขีด 289 00:13:02,160 --> 00:13:04,255 เพื่อเป็นตัวแทนของจำนวนเต็ม ดังนั้นอาจ 32 บิต 290 00:13:04,255 --> 00:13:06,300 291 00:13:06,300 --> 00:13:09,180 สมมติว่าเรามีจำนวนเต็มลงนาม 292 00:13:09,180 --> 00:13:12,800 สูงสุดแล้วในท้ายที่สุด จำนวนบวกที่เราสามารถเป็นตัวแทนของ 293 00:13:12,800 --> 00:13:15,910 2 ถึง 31 ลบ 1 294 00:13:15,910 --> 00:13:19,370 ดังนั้นสิ่งที่เกิดขึ้นถ้าเราพยายามที่จะ แล้วเพิ่มจำนวนเต็มที่? 295 00:13:19,370 --> 00:13:25,320 ดีเรากำลังจะไปตั้งแต่วันที่ 2 ถึงวันที่ 31 ลบ 1 ตลอดทางลงไปลบ 2 296 00:13:25,320 --> 00:13:26,490 ถึงวันที่ 31 297 00:13:26,490 --> 00:13:29,470 ดังนั้นล้นจำนวนเต็มนี้ เมื่อคุณให้การเพิ่ม, 298 00:13:29,470 --> 00:13:32,330 และในที่สุดคุณไม่สามารถ รับการใด ๆ ที่สูงขึ้นและมันก็ 299 00:13:32,330 --> 00:13:34,520 wraps ตลอดทางกลับ ไปรอบ ๆ เพื่อเป็นค่าลบ 300 00:13:34,520 --> 00:13:35,850 301 00:13:35,850 --> 00:13:37,779 >> สิ่งที่เกี่ยวกับหน่วยความจำล้น? 302 00:13:37,779 --> 00:13:39,820 ดังนั้นบัฟเฟอร์ overflow-- จำสิ่งที่เป็นบัฟเฟอร์ 303 00:13:39,820 --> 00:13:41,000 มันเป็นเพียงก้อนของหน่วยความจำ 304 00:13:41,000 --> 00:13:43,350 สิ่งที่ต้องการอาร์เรย์เป็นบัฟเฟอร์ 305 00:13:43,350 --> 00:13:46,120 ดังนั้นหน่วยความจำล้นคือเมื่อ คุณพยายามที่จะเข้าถึงหน่วยความจำ 306 00:13:46,120 --> 00:13:47,880 เกินปลายแถวที่ 307 00:13:47,880 --> 00:13:50,410 ดังนั้นถ้าคุณมี อาร์เรย์ของขนาด 5 และคุณ 308 00:13:50,410 --> 00:13:53,700 พยายามเข้าถึงวงเล็บอาร์เรย์ 5 หรือ 6 หรือวงเล็บวงเล็บ 7 309 00:13:53,700 --> 00:13:56,610 หรืออะไรที่เกิน ปลายหรือแม้แต่อะไร 310 00:13:56,610 --> 00:14:00,790 วงเล็บอาร์เรย์ below-- ลบ 1-- ทั้งหมดของผู้ที่มีหน่วยความจำล้น 311 00:14:00,790 --> 00:14:02,810 คุณสัมผัสความทรงจำในรูปแบบที่เลวร้าย 312 00:14:02,810 --> 00:14:04,090 313 00:14:04,090 --> 00:14:04,730 >> คำถามที่ 23 314 00:14:04,730 --> 00:14:05,760 315 00:14:05,760 --> 00:14:09,100 ดังนั้นในหนึ่งที่คุณต้องนี้ ที่จะใช้ strlen 316 00:14:09,100 --> 00:14:11,630 และเราบอกคุณว่าคุณสามารถ สมมติ S จะไม่เป็นโมฆะ 317 00:14:11,630 --> 00:14:13,790 ดังนั้นคุณจึงไม่ต้อง จะตรวจสอบสำหรับ null ใด ๆ 318 00:14:13,790 --> 00:14:16,190 และมีหลายวิธี คุณอาจจะได้ทำอย่างนี้ 319 00:14:16,190 --> 00:14:18,440 ที่นี่เราเพียงแค่ใช้ตรงไปตรงมา 320 00:14:18,440 --> 00:14:21,780 เราเริ่มต้นด้วยเคาน์เตอร์, n n คือ การนับจำนวนตัวอักษรที่มี 321 00:14:21,780 --> 00:14:25,560 ดังนั้นเราจึงเริ่มต้นที่ 0 แล้วเรา ย้ำผ่านรายการทั้งหมด 322 00:14:25,560 --> 00:14:29,092 >> เป็น S วงเล็บเท่ากับ 0 ตัวละครที่เทอร์มิ null? 323 00:14:29,092 --> 00:14:31,425 จำได้ว่าเรากำลังมองหา ตัวละครที่เทอร์มิ null 324 00:14:31,425 --> 00:14:33,360 เพื่อกำหนดระยะเวลาสตริงของเรา 325 00:14:33,360 --> 00:14:35,890 ที่จะยุติ สตริงที่เกี่ยวข้องใด ๆ 326 00:14:35,890 --> 00:14:39,400 เพื่อให้เป็น S วงเล็บเท่ากับ 0 ที่เทอร์มิ null? 327 00:14:39,400 --> 00:14:42,850 ถ้ามันไม่ได้แล้วเราจะ มองไปที่ S วงเล็บ 1, s ขายึด 2 328 00:14:42,850 --> 00:14:45,050 เราให้ไปจนกว่าเรา หาเทอร์มิ null 329 00:14:45,050 --> 00:14:48,580 เมื่อเราได้พบมันแล้ว n มี ความยาวรวมของสตริง 330 00:14:48,580 --> 00:14:49,942 และเราก็สามารถกลับมาว่า 331 00:14:49,942 --> 00:14:51,180 332 00:14:51,180 --> 00:14:51,865 >> คำถามที่ 24 333 00:14:51,865 --> 00:14:53,010 334 00:14:53,010 --> 00:14:56,050 ดังนั้นนี้เป็นหนึ่งในสถานที่ที่คุณ ต้องทำให้การค้าออก 335 00:14:56,050 --> 00:14:59,810 ดังนั้นสิ่งหนึ่งที่เป็นสิ่งที่ดีในหนึ่ง วิธีการ แต่ในสิ่งที่มันไม่ดี? 336 00:14:59,810 --> 00:15:02,980 ดังนั้นที่นี่รวมมีแนวโน้มที่จะจัดเรียง จะเร็วกว่าการจัดเรียงฟอง 337 00:15:02,980 --> 00:15:06,530 ต้องบอก that-- ดีมี เป็นคำตอบหลาย ๆ ที่นี่ 338 00:15:06,530 --> 00:15:12,930 แต่อย่างใดอย่างหนึ่งที่สำคัญคือการจัดเรียงฟองที่ เป็นโอเมก้าของ n สำหรับรายการที่เรียงลำดับ 339 00:15:12,930 --> 00:15:14,950 >> โปรดจำไว้ว่าตารางเราเพิ่งเห็นก่อนหน้านี้ว่า 340 00:15:14,950 --> 00:15:17,600 ดังนั้นฟองเรียงลำดับของโอเมก้า n, สถานการณ์กรณีที่ดีที่สุด 341 00:15:17,600 --> 00:15:20,010 คือมันสามารถที่จะเพียงแค่ไปกว่า รายการครั้งเดียวตรวจสอบ 342 00:15:20,010 --> 00:15:22,270 เดี๋ยวก่อนสิ่งนี้มีอยู่แล้ว เรียงลำดับและการกลับมา 343 00:15:22,270 --> 00:15:25,960 ผสานเรียงลำดับไม่ว่าสิ่งที่ คุณทำคือโอเมก้าของ n บันทึก n 344 00:15:25,960 --> 00:15:29,200 ดังนั้นสำหรับรายการที่เรียงลำดับฟอง การจัดเรียงเป็นไปได้เร็วขึ้น 345 00:15:29,200 --> 00:15:30,870 346 00:15:30,870 --> 00:15:32,430 >> ตอนนี้สิ่งที่เกี่ยวกับรายการเชื่อมโยง? 347 00:15:32,430 --> 00:15:36,070 ดังนั้นรายการที่เชื่อมโยงสามารถขยายและหดตัว เพื่อให้เหมาะสมกับหลาย ๆ องค์ประกอบที่จำเป็น 348 00:15:36,070 --> 00:15:38,489 ต้องบอก that-- ดังนั้น มักจะเปรียบเทียบโดยตรง 349 00:15:38,489 --> 00:15:40,280 เป็นไปได้ที่เชื่อมโยง รายการที่มีอาร์เรย์ 350 00:15:40,280 --> 00:15:41,600 351 00:15:41,600 --> 00:15:44,050 ดังนั้นแม้ว่าอาร์เรย์สามารถ สามารถเติบโตและหดตัว 352 00:15:44,050 --> 00:15:47,130 เพื่อให้เหมาะสมกับหลายองค์ประกอบ ตามความจำเป็นรายการที่เชื่อมโยง 353 00:15:47,130 --> 00:15:49,600 เมื่อเทียบกับ array-- อาร์เรย์มีการเข้าถึงแบบสุ่ม 354 00:15:49,600 --> 00:15:52,960 เราสามารถจัดทำดัชนีในการใด ๆ โดยเฉพาะอย่างยิ่งองค์ประกอบของอาร์เรย์ 355 00:15:52,960 --> 00:15:56,430 >> ดังนั้นสำหรับรายการที่เชื่อมโยงเราไม่สามารถ เพียงไปที่องค์ประกอบที่ห้า 356 00:15:56,430 --> 00:16:00,260 เรามีการสำรวจจากจุดเริ่มต้น จนกว่าเราจะได้รับไปยังองค์ประกอบที่ห้า 357 00:16:00,260 --> 00:16:03,990 และที่จะป้องกันไม่ให้เรา ทำสิ่งที่ต้องการค้นหาแบบไบนารี 358 00:16:03,990 --> 00:16:08,150 การพูดของการค้นหาแบบไบนารีค้นหาแบบไบนารี มีแนวโน้มที่จะได้เร็วขึ้นกว่าการค้นหาเชิงเส้น 359 00:16:08,150 --> 00:16:11,120 ต้องบอก that-- ดังนั้นสิ่งที่เป็นไปได้อย่างใดอย่างหนึ่ง 360 00:16:11,120 --> 00:16:13,380 คือการที่คุณไม่สามารถทำไบนารี ค้นหาในรายการที่เชื่อมโยง 361 00:16:13,380 --> 00:16:14,730 คุณจะสามารถทำมันได้ในอาร์เรย์ 362 00:16:14,730 --> 00:16:18,030 แต่อาจจะสำคัญกว่า คุณจะไม่สามารถดำเนินการค้นหาไบนารี 363 00:16:18,030 --> 00:16:20,690 ในอาร์เรย์ที่ไม่ได้แยก 364 00:16:20,690 --> 00:16:23,990 ล่วงหน้าที่คุณอาจจำเป็นต้องเรียงลำดับ อาร์เรย์และเพียงแล้วสามารถ 365 00:16:23,990 --> 00:16:25,370 คุณค้นหาไบนารี 366 00:16:25,370 --> 00:16:27,660 ดังนั้นหากสิ่งที่คุณไม่ได้ เรียงลำดับเริ่มต้นด้วย 367 00:16:27,660 --> 00:16:29,250 แล้วการค้นหาเชิงเส้นอาจจะได้เร็วขึ้น 368 00:16:29,250 --> 00:16:30,620 369 00:16:30,620 --> 00:16:31,740 >> คำถามที่ 27 370 00:16:31,740 --> 00:16:34,770 เพื่อพิจารณาโปรแกรมด้านล่าง ซึ่งจะอยู่ในภาพนิ่งถัดไป 371 00:16:34,770 --> 00:16:37,790 และนี่คือหนึ่งที่เรากำลัง จะต้องการที่จะระบุอย่างชัดเจน 372 00:16:37,790 --> 00:16:39,980 ค่าตัวแปรต่างๆ 373 00:16:39,980 --> 00:16:41,990 ดังนั้นให้ดูที่ว่า 374 00:16:41,990 --> 00:16:43,160 >> ดังนั้นสายหนึ่ง 375 00:16:43,160 --> 00:16:45,457 เรามี int x เท่ากับ 1 376 00:16:45,457 --> 00:16:47,040 นั่นเป็นสิ่งเดียวที่เกิดขึ้น 377 00:16:47,040 --> 00:16:50,440 ดังนั้นที่เส้นหนึ่งที่เราเห็นในของเรา โต๊ะและที่ A, B, และ tmp ทั้งหมด 378 00:16:50,440 --> 00:16:51,540 สลบไป 379 00:16:51,540 --> 00:16:52,280 ดังนั้นสิ่งที่เป็น X? 380 00:16:52,280 --> 00:16:53,860 ดีที่เราเพียงแค่ตั้งค่าเท่ากับ 1 381 00:16:53,860 --> 00:16:55,020 382 00:16:55,020 --> 00:16:58,770 แล้วแถวสองได้ดี เราจะเห็นว่าและมีการตั้งค่าที่ 2, 383 00:16:58,770 --> 00:17:00,550 และโต๊ะที่มีอยู่แล้ว เต็มไปสำหรับเรา 384 00:17:00,550 --> 00:17:03,040 ดังนั้น x 1 และ y คือ 2 385 00:17:03,040 --> 00:17:05,890 >> ตอนนี้สายสามเราตอนนี้ ภายในฟังก์ชันแลกเปลี่ยน 386 00:17:05,890 --> 00:17:07,560 สิ่งที่เราผ่านการแลกเปลี่ยน? 387 00:17:07,560 --> 00:17:11,609 เราผ่านเครื่องหมาย x สำหรับ และเครื่องหมายและสำหรับ B 388 00:17:11,609 --> 00:17:15,160 ที่มีปัญหาก่อนหน้านี้ ระบุว่าที่อยู่ของ x 389 00:17:15,160 --> 00:17:17,520 เป็น 0x10 และที่อยู่ของ y เป็น 0x14 390 00:17:17,520 --> 00:17:18,970 391 00:17:18,970 --> 00:17:21,909 ดังนั้น A และ B จะเท่ากับ 0x10 และ 0x14 ตามลำดับ 392 00:17:21,909 --> 00:17:23,670 393 00:17:23,670 --> 00:17:26,250 >> ตอนนี้ที่เส้นสามสิ่งที่ x และ y คืออะไร? 394 00:17:26,250 --> 00:17:28,554 ดีไม่มีอะไรที่มีการเปลี่ยนแปลง เกี่ยวกับ x และ y ที่จุดนี้ 395 00:17:28,554 --> 00:17:30,470 แม้ว่าพวกเขากำลัง ภายในกรอบกองหลัก 396 00:17:30,470 --> 00:17:32,469 พวกเขายังคงมีเหมือนเดิม ค่าพวกเขาก่อน 397 00:17:32,469 --> 00:17:34,030 เรายังไม่ได้ปรับเปลี่ยนหน่วยความจำใด ๆ 398 00:17:34,030 --> 00:17:35,710 ดังนั้น x 1, y คือ 2 399 00:17:35,710 --> 00:17:36,550 400 00:17:36,550 --> 00:17:37,050 สิทธิ์ทั้งหมด 401 00:17:37,050 --> 00:17:40,300 ดังนั้นตอนนี้เรากล่าวว่า int tmp เท่ากับดาว 402 00:17:40,300 --> 00:17:44,410 ดังนั้นที่เส้นสี่ทุกอย่าง จะเหมือนกันยกเว้นสำหรับ tmp 403 00:17:44,410 --> 00:17:47,130 เรายังไม่ได้เปลี่ยนค่าใด ๆ อะไรยกเว้น tmp 404 00:17:47,130 --> 00:17:49,230 เรามีการตั้งค่า tmp เท่ากับดาว 405 00:17:49,230 --> 00:17:50,620 ดาวคืออะไร? 406 00:17:50,620 --> 00:17:56,240 ดีจุดกับ x ดังนั้นดาว เป็นไป x เท่ากันซึ่งเป็น 1 407 00:17:56,240 --> 00:18:00,080 เพื่อให้ทุกอย่างจะถูกคัดลอก ลงและ tmp ตั้งค่าเป็น 1 408 00:18:00,080 --> 00:18:01,110 >> ตอนนี้บรรทัดถัดไป 409 00:18:01,110 --> 00:18:03,380 ดาวเท่ากับดาวข 410 00:18:03,380 --> 00:18:10,000 ดังนั้นโดยสาย five-- ดีอีกครั้งทุกอย่าง จะเหมือนกันยกเว้นสิ่งที่เป็นดาว 411 00:18:10,000 --> 00:18:10,830 ดาวคืออะไร? 412 00:18:10,830 --> 00:18:13,720 ดีเราก็บอกว่าดาวคือ x 413 00:18:13,720 --> 00:18:16,400 ดังนั้นเรากำลังจะเปลี่ยน x เพื่อดาวขเท่ากัน 414 00:18:16,400 --> 00:18:18,960 ดาวขคืออะไร? และ จุด B ไปและ 415 00:18:18,960 --> 00:18:21,030 ดังนั้นดาว B คือ y 416 00:18:21,030 --> 00:18:25,140 ดังนั้นเราตั้งค่า x เท่ากับ y, และทุกอย่างอื่นเหมือนกัน 417 00:18:25,140 --> 00:18:29,130 ดังนั้นเราจะเห็นในแถวถัดไปที่ X คือตอนนี้ 2 และส่วนที่เหลือจะถูกคัดลอกเพียงลง 418 00:18:29,130 --> 00:18:31,120 >> ขณะนี้อยู่ในบรรทัดถัดไปดาวขเท่ากับ tmp 419 00:18:31,120 --> 00:18:34,740 ดีเราก็บอกว่าดาว B คือ y, ดังนั้นเราตั้งค่าและเท่ากับ tmp 420 00:18:34,740 --> 00:18:37,450 ทุกสิ่งทุกอย่างเป็นเดียวกัน เพื่อให้ทุกอย่างได้รับการคัดลอกลง 421 00:18:37,450 --> 00:18:42,050 เรากำลังตั้งค่าและเท่ากับ tmp ซึ่งเป็น หนึ่งและทุกอย่างอื่นเหมือนกัน 422 00:18:42,050 --> 00:18:43,210 >> ตอนนี้ในที่สุดสายเจ็ด 423 00:18:43,210 --> 00:18:44,700 เรากลับมาอยู่ในหน้าที่หลัก 424 00:18:44,700 --> 00:18:46,350 หลังจากที่เราเสร็จสิ้นการแลกเปลี่ยน 425 00:18:46,350 --> 00:18:48,972 เราได้สูญเสีย A, B, และ tmp แต่ในท้ายที่สุดเรา 426 00:18:48,972 --> 00:18:51,180 จะไม่เปลี่ยนแปลงค่าใด ๆ อะไรที่จุดนี้ 427 00:18:51,180 --> 00:18:52,800 เราเพียงแค่คัดลอก x และ y ลง 428 00:18:52,800 --> 00:18:56,490 และเราเห็นว่า x และ y เป็น ตอนที่ 2 และ 1 แทน 1 และ 2 429 00:18:56,490 --> 00:18:58,160 แลกเปลี่ยนได้ดำเนินการประสบความสำเร็จ 430 00:18:58,160 --> 00:18:59,500 431 00:18:59,500 --> 00:19:00,105 >> คำถามที่ 28 432 00:19:00,105 --> 00:19:01,226 433 00:19:01,226 --> 00:19:03,100 สมมติว่าคุณพบ ข้อความผิดพลาด 434 00:19:03,100 --> 00:19:06,790 ด้านล่างในเวลาทำการ ในปีหน้าเป็น CA หรือ TF 435 00:19:06,790 --> 00:19:08,930 ให้คำแนะนำวิธีการแก้ไขปัญหาแต่ละข้อผิดพลาดเหล่านี้ 436 00:19:08,930 --> 00:19:11,160 ดังนั้นการอ้างอิงที่ไม่ได้กำหนดที่จะ GetString 437 00:19:11,160 --> 00:19:12,540 ทำไมคุณอาจเห็นนี้หรือไม่? 438 00:19:12,540 --> 00:19:15,380 ดีถ้านักเรียนใช้ getString ในรหัสของพวกเขา 439 00:19:15,380 --> 00:19:20,310 พวกเขาได้อย่างถูกต้องกัญชารวม CS50 จุดชั่วโมงเพื่อให้บริการ ได้แก่ ห้องสมุด CS50 440 00:19:20,310 --> 00:19:22,380 >> ดีสิ่งที่พวกเขาทำ ต้องแก้ไขข้อผิดพลาดนี้ 441 00:19:22,380 --> 00:19:26,810 พวกเขาต้องทำ lcs50 เส้นประที่ บรรทัดคำสั่งเมื่อพวกเขากำลังรวบรวม 442 00:19:26,810 --> 00:19:29,501 ดังนั้นหากพวกเขาไม่ผ่าน lcs50 รีบเสียงดังกราวพวกเขากำลัง 443 00:19:29,501 --> 00:19:32,000 จะไม่ให้มีการเกิดขึ้นจริง รหัสที่ใช้ GetString 444 00:19:32,000 --> 00:19:33,190 445 00:19:33,190 --> 00:19:34,170 >> คำถามที่ 29 446 00:19:34,170 --> 00:19:36,190 ประกาศโดยปริยาย strlen งานห้องสมุด 447 00:19:36,190 --> 00:19:37,550 448 00:19:37,550 --> 00:19:40,360 อย่างนี้ตอนนี้พวกเขายังไม่ได้ ทำแฮชที่เหมาะสมรวมถึงการ 449 00:19:40,360 --> 00:19:41,440 450 00:19:41,440 --> 00:19:45,410 ในกรณีนี้โดยเฉพาะอย่างยิ่งไฟล์ส่วนหัว พวกเขาต้องการที่จะรวมเป็นสตริงจุดชั่วโมง 451 00:19:45,410 --> 00:19:48,710 และรวมทั้งสตริงจุดชั่วโมงตอนนี้ student-- ตอนนี้คอมไพเลอร์ 452 00:19:48,710 --> 00:19:51,750 มีการเข้าถึง ประกาศของ strlen, 453 00:19:51,750 --> 00:19:54,120 และก็รู้ว่ารหัสของคุณ ใช้ strlen ได้อย่างถูกต้อง 454 00:19:54,120 --> 00:19:55,380 455 00:19:55,380 --> 00:19:56,580 >> คำถามที่ 30 456 00:19:56,580 --> 00:20:00,240 การแปลงร้อยละอื่น ๆ กว่าข้อโต้แย้งข้อมูล 457 00:20:00,240 --> 00:20:01,540 ดังนั้นนี่คืออะไร? 458 00:20:01,540 --> 00:20:06,470 ยังจำได้ว่าร้อยละเหล่านี้ signs-- ว่าพวกเขากำลังที่เกี่ยวข้องกับ printf 459 00:20:06,470 --> 00:20:08,890 ดังนั้นใน printf เราอาจ percent-- เราอาจจะพิมพ์อะไรบางอย่าง 460 00:20:08,890 --> 00:20:11,380 เช่นเดียวกับร้อยละฉันเครื่องหมาย n 461 00:20:11,380 --> 00:20:15,310 หรือเราอาจจะพิมพ์เหมือนฉันเปอร์เซ็นต์ พื้นที่ผมเปอร์เซ็นต์พื้นที่ร้อยละฉัน 462 00:20:15,310 --> 00:20:18,950 ดังนั้นสำหรับแต่ละคน สัญญาณเปอร์เซ็นต์ที่เราต้องการ 463 00:20:18,950 --> 00:20:21,560 ที่จะผ่านตัวแปรในตอนท้ายของ printf 464 00:20:21,560 --> 00:20:26,980 >> ดังนั้นถ้าเราบอกว่าร้อยละวงเล็บ printf ฉันเครื่องหมายวงเล็บปิด n ใกล้ชิด 465 00:20:26,980 --> 00:20:30,270 ดีเราบอกว่าเรากำลัง จะพิมพ์จำนวนเต็ม 466 00:20:30,270 --> 00:20:33,970 แต่เราก็ไม่ผ่าน printf จำนวนเต็มในการพิมพ์จริง 467 00:20:33,970 --> 00:20:37,182 ดังนั้นที่นี่เพิ่มขึ้นร้อยละ แปลงกว่าข้อโต้แย้งข้อมูล? 468 00:20:37,182 --> 00:20:39,390 ที่บอกว่าเรามี ทั้งกลุ่มร้อยละ 469 00:20:39,390 --> 00:20:42,445 และเราไม่ได้มีตัวแปรมากพอ ที่จริงการกรอกข้อมูลลงในร้อยละที่ 470 00:20:42,445 --> 00:20:44,850 471 00:20:44,850 --> 00:20:50,010 >> และแล้วแน่นอนสำหรับคำถามที่ 31 แน่นอนหายไป 40 ไบต์ในหนึ่งบล็อก 472 00:20:50,010 --> 00:20:52,350 ดังนั้นนี่คือข้อผิดพลาด Valgrind 473 00:20:52,350 --> 00:20:54,720 นี้จะบอกว่า ที่ไหนสักแห่งในรหัสของคุณ 474 00:20:54,720 --> 00:20:59,010 คุณมีการจัดสรรที่ 40 ไบต์ขนาดใหญ่เพื่อให้คุณ malloced 40 ไบต์ 475 00:20:59,010 --> 00:21:00,515 และคุณจะไม่ปล่อยให้เป็นอิสระมัน 476 00:21:00,515 --> 00:21:02,480 477 00:21:02,480 --> 00:21:05,140 ส่วนใหญ่คุณเพียงแค่ต้อง ที่จะหาการรั่วไหลของหน่วยความจำบางส่วน 478 00:21:05,140 --> 00:21:07,650 และหาที่คุณต้องการ บล็อกของหน่วยความจำฟรี 479 00:21:07,650 --> 00:21:08,780 480 00:21:08,780 --> 00:21:11,910 >> และคำถาม 32, การเขียนที่ไม่ถูกต้องที่มีขนาด 4 481 00:21:11,910 --> 00:21:13,250 ครั้งนี้เป็นข้อผิดพลาด Valgrind 482 00:21:13,250 --> 00:21:15,440 นี้ไม่ได้จะทำอย่างไร ที่มีการรั่วไหลของหน่วยความจำในขณะนี้ 483 00:21:15,440 --> 00:21:20,750 นี้เป็นส่วนใหญ่ likely-- ผมหมายถึงมัน การเรียงลำดับของหน่วยความจำที่ไม่ถูกต้องสิทธิบางอย่าง 484 00:21:20,750 --> 00:21:23,270 และส่วนใหญ่จะเป็นบางส่วน การเรียงลำดับของหน่วยความจำล้น 485 00:21:23,270 --> 00:21:26,560 ที่คุณมีอาร์เรย์อาจจะ อาร์เรย์จำนวนเต็มและขอ 486 00:21:26,560 --> 00:21:30,115 บอกว่ามันเป็นขนาด 5 และคุณ ลองสัมผัสวงเล็บอาร์เรย์ 5 487 00:21:30,115 --> 00:21:34,150 ดังนั้นถ้าคุณพยายามที่จะเขียนถึงว่า ค่าที่ไม่ชิ้นส่วนของหน่วยความจำ 488 00:21:34,150 --> 00:21:37,440 จริงที่คุณจะสามารถเข้าถึงและ เพื่อให้คุณกำลังจะได้รับข้อผิดพลาดนี้ 489 00:21:37,440 --> 00:21:39,272 บอกว่าการเขียนที่ไม่ถูกต้องที่มีขนาด 4 490 00:21:39,272 --> 00:21:42,480 valgrind จะรู้จักคุณ พยายามที่จะสัมผัสความทรงจำที่ไม่เหมาะสม 491 00:21:42,480 --> 00:21:43,980 >> และที่มันสำหรับ quiz0 492 00:21:43,980 --> 00:21:47,065 ฉันร็อบโบว์และนี่คือ CS50 493 00:21:47,065 --> 00:21:51,104