[Powered by Google Translate] دعونا نتحدث عن المصفوفات.
وذلك لماذا نريد من أي وقت مضى لاستخدام المصفوفات؟
وأيضا دعنا نقول لديك البرنامج الذي يحتاج لتخزين معرفات الطالب 5.
قد يبدو من المعقول دينا 5 متغيرات منفصلة.
لأسباب سنرى في بعض الشيء، سوف نبدأ العد من 0.
سوف المتغيرات علينا أن id0 الباحث، الباحث ID1، وهلم جرا.
أي منطق سوف نريد أن القيام على هوية الطالب تحتاج إلى نسخ ولصق
لكل من هذه معرفات الطلاب.
إذا كنا نريد للتحقق مما يحدث ليكون الطلاب في CS50،
سوف نحتاج أولا للتحقق مما إذا id0 يمثل الطالب في الدورة.
ثم أن تفعل الشيء نفسه للطالب المقبل، سوف نحتاج لنسخ ولصق رمز لid0
واستبدال كافة تواجدات id0 مع ID1 وهلم جرا لمدة 3، ID2، و 4.
>> بمجرد سماع ذلك نحن بحاجة إلى نسخ ولصق،
يجب أن نبدأ في التفكير أن هناك حلا أفضل.
الآن ماذا لو كنت أدرك أنك لا تحتاج معرفات الطالب 5 ولكن بدلا 7؟
كنت بحاجة إلى العودة إلى التعليمات البرمجية المصدر وإضافة في id5، وهو ID6،
ونسخ ولصق المنطق للتحقق إذا كان معرفات تنتمي إلى فئة لهذه معرفات 2 جديدة.
لا يوجد شيء يربط كل هذه المعرفات معا، وحتى لا يكون هناك أي وسيلة لطلب
برنامج للقيام بذلك لمعرفات من 0 إلى 6.
الآن كنت أدرك جيدا أن يكون لديك معرفات الطالب 100.
انها بداية لتبدو أقل من مثالية في حاجة إلى أن تعلن بشكل منفصل كل من هذه المعرفات،
ونسخ ولصق أي منطق لتلك معرفات جديدة.
ولكن ربما نحن مصممون، ونحن نفعل ذلك لجميع الطلاب 100.
ولكن ماذا لو كنت لا تعرف كم عدد الطلاب هناك في الواقع؟
هناك فقط بعض الطلاب ون البرنامج أن يسأل المستخدم ما أن n هو.
اه اه. هذا لن تعمل بشكل جيد جدا.
البرنامج يعمل فقط لعدد ثابت من بعض الطلاب.
>> حل كل هذه المشاكل هو جمال صفائف.
فما هو مجموعة؟
في بعض لغات البرمجة قد نوع مصفوفة تكون قادرة على أن تفعل شيئا أكثر من ذلك،
ولكن هنا سوف نركز على هيكل مجموعة البيانات الأساسية تماما كما سوف نرى ذلك في C.
مجموعة هو مجرد كتلة كبيرة من الذاكرة. هذا هو.
عندما نقول لدينا مجموعة من 10 أعداد صحيحة، وهذا يعني فقط أن لدينا بعض كتلة
الذاكرة التي هي كبيرة بما يكفي لعقد 10 أعداد صحيحة منفصلة.
على افتراض أن عدد صحيح هو 4 بايت، وهذا يعني أن مجموعة من 10 أعداد صحيحة
هو كتلة من 40 بايت المستمر في الذاكرة.
حتى عند استخدام المصفوفات متعددة الأبعاد، ونحن لن نذهب إلى هنا،
انها لا تزال مجرد كتلة كبيرة من الذاكرة.
منهج متعدد الأبعاد هو مجرد الراحة.
إذا كان لديك لمدة 3 بنسبة 3 مجموعة من الأعداد الصحيحة متعددة الأبعاد،
ثم البرنامج حقا علاج هذا على أنه مجرد كتلة كبيرة من 36 بايت.
العدد الكلي من الأعداد الصحيحة هي 3 مرات 3، ولكل عدد صحيح يستغرق 4 بايت.
>> دعونا نلقي نظرة على مثال الأساسية.
يمكننا أن نرى هنا 2 طرق مختلفة للإعلان صفائف.
علينا أن التعليق 1 من اخراجها للبرنامج لتجميع
منذ نعلن X مرتين.
سوف نلقي نظرة على بعض الاختلافات بين هذه الأنواع 2 من الإعلانات في بعض الشيء.
كل من هذه الخطوط تعلن مجموعة من حجم N،
حيث قمنا بتعريف # N إلى 10.
يمكننا بسهولة تماما كما طلبت من المستخدم للحصول على عدد صحيح موجب
والتي تستخدم عدد صحيح وعدد من العناصر في مجموعتنا.
مثل مثالنا هوية الطالب قبل، وهذا هو نوع من مثل اعلان منفصل تماما 10
المتغيرات الوهمية؛ X0، X1، X2، وهلم جرا حتى XN-1.
تجاهل الخطوط حيث نعلن الصفيف، لاحظ الأقواس المربعة سليمة
داخل لحلقات.
عندما نكتب شيئا مثل X [3]، والتي سوف تقرأ تماما كما قوس × 3،
يمكنك التفكير في الأمر كمن يسأل لX3 الخيالي.
لاحظت من مع مجموعة من حجم N، وهذا يعني أن عدد الأقواس من داخل،
التي سنقوم استدعاء مؤشر يمكن أن يكون أي شيء 0-1-N،
وهو ما مجموعه مؤشرات N.
>> للتفكير في كيف يعمل هذا في الواقع
نتذكر أن مجموعة هو كتلة كبيرة من الذاكرة.
على افتراض أن عدد صحيح هو 4 بايت، X مجموعة كاملة هو كتلة 40 بايت من الذاكرة.
حتى X0 يشير إلى 4 بايت الأولى من الكتلة.
X [1] يشير إلى بايت 4 التالي وهكذا.
هذا يعني أن x هو بداية كل برنامج من أي وقت مضى بحاجة إلى تتبع.
إذا كنت ترغب في استخدام X [400]، ثم البرنامج يعرف أن هذا هو ما يعادل
لمجرد بايت 1600 بعد بدء X.
Where'd نحصل على 1600 بايت من؟ انها مجرد 400 مرة في 4 بايت عدد صحيح.
>> قبل الانتقال، من المهم جدا أن ندرك أن في C
ليس هناك من مؤشر إنفاذ التي نستخدمها في الصفيف.
لدينا كتلة كبيرة فقط 10 أعداد صحيحة طويلة، ولكن شيئا لن يصيح علينا إذا نحن نكتب X [20]
أو حتى العاشر [-5].
المؤشر لا بل يجب أن تكون عددا.
يمكن أن يكون أي تعبير التعسفي.
في برنامج نستخدم المتغير من أنا لحلقة لمؤشر إلى الصفيف.
هذا هو نمط شائع جدا، حلقات من 0 = ط لطول الصفيف،
ثم استخدام ط كفهرس للمجموعة.
وبهذه الطريقة يمكنك حلقة فعال على مجموعة بأكملها،
ويمكنك تعيين إما إلى كل بقعة في الصفيف أو استخدامه لبعض الحساب.
>> في أول حلقة ل، أنا يبدأ في 0،
وذلك سوف يسند الى بقعة 0 في الصفيف، القيمة 0 مرات 2.
ثم أنا الزيادات، ونحن تعيين المركز الأول في الصفيف القيمة 1 مرات 2.
ثم أنا الزيادات مرة أخرى وهلم جرا حتى نعلق لوضع N-1 في الصفيف
قيمة N-1 مرات 2.
حتى لقد أنشأنا مجموعة مع الأرقام حتى أول 10.
ربما يسوي كان أفضل اسم للمتغير قليلا من X،
ولكن من شأنه أن يعطي أن الأمور بعيدا.
والثانية للحلقة ثم يطبع فقط القيم التي لدينا بالفعل المخزنة داخل الصفيف.
>> دعونا نحاول تشغيل البرنامج مع كلا النوعين من الإعلانات مجموعة
ونلقي نظرة على الإخراج من البرنامج.
بقدر ما يمكننا أن نرى، برنامج يتصرف بنفس الطريقة لكلا النوعين من الإعلانات.
دعونا نلقي أيضا نظرة على ما يحدث إذا قمنا بتغيير حلقة أول من لا تتوقف عند N
لكنهم يقولون بدلا 10،000.
الطريق إلى ما بعد نهاية الصفيف.
عفوا. ربما كنت قد رأيت هذا من قبل.
A خطأ تجزئة يعني البرنامج قد تحطمت.
أنت تبدأ في رؤية هذه المناطق عند لمس من الذاكرة يجب أن لا يتم لمس.
هنا نحن لمس 10000 مواقع وراء بداية العاشر،
وهو الواضح مكانا في الذاكرة ونحن لا ينبغي أن لمس.
لذلك معظمنا ربما لن يضع بطريق الخطأ بدلا من 10000 N،
ولكن ماذا لو أن نفعل شيئا أكثر دهاء مثل يقول الكتابة أقل من أو يساوي N
في حالة حلقة لفي مقابل أقل من N.
تذكر أن لديه مجموعة مؤشرات فقط 0 حتي 1-N،
وهو ما يعني أن المؤشر N بعد نهاية الصفيف.
قد لا تعطل البرنامج في هذه الحالة، لكنه ما زال خطأ.
في الواقع، وهذا خطأ شائع بحيث يتضمن اسم هو نفسه،
وبحلول 1 من الخطأ.
>> هذا كل شيء عن الأساسيات.
فما هي الاختلافات الرئيسية بين أنواع الإعلانات 2 من مجموعة؟
فارق واحد هو المكان الذي كتلة كبيرة من الذاكرة يذهب.
في أول إعلان، والتي سوف أسميه نوع قوس مصفوفة،
وإن كان هذا هو بأي حال من الأحوال اسم التقليدية،
وسوف تذهب على المكدس.
بينما في الحالة الثانية، والتي سوف استدعاء نوع مؤشر مصفوفة، وسوف تذهب على الكومة.
هذا يعني أنه عندما ترجع الدالة، سوف تلقائيا مجموعة قوس يمكن deallocated،
في حين ويجب استدعاء explicitily الحرة على مجموعة مؤشر
وإلا لديك تسرب الذاكرة.
بالإضافة إلى ذلك، مجموعة قوس ليست في الواقع المتغير.
هذا هو المهم. انها مجرد رمز.
يمكنك التفكير في الأمر على النحو ثابت أن يختار المترجم لك.
هذا يعني أننا لا نستطيع أن نفعل شيئا مثل X + + مع نوع قوس،
وإن كان هذا صحيحا تماما مع نوع مؤشر.
>> نوع المؤشر هو متغير.
لنوع المؤشر، لدينا 2 بنات منفصلة من الذاكرة.
يتم تخزين المتغير x نفسها في كومة ومجرد مؤشر واحد،
ولكن يتم تخزين كتلة كبيرة من الذاكرة على الكومة.
المتغير x على المكدس مجرد مخازن عنوان
من كتلة كبيرة من الذاكرة على الكومة.
احد الآثار المترتبة على هذا هو مع حجم المشغل.
إذا كنت تسأل عن حجم مجموعة قوس، سوف تعطيك حجم كتلة كبيرة من الذاكرة،
شيء من هذا القبيل 40 بايت،
ولكن إذا كنت تسأل عن حجم ونوع من مؤشر مجموعة،
سوف تعطيك حجم X متغير نفسها، والتي على الجهاز ومن المرجح فقط 4 بايت.
استخدام نوع مؤشر مصفوفة، فإنه من المستحيل أن نسأل مباشرة عن
حجم كتلة كبيرة من الذاكرة.
هذا ليس بكثير عادة من تقييد لأننا نادرا ما تريد حجم
من كتلة كبيرة من الذاكرة، ويمكننا حساب عادة ما إذا كنا في حاجة إليها.
>> وأخيرا، فإن مجموعة قوس يحدث لتوفر لنا اختصار لتهيئة صفيف.
دعونا نرى كيف يمكن أن يكتب أول 10 أعداد صحيحة حتى باستخدام initilization المختصرة.
مع مجموعة المؤشر، وليس هناك طريقة للقيام اختصار مثل هذا.
هذه مجرد مقدمة لما يمكنك القيام به مع المصفوفات.
أنها تظهر في البرنامج تقريبا كل تكتب.
نأمل أن تشاهد الآن طريقة أفضل للقيام المثال معرفات الطالب
من بداية الفيديو.
>> اسمي روب بودين، وهذا هو CS50.