[عزف الموسيقى] DOUG لويد: حسنا. العمل مع واحد المتغيرات هي متعة جميلة. ولكن ماذا لو اننا نريد ان نعمل مع الكثير من المتغيرات، لكننا لا نريد أن يكون مجموعة من أسماء مختلفة تحلق حولها رمز لنا؟ في هذه الحالة، هي المصفوفات سوف يأتي في متناول اليدين حقا. المصفوفات هي البيانات الأساسية حقا هيكل لأي لغة البرمجة التي ستستخدمها. وانهم حقا ومفيدة حقا، بشكل خاص، كما سنرى، في CS 50. نحن نستخدم المصفوفات لعقد قيم نفس نوع البيانات في مواقع الذاكرة القريبة. وهذا هو القول، انها طريقة ما في وسعنا مجموعة مجموعة من الأعداد الصحيحة معا في الذاكرة أو مجموعة من الأحرف أو تعوم في الذاكرة حقا قريبة من بعضها البعض والعمل معهم دون الحاجة لإعطاء كل اسم واحد فريدة من نوعها، والتي يمكن الحصول على مرهقة بعد قليل. الآن، طريقة واحدة للمقايسة صفائف غير أن نفكر آخر في منطقتك مكتب لثانية واحدة. لذلك الابتعاد عن البرمجة وعادل تغمض عينيك وتصور في عقلك مكتب البريد المحلي. عادة، في معظم آخر المكاتب، وهناك مصرف كبير وصناديق البريد على الحائط. مجموعة هي كتلة عملاقة من الذاكرة القريبة، بنفس الطريقة التي البريد البنك في مكتب البريد الخاص بك هو مساحة كبيرة على جدار مكتب البريد. وقد تم تقسيم المصفوفات داخل صغيرة، تماثل كتل الحجم من الفضاء، كل منها يسمى عنصر، في بنفس الطريقة التي جدار آخر وقد تم تقسيم المكتب إلى صغيرة، تماثل كتل الحجم من الفضاء، وهو ما نسميه صندوق بريد. كل عنصر من عناصر المصفوفة يمكن تخزين كمية معينة من البيانات، كما أن كل صندوق بريد قادر عقد كمية معينة من البريد. ما يمكن تخزينها في كل عنصر من عناصر مجموعة هي المتغيرات من نفس البيانات نوع، مثل صحيح أو حرف، فقط كما هو الحال في صناديق البريد الخاص بك، أنت يمكن أن يصلح الأمور فقط من نفس النوع، مثل الرسائل أو الطرود الصغيرة. وأخيرا، يمكننا الوصول إلى كل عنصر من عناصر مجموعة مباشرة عن طريق الرقم القياسي، كما يمكننا الوصول إلى مكتب البريد لدينا مربع من خلال معرفة رقم صندوق البريد ل. نأمل أن القياس يساعدك على الحصول على رأسك حول فكرة صفائف من قبل تشابه إلى شيء آخر أنك ربما مألوفة بالفعل مع. في C وعناصر المصفوفة هي فهرستها بدءا من 0، وليس من 1. وهذا هو المهم حقا. وفي الواقع، وهذا هو السبب في أننا، في CS 50، ولماذا علماء الكمبيوتر في كثير من الأحيان سوف عد من 0، هو بسبب مجموعة C في الفهرسة، الذي يبدأ دائما عند 0. إذا كان الأمر كذلك مجموعة تتكون من عناصر ن، العنصر الأول من تلك مجموعة يقع في الفهرس 0، و العنصر الأخير للصفيف يقع في مؤشر ن ناقص 1. مرة أخرى، إذا كان هناك عناصر ن في موقعنا مجموعة، المؤشر الأخير هو ن ناقص 1. إذا كان الأمر كذلك مجموعة لديها 50 عناصر، و يقع العنصر الأول في الفهرس 0، والعنصر الأخير يقع في مؤشر 49. لسوء الحظ، أو لحسن الحظ، حسب وجهة نظرك، C هو متساهل جدا هنا. انها لن تمنعك من الخروج من حدود مجموعة الخاصة بك. هل يمكن الوصول إلى ناقص 3 عنصر من مجموعة الخاصة بك أو العنصر ال59 من مجموعة الخاص بك، إذا مجموعة لديه 50 عناصر فقط. انها لن توقف البرنامج من تجميع، ولكن في وقت التشغيل، كنت قد واجهت خطأ تجزئة اللعين إذا كنت تبدأ في الوصول إلى الذاكرة هذا هو خارج حدود ما هل سألت البرنامج لإعطائك. لذلك كن حذرا. ماذا مجموعة إعلان تبدو وكأنها؟ كيف يمكننا رمز مجموعة إلى حيز الوجود وكأننا رمز أي متغير آخر؟ هناك ثلاثة أجزاء لمجموعة declaration-- نوع، اسم، والحجم. وهذا مشابه جدا ل تعريف متغير، التي هو مجرد نوع واسم، العنصر حجم يجري حالة خاصة بالنسبة للمجموعة، لأننا الحصول على حفنة منهم في نفس الوقت. لذلك النوع هو نوع المتغير الذي تريد كل عنصر من عناصر المصفوفة أن يكون. هل تريد أن مجموعة من الأعداد الصحيحة؟ ثم، يجب أن يكون نوع البيانات INT. هل تريد أن تكون مجموعة من الزوجي أو العوامات؟ يجب أن يكون نوع بيانات مزدوج أو تطفو. الاسم هو ما كنت تريد الاتصال به مجموعة الخاصة بك. ماذا تريد أن تسمي هذا العملاق بنك صحيحة أو العوامات أو حرف أو الزوجي، أو أيا كان أن يكون لك؟ ماذا تريد أن نسميها؟ جميلة النفس التفسيرية. وأخيرا، وحجم، والذي يذهب داخل الأقواس المعقوفة، هو عدد العناصر تفعل مثل مجموعة الخاصة بك لاحتواء. كم عدد الأعداد الصحيحة تريد؟ كم عدد يطفو تريد؟ هكذا على سبيل المثال، كثافة العمليات درجات الطالب 40. هذا تعلن مجموعة تسمى الطلاب الدرجات، والذي يتألف من 40 الأعداد الصحيحة. جميلة النفس التفسيرية، وآمل. وهنا مثال آخر. أسعار القائمة مزدوجة 8. وهذا يخلق مجموعة تسمى أسعار القائمة، التي تتألف من الغرفة في الذاكرة لمدة ثمانية أضعاف. إذا كنت تعتقد أن كل عنصر من صفيف نوع من نوع البيانات، ذلك على سبيل المثال، عنصر واحد من مجموعة من نوع int، بنفس الطريقة التي قد يعتقد أي دولة أخرى متغير من نوع int، جميع العمليات المألوفة التي نحن نوقشت سابقا في عمليات الفيديو سوف يكون له معنى. حتى هنا، يمكننا أن تعلن مجموعة من القيم المنطقية دعا Truthtable، والذي يتكون من غرفة لمدة 10 القيم المنطقية. وبعد ذلك، تماما مثل نتمكن من تعيين فقط قيمة أي متغير آخر من نوع منطقية، يمكن أن نقول شيئا مثل Truthtable قوس مربع 2، وهي الطريقة التي تبين لنا، أي عنصر من الجدول الحقيقة؟ العنصر الثالث لل جدول الحقيقة، لأن تذكر، نحن العد من 0. لذلك هذه هي الطريقة التي تدل على العنصر الثالث في جدول الحقيقة. Truthtable 2 يساوي كاذبة، تماما مثل يمكننا أن declare-- أو أننا يمكن تعيين، بدلا من ذلك، أي نوع منطقية متغير لتكون كاذبة. يمكننا أيضا استخدامه في الظروف. إذا (truthtable 7 == صحيح)، وهذا يعني، إذا كان العنصر الثامن من Truthtable غير صحيح، ربما نحن نريد لطباعة رسالة للمستخدم، printf ("TRUE! ن") ؛. ما يجعلنا نقول Truthtable 10 يساوي صحيح، أليس كذلك؟ حسنا، أستطيع، لكنه جميلة خطورة تذكر ل، لدينا مجموعة من 10 القيم المنطقية. وبالتالي فإن أعلى مؤشر على أن وقد أعطى مترجم لنا هو 9. وهذا البرنامج ترجمة، ولكن إذا كان هناك شيء آخر في الذاكرة موجود حيث كنا نتوقع Truthtable 10 للذهاب، نحن يمكن أن تعاني تجزئة الخطأ. نحن قد تفلت من العقاب، ولكن بصفة عامة، خطير جدا. ذلك ما أفعله هنا هو C القانوني، ولكن ليس بالضرورة أفضل الخطوة. الآن، عندما تقوم بتعريف و تهيئة مجموعة في وقت واحد، هناك في الواقع جميلة تركيب خاص لك يمكن استخدامها لملء مجموعة مع القيم انطلاق لها. فإنه يمكن الحصول على مرهقة ل أعلن مجموعة من حجم 100، ومن ثم يجب أن أقول، العنصر 0 يساوي هذا. العنصر 1 يساوي ذلك؛ العنصر 2 يساوي ذلك. ما هي النقطة، أليس كذلك؟ اذا كان مجموعة صغيرة، كنت يمكن أن تفعل شيئا من هذا القبيل. منطقي truthtable 3 يساوي مفتوحة متعرج ثم فاصلة فصل قائمة العناصر ان كنت تريد أن تضع في المصفوفة. ثم أغلق مجعد هدفين منقوطة. وهذا يخلق مجموعة من حجم ثلاثة دعا Truthtable، مع العناصر كاذبة، صحيح، وصحيح. وفي الواقع، فإن مثيل جملة لدي هنا بالضبط نفس تفعل الفردي تركيب عنصر أدناه. هذه الطرق اثنين من الترميز شأنه إنتاج مجموعة نفسها بالضبط. وبالمثل، فإننا لا يمكن تكرار على جميع العناصر صفيف باستخدام حلقة، والتي، في الواقع، هو يوصى بشدة في المنزل ممارسة الرياضة. كيف يمكنك إنشاء صفيف 100 الأعداد الصحيحة، حيث كل عنصر من المصفوفة هو مؤشره؟ هكذا على سبيل المثال، لدينا مجموعة من 100 الأعداد الصحيحة، والعنصر الأول، نحن نريد ان نضع 0. في العنصر الثاني، نحن نريد ان نضع 1. في العنصر الثالث، نريد لوضع 2؛ وهلم جرا وهلم جرا. هذا هو حقا جيدة في المنزل ممارسة لفعل ذلك. هنا، لا يبدو كما تغيرت كثيرا. ولكن لاحظ أن في فترة ما بين بين قوسين معقوفين، وهذه المرة، لقد حذفت في الواقع الرقم. إذا كنت تستخدم هذا جدا مثيل خاص الجملة لخلق مجموعة، كنت لا فعلا تحتاج إلى الإشارة إلى حجم من مجموعة مسبقا. المترجم ذكي بما فيه الكفاية لمعرفة ان كنت فعلا تريد مجموعة من حجم 3، لأنك وضعت ثلاثة عناصر إلى يمين علامة المساواة. إذا كنت قد وضعت أربعة، فإنه سيتعين عليها منحك جدول الحقيقة من حجم الأربعة؛ وهلم جرا وهلم جرا. لا تقتصر صفائف إلى واحد البعد، وهو بارد جدا. هل يمكن أن يكون في الواقع أكبر عدد ممكن المحددات الجانب كما يحلو لك. هكذا على سبيل المثال، إذا كنت ترغب في إنشاء لوحة لعبة حربية، والتي، إذا كنت من أي وقت مضى لعبت، هي اللعبة التي هي لعبت مع أوتاد على 10 بنسبة 10 شبكة، هل يمكن إنشاء مجموعة من هذا القبيل. هل يمكن أن نقول منطقية بارجة ساحة قوس 10 مغلق مربع مربع قوس قوس 10 أغلق قوس مربع. وبعد ذلك، يمكنك اختيار ل تفسير هذا في عقلك و10 قبل 10 شبكة من الخلايا. الآن، في الواقع، في الذاكرة، هل حقا فقط يبقى العنصر 100، صفيف الأبعاد واحد. وهذا، في الواقع، ينطبق على إذا كنت لدينا ثلاثة أبعاد أو أربعة أو خمسة. حقا فقط لا تتضاعف جميع indices-- أو كل من حجم specifiers-- معا، وكنت مجرد الحصول على الأبعاد واحد مجموعة من هذا الحجم. ولكن من حيث التنظيم و التصور والإدراك البشري، يمكن أن يكون أسهل بكثير للعمل مع شبكة إذا كنت تعمل على لعبة مثل تيك تاك تو أو سفينة حربية، أو شيء من هذا القبيل. انها التجريد كبير، بدلا من الاضطرار للتفكير في تيك تاك تو مجلس كخط تسعة الساحات أو حربية المجلس كخط من 100 الساحات. A 10 بنسبة 10 شبكة أو ثلاثة قبل ثلاثة الشبكة هو على الارجح الكثير أكثر سهولة لإدراكه. الآن، في الواقع شيئا مهم حول المصفوفات. يمكننا أن نتعامل مع كل فرد عنصر من المصفوفة كمتغير. رأينا أنه في وقت سابق عندما كنا تعيين القيمة الحقيقية لبعض القيم المنطقية أو اختبارها في الشرطية. ولكن لا يمكننا علاج كامل صفائف أنفسهم المتغيرات. لا يمكننا، على سبيل المثال، تعيين مجموعة واحدة إلى مجموعة أخرى باستخدام الاحالة المشغل. انها ليست C. القانوني إذا كنا نريد أن، على ما example-- يمكن أن نفعله في هذا المثال سيكون لنسخ مجموعة إلى أخرى. إذا كنا نريد أن نفعل ذلك، ونحن في الواقع تحتاج إلى استخدام حلقة لنسخ أكثر كل عنصر على حدة واحدة في وقت واحد. وأنا أعلم أنه قليلا تستغرق وقتا طويلا. هكذا على سبيل المثال، إذا كان لدينا هذه زوجين من الأسطر من التعليمات البرمجية، فإن هذا العمل؟ حسنا، لا، لن، أليس كذلك؟ لأننا نحاول تعيين الغذاء إلى شريط. هذا ليس الذهاب إلى العمل، لأنه صفيف، وصفنا فقط أن هذا ليس C. القانوني بدلا من ذلك، إذا كنا نريد أن نسخ محتويات الطعام في شريط، وهو ما نحن نحاول القيام به هنا، نحن في حاجة الى جملة من هذا القبيل. لدينا للحلقة أن يذهب من J تساوي 0 إلى 5، ونحن زيادة J على كل التكرار حلقة وعناصر تعيين من هذا القبيل. هذا من شأنه أن يؤدي إلى شريط أيضا كونها واحدة، اثنان، ثلاثة، أربعة، خمسة، ولكن علينا أن نفعل ذلك هذا جدا بطيئة عنصر على حدة العنصر الطريق، بدلا من مجرد نسخ مجموعة بأكملها. في البرمجة الأخرى لغات، منها أكثر حداثة، يمكنك، في الواقع، لا مجرد بهذه البساطة يساوي بناء الجملة. لكن C، للأسف، نحن لا يسمح للقيام بذلك. الآن، هناك واحد آخر شيء أريد أن أذكر حول المصفوفات التي يمكن أن يكون قليلا صعبة بعض الشيء في المرة الأولى التي العمل معهم. ناقشنا في شريط فيديو حول نطاق متغير، أن معظم المتغيرات في C، عند استدعاء منهم في وظائف، يتم تمرير من حيث القيمة. هل تذكر ما يعنيه لتمرير شيء من حيث القيمة؟ وهذا يعني أننا نحقق نسخة من المتغير الذي يتم تمريره في. وظيفة المستدعي، وظيفة ان تلقي المتغير، لا تحصل على المتغير نفسه. فإنه يحصل بمفردها المحلية نسخة منه للعمل مع. المصفوفات، بطبيعة الحال، لا لا تتبع هذه القاعدة. بدلا من ذلك، ما نسميه هذا يمر بالرجوع. المستدعى الواقع لا تلقي مجموعة. أنها لا تلقي لها النسخة المحلية الخاصة بها. وإذا كنت تفكر في ذلك، وهذا الأمر يبدو معقولا تماما. إذا صفائف كبيرة حقا، فإنه يأخذ الكثير من الوقت والجهد لجعل نسخة من مجموعة من 100 أو 1000 أو 10000 العناصر، أنه لا يستحق ذلك ل تعمل للحصول على نسخة منه، القيام ببعض العمل معها، ومن ثم مجرد القيام به مع نسخة. أنها لا تحتاج إلى أن يكون كان التسكع بعد الآن. لأن المصفوفات هي بعض ضخمة ومرهقة، نحن فقط تمريرها حسب المرجع. ونحن على ثقة من أن وظيفة فقط ل، لا كسر أي شيء. لذلك لا تحصل في الواقع مجموعة. انها لا تحصل على نسختها المحلية الخاصة بها. فماذا يعني هذا، ثم، عندما المستدعى تعالج عناصر المصفوفة؟ ما يحدث؟ في الوقت الراهن، ونحن سوف يتستر على ماذا بالضبط هذا يحدث، لماذا المصفوفات يتم تمرير بالرجوع وكل شيء يتم تمريرها من حيث القيمة. لكنني أعدكم، ونحن سوف العودة وتعطيك الجواب لهذا في شريط فيديو في وقت لاحق. هنا واحد أكثر ممارسة لك قبل أن يختتم الأمور على المصفوفات. باقة من التعليمات البرمجية هنا، وهذا هو لا سيما اسلوب جيد، فقط لأنني سوف تجعل هذا التحذير. لا يوجد تعليقات هنا، وهو شكل سيء جدا. ولكن هذا فقط لأنني أريد أن أكون قادرة على احتواء كل شيء على الشاشة. في الجزء العلوي، يمكنك أن ترى أن لدي إعلانين وظيفة لمجموعة مجموعة ووضع الباحث. مجموعة مجموعة على ما يبدو يأخذ مجموعة أربعة أعداد صحيحة كمدخل لها. ومجموعة الباحث يأخذ على ما يبدو عدد صحيح واحد كمدخل لها. ولكن كلا منهم لم يكن لديك الانتاج. الإخراج، وعودة اكتب، كل واحد باطل. في منزل لدينا بضعة أسطر من التعليمات البرمجية. نعلن متغير عدد صحيح دعا وتعيين القيمة 10. نعلن مجموعة من أربعة أعداد صحيحة دعا B وتعيين العناصر 0، 1، 2، و 3، على التوالي. ثم، لدينا دعوة لضبط كثافة العمليات ودعوة لضبط مجموعة. تعاريف مجموعة مجموعة ومجموعة الباحث هي الأسفل، في الجزء السفلي. وهكذا، مرة أخرى، وأنا أسألك هذا السؤال. ما يحصل طباعتها هنا في نهاية الرئيسي؟ هناك عمود المطبوعة. أنا طبع عددين. أنا طبع محتويات ألف و محتويات B ساحة قوس 0. وقفة الفيديو هنا واتخاذ دقيقة. يمكنك معرفة ما هو هذا وظيفة طباعة في نهاية المطاف؟ نأمل، إذا كنت أذكر الفرق بين النجاح من حيث القيمة ويمر بالرجوع، وهذا كانت المشكلة ليست صعبة جدا بالنسبة لك. والجواب تفعل وقد وجدت غير ذلك. إذا لم تكن متأكدا حقا ل لماذا كان هذا هو الحال، تأخذ ثانية، أعود، ومراجعة ما كنت فقط مناقشة حول تمرير المصفوفات بالإشارة، مقابل تمرير المتغيرات الأخرى من حيث القيمة، ونأمل، وأنها سوف تجعل أكثر قليلا معنى. أنا دوغ ويد، وهذا هو CS50.