1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] دعونا نتحدث عن المصفوفات. 2 00:00:09,360 --> 00:00:12,780 وذلك لماذا نريد من أي وقت مضى لاستخدام المصفوفات؟ 3 00:00:12,780 --> 00:00:17,210 وأيضا دعنا نقول لديك البرنامج الذي يحتاج لتخزين معرفات الطالب 5. 4 00:00:17,210 --> 00:00:21,270 قد يبدو من المعقول دينا 5 متغيرات منفصلة. 5 00:00:21,270 --> 00:00:24,240 لأسباب سنرى في بعض الشيء، سوف نبدأ العد من 0. 6 00:00:24,240 --> 00:00:30,700 سوف المتغيرات علينا أن id0 الباحث، الباحث ID1، وهلم جرا. 7 00:00:30,700 --> 00:00:34,870 أي منطق سوف نريد أن القيام على هوية الطالب تحتاج إلى نسخ ولصق 8 00:00:34,870 --> 00:00:36,870 لكل من هذه معرفات الطلاب. 9 00:00:36,870 --> 00:00:39,710 إذا كنا نريد للتحقق مما يحدث ليكون الطلاب في CS50، 10 00:00:39,710 --> 00:00:43,910 سوف نحتاج أولا للتحقق مما إذا id0 يمثل الطالب في الدورة. 11 00:00:43,910 --> 00:00:48,070 ثم أن تفعل الشيء نفسه للطالب المقبل، سوف نحتاج لنسخ ولصق رمز لid0 12 00:00:48,070 --> 00:00:54,430 واستبدال كافة تواجدات id0 مع ID1 وهلم جرا لمدة 3، ID2، و 4. 13 00:00:54,430 --> 00:00:57,560 >> بمجرد سماع ذلك نحن بحاجة إلى نسخ ولصق، 14 00:00:57,560 --> 00:01:00,440 يجب أن نبدأ في التفكير أن هناك حلا أفضل. 15 00:01:00,440 --> 00:01:05,360 الآن ماذا لو كنت أدرك أنك لا تحتاج معرفات الطالب 5 ولكن بدلا 7؟ 16 00:01:05,360 --> 00:01:09,570 كنت بحاجة إلى العودة إلى التعليمات البرمجية المصدر وإضافة في id5، وهو ID6، 17 00:01:09,570 --> 00:01:14,260 ونسخ ولصق المنطق للتحقق إذا كان معرفات تنتمي إلى فئة لهذه معرفات 2 جديدة. 18 00:01:14,260 --> 00:01:19,600 لا يوجد شيء يربط كل هذه المعرفات معا، وحتى لا يكون هناك أي وسيلة لطلب 19 00:01:19,600 --> 00:01:22,040 برنامج للقيام بذلك لمعرفات من 0 إلى 6. 20 00:01:22,040 --> 00:01:26,120 الآن كنت أدرك جيدا أن يكون لديك معرفات الطالب 100. 21 00:01:26,120 --> 00:01:30,770 انها بداية لتبدو أقل من مثالية في حاجة إلى أن تعلن بشكل منفصل كل من هذه المعرفات، 22 00:01:30,770 --> 00:01:33,760 ونسخ ولصق أي منطق لتلك معرفات جديدة. 23 00:01:33,760 --> 00:01:38,380 ولكن ربما نحن مصممون، ونحن نفعل ذلك لجميع الطلاب 100. 24 00:01:38,380 --> 00:01:42,240 ولكن ماذا لو كنت لا تعرف كم عدد الطلاب هناك في الواقع؟ 25 00:01:42,240 --> 00:01:47,320 هناك فقط بعض الطلاب ون البرنامج أن يسأل المستخدم ما أن n هو. 26 00:01:47,320 --> 00:01:50,250 اه اه. هذا لن تعمل بشكل جيد جدا. 27 00:01:50,250 --> 00:01:53,820 البرنامج يعمل فقط لعدد ثابت من بعض الطلاب. 28 00:01:53,820 --> 00:01:57,520 >> حل كل هذه المشاكل هو جمال صفائف. 29 00:01:57,520 --> 00:01:59,930 فما هو مجموعة؟ 30 00:01:59,930 --> 00:02:04,480 في بعض لغات البرمجة قد نوع مصفوفة تكون قادرة على أن تفعل شيئا أكثر من ذلك، 31 00:02:04,480 --> 00:02:09,960 ولكن هنا سوف نركز على هيكل مجموعة البيانات الأساسية تماما كما سوف نرى ذلك في C. 32 00:02:09,960 --> 00:02:14,030 مجموعة هو مجرد كتلة كبيرة من الذاكرة. هذا هو. 33 00:02:14,030 --> 00:02:17,770 عندما نقول لدينا مجموعة من 10 أعداد صحيحة، وهذا يعني فقط أن لدينا بعض كتلة 34 00:02:17,770 --> 00:02:20,740 الذاكرة التي هي كبيرة بما يكفي لعقد 10 أعداد صحيحة منفصلة. 35 00:02:29,930 --> 00:02:33,410 على افتراض أن عدد صحيح هو 4 بايت، وهذا يعني أن مجموعة من 10 أعداد صحيحة 36 00:02:33,410 --> 00:02:37,180 هو كتلة من 40 بايت المستمر في الذاكرة. 37 00:02:42,660 --> 00:02:46,280 حتى عند استخدام المصفوفات متعددة الأبعاد، ونحن لن نذهب إلى هنا، 38 00:02:46,280 --> 00:02:49,200 انها لا تزال مجرد كتلة كبيرة من الذاكرة. 39 00:02:49,200 --> 00:02:51,840 منهج متعدد الأبعاد هو مجرد الراحة. 40 00:02:51,840 --> 00:02:55,640 إذا كان لديك لمدة 3 بنسبة 3 مجموعة من الأعداد الصحيحة متعددة الأبعاد، 41 00:02:55,640 --> 00:03:00,650 ثم البرنامج حقا علاج هذا على أنه مجرد كتلة كبيرة من 36 بايت. 42 00:03:00,650 --> 00:03:05,460 العدد الكلي من الأعداد الصحيحة هي 3 مرات 3، ولكل عدد صحيح يستغرق 4 بايت. 43 00:03:05,460 --> 00:03:07,750 >> دعونا نلقي نظرة على مثال الأساسية. 44 00:03:07,750 --> 00:03:10,660 يمكننا أن نرى هنا 2 طرق مختلفة للإعلان صفائف. 45 00:03:15,660 --> 00:03:18,580 علينا أن التعليق 1 من اخراجها للبرنامج لتجميع 46 00:03:18,580 --> 00:03:20,900 منذ نعلن X مرتين. 47 00:03:20,900 --> 00:03:25,140 سوف نلقي نظرة على بعض الاختلافات بين هذه الأنواع 2 من الإعلانات في بعض الشيء. 48 00:03:25,140 --> 00:03:28,560 كل من هذه الخطوط تعلن مجموعة من حجم N، 49 00:03:28,560 --> 00:03:30,740 حيث قمنا بتعريف # N إلى 10. 50 00:03:30,740 --> 00:03:34,460 يمكننا بسهولة تماما كما طلبت من المستخدم للحصول على عدد صحيح موجب 51 00:03:34,460 --> 00:03:37,250 والتي تستخدم عدد صحيح وعدد من العناصر في مجموعتنا. 52 00:03:37,250 --> 00:03:41,960 مثل مثالنا هوية الطالب قبل، وهذا هو نوع من مثل اعلان منفصل تماما 10 53 00:03:41,960 --> 00:03:49,000 المتغيرات الوهمية؛ X0، X1، X2، وهلم جرا حتى XN-1. 54 00:03:57,270 --> 00:04:00,840 تجاهل الخطوط حيث نعلن الصفيف، لاحظ الأقواس المربعة سليمة 55 00:04:00,840 --> 00:04:02,090 داخل لحلقات. 56 00:04:02,090 --> 00:04:09,660 عندما نكتب شيئا مثل X [3]، والتي سوف تقرأ تماما كما قوس × 3، 57 00:04:09,660 --> 00:04:13,090 يمكنك التفكير في الأمر كمن يسأل لX3 الخيالي. 58 00:04:13,090 --> 00:04:17,519 لاحظت من مع مجموعة من حجم N، وهذا يعني أن عدد الأقواس من داخل، 59 00:04:17,519 --> 00:04:22,630 التي سنقوم استدعاء مؤشر يمكن أن يكون أي شيء 0-1-N، 60 00:04:22,630 --> 00:04:25,660 وهو ما مجموعه مؤشرات N. 61 00:04:25,660 --> 00:04:28,260 >> للتفكير في كيف يعمل هذا في الواقع 62 00:04:28,260 --> 00:04:31,260 نتذكر أن مجموعة هو كتلة كبيرة من الذاكرة. 63 00:04:31,260 --> 00:04:37,460 على افتراض أن عدد صحيح هو 4 بايت، X مجموعة كاملة هو كتلة 40 بايت من الذاكرة. 64 00:04:37,460 --> 00:04:41,360 حتى X0 يشير إلى 4 بايت الأولى من الكتلة. 65 00:04:45,810 --> 00:04:49,230 X [1] يشير إلى بايت 4 التالي وهكذا. 66 00:04:49,230 --> 00:04:53,760 هذا يعني أن x هو بداية كل برنامج من أي وقت مضى بحاجة إلى تتبع. 67 00:04:55,660 --> 00:04:59,840 إذا كنت ترغب في استخدام X [400]، ثم البرنامج يعرف أن هذا هو ما يعادل 68 00:04:59,840 --> 00:05:03,460 لمجرد بايت 1600 بعد بدء X. 69 00:05:03,460 --> 00:05:08,780 Where'd نحصل على 1600 بايت من؟ انها مجرد 400 مرة في 4 بايت عدد صحيح. 70 00:05:08,780 --> 00:05:13,170 >> قبل الانتقال، من المهم جدا أن ندرك أن في C 71 00:05:13,170 --> 00:05:17,080 ليس هناك من مؤشر إنفاذ التي نستخدمها في الصفيف. 72 00:05:17,080 --> 00:05:23,180 لدينا كتلة كبيرة فقط 10 أعداد صحيحة طويلة، ولكن شيئا لن يصيح علينا إذا نحن نكتب X [20] 73 00:05:23,180 --> 00:05:26,060 أو حتى العاشر [-5]. 74 00:05:26,060 --> 00:05:28,240 المؤشر لا بل يجب أن تكون عددا. 75 00:05:28,240 --> 00:05:30,630 يمكن أن يكون أي تعبير التعسفي. 76 00:05:30,630 --> 00:05:34,800 في برنامج نستخدم المتغير من أنا لحلقة لمؤشر إلى الصفيف. 77 00:05:34,800 --> 00:05:40,340 هذا هو نمط شائع جدا، حلقات من 0 = ط لطول الصفيف، 78 00:05:40,340 --> 00:05:43,350 ثم استخدام ط كفهرس للمجموعة. 79 00:05:43,350 --> 00:05:46,160 وبهذه الطريقة يمكنك حلقة فعال على مجموعة بأكملها، 80 00:05:46,160 --> 00:05:50,600 ويمكنك تعيين إما إلى كل بقعة في الصفيف أو استخدامه لبعض الحساب. 81 00:05:50,600 --> 00:05:53,920 >> في أول حلقة ل، أنا يبدأ في 0، 82 00:05:53,920 --> 00:05:58,680 وذلك سوف يسند الى بقعة 0 في الصفيف، القيمة 0 مرات 2. 83 00:05:58,680 --> 00:06:04,370 ثم أنا الزيادات، ونحن تعيين المركز الأول في الصفيف القيمة 1 مرات 2. 84 00:06:04,370 --> 00:06:10,170 ثم أنا الزيادات مرة أخرى وهلم جرا حتى نعلق لوضع N-1 في الصفيف 85 00:06:10,170 --> 00:06:13,370 قيمة N-1 مرات 2. 86 00:06:13,370 --> 00:06:17,810 حتى لقد أنشأنا مجموعة مع الأرقام حتى أول 10. 87 00:06:17,810 --> 00:06:21,970 ربما يسوي كان أفضل اسم للمتغير قليلا من X، 88 00:06:21,970 --> 00:06:24,760 ولكن من شأنه أن يعطي أن الأمور بعيدا. 89 00:06:24,760 --> 00:06:30,210 والثانية للحلقة ثم يطبع فقط القيم التي لدينا بالفعل المخزنة داخل الصفيف. 90 00:06:30,210 --> 00:06:33,600 >> دعونا نحاول تشغيل البرنامج مع كلا النوعين من الإعلانات مجموعة 91 00:06:33,600 --> 00:06:36,330 ونلقي نظرة على الإخراج من البرنامج. 92 00:06:51,450 --> 00:06:57,020 بقدر ما يمكننا أن نرى، برنامج يتصرف بنفس الطريقة لكلا النوعين من الإعلانات. 93 00:06:57,020 --> 00:07:02,230 دعونا نلقي أيضا نظرة على ما يحدث إذا قمنا بتغيير حلقة أول من لا تتوقف عند N 94 00:07:02,230 --> 00:07:05,040 لكنهم يقولون بدلا 10،000. 95 00:07:05,040 --> 00:07:07,430 الطريق إلى ما بعد نهاية الصفيف. 96 00:07:14,700 --> 00:07:17,210 عفوا. ربما كنت قد رأيت هذا من قبل. 97 00:07:17,210 --> 00:07:20,440 A خطأ تجزئة يعني البرنامج قد تحطمت. 98 00:07:20,440 --> 00:07:24,430 أنت تبدأ في رؤية هذه المناطق عند لمس من الذاكرة يجب أن لا يتم لمس. 99 00:07:24,430 --> 00:07:27,870 هنا نحن لمس 10000 مواقع وراء بداية العاشر، 100 00:07:27,870 --> 00:07:31,920 وهو الواضح مكانا في الذاكرة ونحن لا ينبغي أن لمس. 101 00:07:31,920 --> 00:07:37,690 لذلك معظمنا ربما لن يضع بطريق الخطأ بدلا من 10000 N، 102 00:07:37,690 --> 00:07:42,930 ولكن ماذا لو أن نفعل شيئا أكثر دهاء مثل يقول الكتابة أقل من أو يساوي N 103 00:07:42,930 --> 00:07:46,830 في حالة حلقة لفي مقابل أقل من N. 104 00:07:46,830 --> 00:07:50,100 تذكر أن لديه مجموعة مؤشرات فقط 0 حتي 1-N، 105 00:07:50,100 --> 00:07:54,510 وهو ما يعني أن المؤشر N بعد نهاية الصفيف. 106 00:07:54,510 --> 00:07:58,050 قد لا تعطل البرنامج في هذه الحالة، لكنه ما زال خطأ. 107 00:07:58,050 --> 00:08:01,950 في الواقع، وهذا خطأ شائع بحيث يتضمن اسم هو نفسه، 108 00:08:01,950 --> 00:08:03,970 وبحلول 1 من الخطأ. 109 00:08:03,970 --> 00:08:05,970 >> هذا كل شيء عن الأساسيات. 110 00:08:05,970 --> 00:08:09,960 فما هي الاختلافات الرئيسية بين أنواع الإعلانات 2 من مجموعة؟ 111 00:08:09,960 --> 00:08:13,960 فارق واحد هو المكان الذي كتلة كبيرة من الذاكرة يذهب. 112 00:08:13,960 --> 00:08:17,660 في أول إعلان، والتي سوف أسميه نوع قوس مصفوفة، 113 00:08:17,660 --> 00:08:20,300 وإن كان هذا هو بأي حال من الأحوال اسم التقليدية، 114 00:08:20,300 --> 00:08:22,480 وسوف تذهب على المكدس. 115 00:08:22,480 --> 00:08:27,450 بينما في الحالة الثانية، والتي سوف استدعاء نوع مؤشر مصفوفة، وسوف تذهب على الكومة. 116 00:08:27,450 --> 00:08:32,480 هذا يعني أنه عندما ترجع الدالة، سوف تلقائيا مجموعة قوس يمكن deallocated، 117 00:08:32,480 --> 00:08:36,419 في حين ويجب استدعاء explicitily الحرة على مجموعة مؤشر 118 00:08:36,419 --> 00:08:38,010 وإلا لديك تسرب الذاكرة. 119 00:08:38,010 --> 00:08:42,750 بالإضافة إلى ذلك، مجموعة قوس ليست في الواقع المتغير. 120 00:08:42,750 --> 00:08:45,490 هذا هو المهم. انها مجرد رمز. 121 00:08:45,490 --> 00:08:49,160 يمكنك التفكير في الأمر على النحو ثابت أن يختار المترجم لك. 122 00:08:49,160 --> 00:08:52,970 هذا يعني أننا لا نستطيع أن نفعل شيئا مثل X + + مع نوع قوس، 123 00:08:52,970 --> 00:08:56,240 وإن كان هذا صحيحا تماما مع نوع مؤشر. 124 00:08:56,240 --> 00:08:58,270 >> نوع المؤشر هو متغير. 125 00:08:58,270 --> 00:09:01,510 لنوع المؤشر، لدينا 2 بنات منفصلة من الذاكرة. 126 00:09:01,510 --> 00:09:06,060 يتم تخزين المتغير x نفسها في كومة ومجرد مؤشر واحد، 127 00:09:06,060 --> 00:09:08,620 ولكن يتم تخزين كتلة كبيرة من الذاكرة على الكومة. 128 00:09:08,620 --> 00:09:11,010 المتغير x على المكدس مجرد مخازن عنوان 129 00:09:11,010 --> 00:09:14,010 من كتلة كبيرة من الذاكرة على الكومة. 130 00:09:14,010 --> 00:09:17,370 احد الآثار المترتبة على هذا هو مع حجم المشغل. 131 00:09:17,370 --> 00:09:22,480 إذا كنت تسأل عن حجم مجموعة قوس، سوف تعطيك حجم كتلة كبيرة من الذاكرة، 132 00:09:22,480 --> 00:09:24,620 شيء من هذا القبيل 40 بايت، 133 00:09:24,620 --> 00:09:26,920 ولكن إذا كنت تسأل عن حجم ونوع من مؤشر مجموعة، 134 00:09:26,920 --> 00:09:32,740 سوف تعطيك حجم X متغير نفسها، والتي على الجهاز ومن المرجح فقط 4 بايت. 135 00:09:32,740 --> 00:09:36,530 استخدام نوع مؤشر مصفوفة، فإنه من المستحيل أن نسأل مباشرة عن 136 00:09:36,530 --> 00:09:38,530 حجم كتلة كبيرة من الذاكرة. 137 00:09:38,530 --> 00:09:42,530 هذا ليس بكثير عادة من تقييد لأننا نادرا ما تريد حجم 138 00:09:42,530 --> 00:09:46,980 من كتلة كبيرة من الذاكرة، ويمكننا حساب عادة ما إذا كنا في حاجة إليها. 139 00:09:46,980 --> 00:09:51,490 >> وأخيرا، فإن مجموعة قوس يحدث لتوفر لنا اختصار لتهيئة صفيف. 140 00:09:51,490 --> 00:09:56,130 دعونا نرى كيف يمكن أن يكتب أول 10 أعداد صحيحة حتى باستخدام initilization المختصرة. 141 00:10:11,220 --> 00:10:14,470 مع مجموعة المؤشر، وليس هناك طريقة للقيام اختصار مثل هذا. 142 00:10:14,470 --> 00:10:18,120 هذه مجرد مقدمة لما يمكنك القيام به مع المصفوفات. 143 00:10:18,120 --> 00:10:20,990 أنها تظهر في البرنامج تقريبا كل تكتب. 144 00:10:20,990 --> 00:10:24,390 نأمل أن تشاهد الآن طريقة أفضل للقيام المثال معرفات الطالب 145 00:10:24,390 --> 00:10:26,710 من بداية الفيديو. 146 00:10:26,710 --> 00:10:29,960 >> اسمي روب بودين، وهذا هو CS50.