1 00:00:00,000 --> 00:00:02,350 >> [เล่นเพลง] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: สิทธิทั้งหมด 4 00:00:06,360 --> 00:00:07,770 ชนิดของหัวข้อแปลกใช่มั้ย? 5 00:00:07,770 --> 00:00:09,050 หมายเลขมายากล 6 00:00:09,050 --> 00:00:12,012 สิ่งที่กวางเขาหมายถึงเมื่อเขา พูดคุยเกี่ยวกับหมายเลขมายากล? 7 00:00:12,012 --> 00:00:14,220 ดีบางส่วนของโปรแกรม ที่เราได้เขียนใน CS50 8 00:00:14,220 --> 00:00:16,660 จนถึงขณะนี้ยังมีบางลาง จำนวนชนิดของการโยนในพวกเขา 9 00:00:16,660 --> 00:00:19,680 บางทีอาจจะด้วยเหตุผลที่เราทำไม่ได้ ทั้งหมดเข้าใจได้ในขณะนี้ 10 00:00:19,680 --> 00:00:23,950 ยกตัวอย่างเช่นในปัญหามาริโอเรา ต่อยอดความสูงของปิรามิดที่ 23 11 00:00:23,950 --> 00:00:26,880 เราบอกว่าคุณอย่างชัดเจน ไม่สามารถไปสูงกว่า 23 12 00:00:26,880 --> 00:00:28,702 >> แต่สิ่งที่ไม่ 23 หมายความว่าอย่างไร 13 00:00:28,702 --> 00:00:30,410 ดีถ้าคุณอ่าน spec อย่างคุณ 14 00:00:30,410 --> 00:00:32,493 อาจได้เห็นว่า เหตุผลที่เราต่อยอดได้ที่ 23 15 00:00:32,493 --> 00:00:36,160 เป็นเพราะความสูงมาตรฐาน ของหน้าต่าง terminal 24 16 00:00:36,160 --> 00:00:38,860 ดังนั้นถ้าเรามี ปิรามิดจะสูงกว่านั้น 17 00:00:38,860 --> 00:00:41,290 มันอาจจะทำสิ่งนี้แปลก ที่มันวิ่งออกมานอกจอ 18 00:00:41,290 --> 00:00:45,140 และคุณรู้ว่าสิ่งที่ไม่ ที่มีความหมายในบริบทใช่มั้ย? 19 00:00:45,140 --> 00:00:48,880 >> คือความหมายของวันที่ 23 ที่เห็นได้ชัดทันที กับใครบางคนที่มีลักษณะที่โปรแกรมของคุณ 20 00:00:48,880 --> 00:00:51,550 และอาจจะมีความแตกต่างกัน หน้าต่าง terminal ขนาด? 21 00:00:51,550 --> 00:00:52,330 อาจจะไม่. 22 00:00:52,330 --> 00:00:53,080 ดูเหมือนว่าตกลง 23 00:00:53,080 --> 00:00:55,005 ดีทำไมมันเป็นเพียงน้อยกว่า 23? 24 00:00:55,005 --> 00:00:56,880 โดยทั่วไปจะเป็นชนิด ของนิสัยที่ไม่ดีจริง 25 00:00:56,880 --> 00:00:58,940 เขียนคงเป็นรหัสของคุณ 26 00:00:58,940 --> 00:01:02,190 ในการทำเช่นเมื่อคุณทำจริง เขียนคงเป็นรหัสของคุณ 27 00:01:02,190 --> 00:01:05,630 มันเป็นบางครั้งเรียกว่าใช้ หมายเลขมายากลซึ่งเป็นสิ่งที่ 28 00:01:05,630 --> 00:01:08,030 โดยทั่วไปเราต้องการที่จะพยายามหลีกเลี่ยง 29 00:01:08,030 --> 00:01:12,830 >> ตัวอย่างเช่นลองดู ฟังก์ชั่นที่เรียบง่ายที่นี่ 30 00:01:12,830 --> 00:01:15,726 เห็นได้ชัดว่ามีข้อมูลไม่ ชนิดที่เรียกว่าใน C หรือบัตรดาดฟ้า 31 00:01:15,726 --> 00:01:16,600 ดังนั้นเพียงแค่อดทนกับฉัน 32 00:01:16,600 --> 00:01:18,910 มันเป็นเรื่องเล็กน้อย pseudocode ผสมในที่นี่ 33 00:01:18,910 --> 00:01:21,050 นี้เป็นฟังก์ชั่นที่เรียกว่า จัดการบัตรที่เห็นได้ชัด 34 00:01:21,050 --> 00:01:26,570 ใช้เวลาดาดฟ้าเป็นพารามิเตอร์ของตนและ จะออกมาให้ฉันบัตรเดียว 35 00:01:26,570 --> 00:01:30,990 >> และที่ฉันทำบางสิ่งบางอย่างที่นี่ที่ฉัน มีวงที่ทำงาน 0-52 ที่ 36 00:01:30,990 --> 00:01:33,394 และฉันจัดการบัตร 37 00:01:33,394 --> 00:01:35,310 ดีที่เราได้มีเวทมนตร์ ตัวเลขในที่นี่ขวา 38 00:01:35,310 --> 00:01:38,790 คุณเห็นสิ่งที่จำนวนมายากลคืออะไร? 39 00:01:38,790 --> 00:01:42,280 หรือที่สำคัญกว่าคุณ เห็นสิ่งที่เป็นปัญหาที่นี่? 40 00:01:42,280 --> 00:01:44,310 โดยเฉพาะอย่างยิ่งถ้าเรื่องนี้ เป็นเพียงหนึ่งในฟังก์ชั่น 41 00:01:44,310 --> 00:01:48,030 ในแฟ้มของตัวเองใน โฟลเดอร์ที่มี 42 00:01:48,030 --> 00:01:49,970 พวงของการที่แตกต่างกัน ไฟล์แต่ละที่ 43 00:01:49,970 --> 00:01:51,670 ไม่สิ่งอื่นที่จะของการ์ด 44 00:01:51,670 --> 00:01:57,310 บางทีมันอาจจะ shuffles พวกเขาหรือข้อตกลงมือ ห้าใบแทนบัตรเดียว 45 00:01:57,310 --> 00:01:59,420 >> คุณเห็นว่า ปัญหาที่เกิดขึ้นอาจจะเป็นที่นี่? 46 00:01:59,420 --> 00:02:03,220 คุณเห็นจำนวนมายากล ผมเคยฉีดเข้าไปในรหัส? 47 00:02:03,220 --> 00:02:04,390 มันเป็น 52 ขวา 48 00:02:04,390 --> 00:02:06,440 >> เหมือนอย่างสังหรณ์ใจคุณอาจจะรู้, OK 49 00:02:06,440 --> 00:02:09,740 เหมือนสำรับมาตรฐาน บัตรมี 52 ใบ 50 00:02:09,740 --> 00:02:12,570 แต่ในโปรแกรมของเราก็แค่ ชนิดของลอยรอบในการมี 51 00:02:12,570 --> 00:02:15,280 มันก็เหมือนกับการทั้งหมดในทันทีที่มี 52 52 00:02:15,280 --> 00:02:18,290 >> วิธีหนึ่งที่จะแก้ปัญหานี้ ปัญหาคือจะทำเช่นนี้ 53 00:02:18,290 --> 00:02:22,724 เรามากอย่างชัดเจนในขณะนี้ โทรออกขนาดดาดฟ้าเป็น 52 54 00:02:22,724 --> 00:02:25,390 มันให้มันเล็ก ๆ น้อย ๆ ได้ง่ายขึ้น ความหมายเมื่ออยู่ในห่วง 55 00:02:25,390 --> 00:02:28,650 ต่อมาเราก็บอกว่าฉัน น้อยกว่าขนาดดาดฟ้า 56 00:02:28,650 --> 00:02:32,666 มันก็ดูเหมือนว่าดีกว่าบอก 52 57 00:02:32,666 --> 00:02:34,290 ตอนนี้ไม่สามารถแก้ไขปัญหาได้จริง 58 00:02:34,290 --> 00:02:38,460 มันจะให้สัญลักษณ์บางอย่าง หมายที่จะคงที่ 59 00:02:38,460 --> 00:02:40,820 แต่มันไม่ชนิดของจริง แนะนำอีกปัญหาหนึ่ง 60 00:02:40,820 --> 00:02:43,770 ที่อาจจะไม่ปรากฏทันที 61 00:02:43,770 --> 00:02:45,859 แม้ว่าตัวแปรนี้ ประกาศ globally-- 62 00:02:45,859 --> 00:02:47,650 ที่คุณจำสิ่งที่มัน หมายความว่าเมื่อเราประกาศ 63 00:02:47,650 --> 00:02:50,500 ตัวแปรทั่วโลกเมื่อเทียบกับในประเทศหรือไม่? 64 00:02:50,500 --> 00:02:53,340 แม้ว่าเราจะประกาศตัวแปร ทั่วโลกสิ่งที่ถ้ามี 65 00:02:53,340 --> 00:02:55,500 ฟังก์ชั่นอื่น ชุดของฟังก์ชั่น 66 00:02:55,500 --> 00:02:59,750 ข้อตกลงที่มีการจัดการบัตร ที่ไม่ได้ตั้งใจเปลี่ยนแปลงขนาดดาดฟ้า 67 00:02:59,750 --> 00:03:02,727 หรือมันจะเพิ่มความมันด้วย 1 หรือลดลงได้โดย 1 68 00:03:02,727 --> 00:03:04,060 ที่สามารถสะกดปัญหาใช่มั้ย? 69 00:03:04,060 --> 00:03:08,261 โดยเฉพาะอย่างยิ่งถ้าเราจัดการกับชุด ของบัตรที่สับดาดฟ้าเต็มรูปแบบ 70 00:03:08,261 --> 00:03:08,760 จำเป็น. 71 00:03:08,760 --> 00:03:12,804 ถ้าขนาดดาดฟ้าจะลดลง โดยที่ 1 เช่น 51, 72 00:03:12,804 --> 00:03:14,970 เราไม่ได้จริงสับ บัตรทั้งหมดอาจจะเป็น 73 00:03:14,970 --> 00:03:16,500 เรากำลังจะออกจากหนึ่งของพวกเขาออกมา 74 00:03:16,500 --> 00:03:21,680 และความคุ้มค่าว่าบางทีอาจจะเป็น ที่คาดการณ์ไว้หรือใช้ประโยชน์โดยเป็นนักแสดงที่ดี 75 00:03:21,680 --> 00:03:24,920 >> C มีสิ่งที่เรียกว่า สั่ง preprocessor ​​ซึ่ง 76 00:03:24,920 --> 00:03:27,764 จะเรียกว่าแมโครสำหรับ สร้างค่าคงที่ที่เป็นสัญลักษณ์ 77 00:03:27,764 --> 00:03:30,180 และในความเป็นจริงคุณได้แล้ว เห็นสั่ง preprocessor, 78 00:03:30,180 --> 00:03:32,916 แม้ว่าคุณจะไม่ได้ยินมัน เรียกว่ามีการ #include 79 00:03:32,916 --> 00:03:37,150 มันเป็นตัวอย่างของแมโครอื่น หรือสั่ง preprocessor 80 00:03:37,150 --> 00:03:41,290 >> วิธีการสร้างค่าคงที่สัญลักษณ์ หรือให้ชื่อที่จะคงที่ 81 00:03:41,290 --> 00:03:43,740 เพื่อให้มีมากขึ้น ความหมายดังต่อไปนี้ 82 00:03:43,740 --> 00:03:47,030 # กำหนดชื่อแทน 83 00:03:47,030 --> 00:03:49,140 สิ่งที่สำคัญจริงๆกัน ที่นี่อย่างรวดเร็วจริงๆ 84 00:03:49,140 --> 00:03:54,180 ไม่ใส่เครื่องหมายอัฒภาคที่ ปลาย # กำหนดของคุณ 85 00:03:54,180 --> 00:03:57,310 ดังนั้นจึงเป็น # กำหนดชื่อแทน 86 00:03:57,310 --> 00:03:59,540 >> เมื่อโปรแกรมของคุณจะรวบรวม สิ่งที่เกิดขึ้นจริง 87 00:03:59,540 --> 00:04:01,740 เป็นคอมไพเลอร์ถ้าไป ที่จะไปผ่านรห​​ัสของคุณ 88 00:04:01,740 --> 00:04:06,770 และแทนที่ตัวอย่างของทุก คำว่า "ชื่อ" กับสิ่งที่คุณ 89 00:04:06,770 --> 00:04:08,860 ใส่แทน 90 00:04:08,860 --> 00:04:13,060 Analogously ถ้า #include คือการจัดเรียง ของที่คล้ายกับการคัดลอกและวาง 91 00:04:13,060 --> 00:04:15,700 # กำหนดแล้วจะเรียงลำดับของ ที่คล้ายกันในการค้นหาและแทนที่ 92 00:04:15,700 --> 00:04:19,180 ถ้าคุณเคยใช้คุณลักษณะที่อยู่ใน โปรแกรมประมวลผลคำเช่น 93 00:04:19,180 --> 00:04:26,345 >> ดังนั้นตัวอย่างเช่นถ้าฉัน #define ปี่เป็น 3.14159265, 94 00:04:26,345 --> 00:04:28,720 ถ้าคุณดีทางคณิตศาสตร์ แนวโน้มและคุณก็ 95 00:04:28,720 --> 00:04:31,640 เห็น 3.14159265 บิน รอบในรหัสของคุณ 96 00:04:31,640 --> 00:04:33,517 คุณอาจรู้ว่ามันพูดคุยเกี่ยวกับปี่ 97 00:04:33,517 --> 00:04:35,850 แต่บางทีเราสามารถให้มัน เล็ก ๆ น้อย ๆ ความหมายของสัญลักษณ์อื่น ๆ 98 00:04:35,850 --> 00:04:39,850 และเราสามารถพูดแทน #define ปี่เป็นคำหนึ่งของตัวเลขที่ 99 00:04:39,850 --> 00:04:42,110 ที่ผมไม่ได้ไปเพื่อให้ อ่านซ้ำแล้วซ้ำอีก 100 00:04:42,110 --> 00:04:45,560 >> และสิ่งที่จะเกิดขึ้นแล้ว รวบรวมเวลาคือเมื่อโครงการคือ 101 00:04:45,560 --> 00:04:48,530 รวบรวมสิ่งแรกที่ ที่จะเกิดขึ้นมันจะผ่านไป 102 00:04:48,530 --> 00:04:51,520 และมันจะเปลี่ยนทุกครั้ง มันเห็นเงินทุน P, ทุนผม 103 00:04:51,520 --> 00:04:55,610 มันอย่างแท้จริงจะแทนที่ด้วย 3.14 และอื่น ๆ เพื่อให้คุณ 104 00:04:55,610 --> 00:04:58,090 จะได้ไม่ต้องพิมพ์ทุก เวลาในขณะที่โปรแกรมของคุณยังคง 105 00:04:58,090 --> 00:05:00,631 มีการทำงานที่คุณ คาดหวังเพราะคุณกำลังทำงาน 106 00:05:00,631 --> 00:05:05,090 กับการจัดการกับคูณ แบ่งสิ่งที่เป็นโดยปี่ 107 00:05:05,090 --> 00:05:08,230 >> คุณยังไม่ได้ จำกัด อยู่ที่นี้ ทดแทนตัวเลขเท่านั้น 108 00:05:08,230 --> 00:05:12,279 ตัวอย่างเช่นผมอาจ #define แน่นอนเป็น CS50 สตริง 109 00:05:12,279 --> 00:05:14,070 ในกรณีนี้เมื่อ โปรแกรมจะรวบรวม 110 00:05:14,070 --> 00:05:16,236 # กำหนดจะไปผ่าน รหัสแทนทุกครั้ง 111 00:05:16,236 --> 00:05:19,900 เห็น "หลักสูตร" กับ CS50 สตริง 112 00:05:19,900 --> 00:05:21,720 >> คุณจะสังเกตเห็นที่นี่ ว่าฉันมัก 113 00:05:21,720 --> 00:05:26,090 # กำหนดทั้งหมดของฉันสัญลักษณ์ที่กำหนดไว้ ค่าคงที่เพื่อที่จะพูด 114 00:05:26,090 --> 00:05:28,130 มักจะอยู่ในตัวพิมพ์ใหญ่ทั้งหมด 115 00:05:28,130 --> 00:05:28,960 มันเป็นเรื่องการประชุม 116 00:05:28,960 --> 00:05:30,170 มันไม่จำเป็นต้องใช้ 117 00:05:30,170 --> 00:05:33,900 เหตุผลที่คนทั่วไปจะใช้ เมืองหลวงเมื่อพวกเขากำลัง #defining 118 00:05:33,900 --> 00:05:37,590 เป็นเพียงการที่จะทำให้มันชัดเจนว่าจริงๆ องค์ประกอบนี้โดยเฉพาะของรหัสของฉัน 119 00:05:37,590 --> 00:05:38,820 เป็นที่กำหนดไว้อย่างต่อเนื่อง 120 00:05:38,820 --> 00:05:43,730 ถ้ามันเป็นตัวพิมพ์เล็กเป็นไปได้ว่า มันอาจจะสับสนกับตัวแปร 121 00:05:43,730 --> 00:05:46,120 และนั่นอาจจะเป็น ไม่ได้เป็นสิ่งที่ดีที่จะทำ 122 00:05:46,120 --> 00:05:48,910 >> ดังนั้นนี้โดยเฉพาะ การแก้ปัญหาจะดีกว่ามาก 123 00:05:48,910 --> 00:05:50,550 กว่าทั้งสองคนก่อนหน้านี้ 124 00:05:50,550 --> 00:05:59,950 หากครั้งแรกที่ผม #define ดาดฟ้าขนาด 52 แล้ว ในขณะนี้การใช้งานของฉัน 52 หรือขนาดดาดฟ้าที่นี่ 125 00:05:59,950 --> 00:06:01,850 มากขึ้นใช้งานง่ายและปลอดภัยมากเป็น 126 00:06:01,850 --> 00:06:03,280 คุณไม่สามารถจัดการกับค่าคงที่ 127 00:06:03,280 --> 00:06:05,259 คุณไม่สามารถพูดได้ 52 บวกบวก 128 00:06:05,259 --> 00:06:06,800 ที่ไม่ได้ไปแปลงเป็น 53 129 00:06:06,800 --> 00:06:09,390 คุณไม่สามารถเปลี่ยน 52 บางสิ่งบางอย่าง 130 00:06:09,390 --> 00:06:12,470 >> คุณสามารถเปลี่ยนตัวแปร ที่มีค่า 52, 131 00:06:12,470 --> 00:06:14,870 ซึ่งเป็นครั้งแรกที่เราแก้ไขได้ก่อน 132 00:06:14,870 --> 00:06:17,000 และคุณสามารถเพิ่ม ตัวแปรที่ 53 133 00:06:17,000 --> 00:06:21,100 แต่คุณไม่สามารถพูดได้ 52 บวกบวกและ มีที่อยู่ ๆ ก็เปิดออกเป็น 52 53 134 00:06:21,100 --> 00:06:23,350 52 เสมอ 52 135 00:06:23,350 --> 00:06:28,860 และเพื่อให้คุณไม่สามารถเปลี่ยนแปลงโดยไม่ได้ตั้งใจ ขนาดดาดฟ้าที่นี่โดยการจัดการกับมัน 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> อีกด้านที่ดี ผลกระทบของ แต่นี้ 138 00:06:32,390 --> 00:06:38,310 ที่คุณไม่ทราบว่า ทุกประเทศทั่วโลก 139 00:06:38,310 --> 00:06:40,690 ใช้ของการ์ดขนาด 52 หรือไม่? 140 00:06:40,690 --> 00:06:45,630 ยกตัวอย่างเช่นมันเป็นเรื่องปกติจริงๆ เยอรมนีจะใช้ขนาดดาดฟ้าของ 32, 141 00:06:45,630 --> 00:06:48,020 ที่พวกเขาตัดออกบางส่วน ของที่ต่ำกว่าค่าบัตร 142 00:06:48,020 --> 00:06:50,960 และในกรณีนี้ผม ต้องการที่จะพอร์ตสวีทของฉัน 143 00:06:50,960 --> 00:06:55,390 ฟังก์ชั่นที่เกี่ยวข้องกับ การจัดการบัตรไปยังประเทศเยอรมนี 144 00:06:55,390 --> 00:06:59,440 ที่ฉันสามารถทำได้ในกรณีแรกที่เรา แสดงให้เห็นว่าจะต้องไปและแทนที่ 145 00:06:59,440 --> 00:07:03,570 กรณีของ 52 ในรหัสของฉันกับ 32 146 00:07:03,570 --> 00:07:07,940 >> แต่ที่นี่ถ้าฉัน #define ขนาดดาดฟ้า 32 ที่ส่วนบนสุดของรหัสของฉัน 147 00:07:07,940 --> 00:07:11,730 ถ้าผมต้องเปลี่ยนฉันสามารถ เพียงแค่ไปเปลี่ยนที่และสิ่งหนึ่งที่ 148 00:07:11,730 --> 00:07:15,010 คอมไพล์รหัสของฉันและทุก ทันทีที่มันแพร่กระจายผ่าน 149 00:07:15,010 --> 00:07:18,850 ในความเป็นจริงเราสามารถเปลี่ยนดาดฟ้า ขนาดที่ค่าใด ๆ ที่เราต้องการ 150 00:07:18,850 --> 00:07:22,500 >> ฉันสามารถคุณสนใจใน เกมของรถกระบะขนาดดาดฟ้า? 151 00:07:22,500 --> 00:07:23,430 >> ฉันลอยด์ดั๊ก 152 00:07:23,430 --> 00:07:25,840 และนี่คือ CS50 153 00:07:25,840 --> 00:07:27,772