الإعلان عن مصفوفة أحادية البعد. ما هي المصفوفة؟ مثال على حل مسألة باستخدام صفائف باسكال

باستثناء نوع الملف. يسمى نوع المكون النوع الأساسي. يمكن تعريف كل مكون بشكل صريح باستخدام اسم متغير الصفيف متبوعًا بين قوسين مربعين فِهرِس. نوعهم يسمى نوع الفهرس. الوقت اللازم للوصول إلى أي مكون مستقل عن قيمة الفهرس. لذلك، يمكننا التحدث عن المصفوفات ككائنات تسمح بنيتها بذلك عشوائي(أو مستقيم) وصول.

الإعلان عن متغيرات نوع المصفوفة

تم وصف متغير نوع المصفوفة في قسم تعريف المتغير بالشكل التالي:

فار<идентификатор>:مجموعة مصفوفة[<тип индекса>] ل<тип компонент>

نوع الفهرس الأكثر استخدامًا هو نوع الفاصل الزمني. على سبيل المثال، سيتم وصف مجموعة أحادية البعد لمتوسط ​​درجات الحرارة الشهرية على النحو التالي:

var T: مجموعة حقيقية؛

يحدد وصف المصفوفة، أولاً، موضع المصفوفة في الذاكرة، وثانيًا، قواعد استخدامها مرة أخرى في البرنامج. توجد عناصر المصفوفة المتتالية في خلايا الذاكرة المتعاقبة (T، T، إلخ)، ويجب ألا تقع قيم الفهرس خارج النطاق 1...12. يمكن استخدام أي تعبير من النوع المناسب كفهرس. على سبيل المثال:

ت، ت

يمكن أن يكون نوع الفهرس أي نوع ترتيبي عددي باستثناء العدد الصحيح (في تطبيق Turbo Pascal). على سبيل المثال، قد يحتوي البرنامج على الأوصاف التالية:

var Cod: مجموعة من 1..100؛ L: مجموعة شار؛

في مثل هذا البرنامج، يُسمح بالرموز التالية لعناصر المصفوفة:

كود["x"]; لام؛ سمك القد؛ لام؛

في بعض الحالات، قد يكون من المناسب استخدام نوع معدود كفهرس. على سبيل المثال، يمكن تخزين البيانات المتعلقة بعدد الطلاب في الصفوف الأربعة العاشرة بمدرسة واحدة في المصفوفة التالية:

نوع الفهرس=(أ، ب، ج، د)؛ Var Class_10: مجموعة من البايتات؛

وإذا، على سبيل المثال، العنصر Class_10[أ]يساوي 35، هذا يعني أن هناك 35 شخصًا في الصف 10 "أ". تعمل هذه الفهرسة على تحسين رؤية البرنامج.

غالبًا ما يتم إعطاء النوع المنظم اسمًا في قسم النوع، والذي يتم استخدامه بعد ذلك في قسم تعريف المتغير.

اكتب Mas1 = مجموعة من الأعداد الصحيحة؛ Mas2 = المصفوفة [-10..10] من الحرف؛ فار نوم: Mas1؛ سيم: ماس2؛

مصفوفات متعددة الأبعاد

يتم التعامل مع المصفوفة متعددة الأبعاد في باسكال على أنها مصفوفة أحادية البعد، ونوع العنصر فيها هو أيضًا مصفوفة (مصفوفة من المصفوفات). على سبيل المثال، يمكن تخزين متوسط ​​درجة الحرارة الشهرية لمدة 10 سنوات في مصفوفة موضحة على النحو التالي:

Var H: مجموعة من المصفوفات الحقيقية؛

فيما يلي أمثلة لتعيين بعض عناصر هذه المصفوفة:

ن؛ ن؛ ن؛

ومع ذلك، يتم استخدام شكل آخر مكافئ لتعيين عناصر المصفوفة ثنائية الأبعاد في أغلب الأحيان:

ن؛ ن؛ ن؛

يمثل المتغير H الصف الأول بأكمله من الجدول، أي. مجموعة كاملة من درجات الحرارة لعام 1981. وهناك خيار آخر، يعادل الوصف أعلاه، وهو ما يلي:

اكتب الشهر = مجموعة حقيقية؛ السنة = مجموعة من الشهر؛ فار ح:السنة؛

أقصر طريقة لوصف هذه المصفوفة هي كما يلي:

Var H: مجموعة حقيقية؛

يمكن تعريف المصفوفة ثلاثية الأبعاد بأنها مصفوفة أحادية البعد تكون عناصرها عبارة عن مصفوفات ثنائية الأبعاد. فيما يلي مثال لوصف مصفوفة ثلاثية الأبعاد:

فار أ: مجموعة من الأعداد الصحيحة؛

هذه مصفوفة تتكون من 10x20x30 = 6000 عدد صحيح وتستهلك 6000x2 = 12000 بايت في الذاكرة. في باسكال لا يوجد حد أعلى لحجم المصفوفة. ومع ذلك، فإن كل تطبيق محدد لـ Pascal يحد من مقدار الذاكرة المخصصة للمصفوفات.

قياسًا على الرياضيات، غالبًا ما تسمى المصفوفات الرقمية أحادية البعد بالمتجهات، وتسمى المصفوفات ثنائية الأبعاد بالمصفوفات. لا يمكن تغيير حجم المصفوفات في وقت التشغيل. يتم تغيير حجم المصفوفة من خلال تغيير نص البرنامج وإعادة ترجمته. لتبسيط هذه التغييرات، من المناسب تحديد معلمات الفهرس في قسم الثوابت:

كونست إيماكس = 10؛ جماكس=20; فار ماس: مجموعة من الأعداد الصحيحة؛

الآن، لتغيير أحجام مجموعة Mas وجميع بيانات البرنامج المرتبطة بهذه الأحجام، يكفي تحرير سطر واحد فقط في البرنامج - قسم الثوابت.

عمليات المصفوفة

الإجراءات على مجموعة ككل. ولا يجوز مثل هذه الأفعال إلا في حالتين:

  • تعيين القيم من صفيف إلى آخر؛
  • العمليات العلائقية "متساوية" و"غير متساوية".

في كلتا الحالتين، يجب أن تحتوي المصفوفات على نفس الأنواع (نوع الفهرس ونوع العنصر). مثال:

Var P, Q: مجموعة حقيقية؛

عند تنفيذ عملية التخصيص P:= Q، ستصبح جميع عناصر المصفوفة P مساوية للعناصر المقابلة للمصفوفة Q.

في المصفوفات متعددة الأبعاد، يمكن للمتغير ذو الفهرس أن يمثل المصفوفة بأكملها. على سبيل المثال، إذا كنت تريد في الجدول H أن تكون بيانات عام 1989 هي نفسها لعام 1981 (يتم تعيين الصف التاسع على قيمة الصف الأول)، فيمكن القيام بذلك على النحو التالي:

ن := ن؛

وإذا كنت بحاجة إلى تبديل قيم هذه الأسطر، يتم ذلك من خلال متغير ثالث من نفس النوع:

ف:= ن؛ ن := ن؛ ن := ف؛

حيث يتم وصف P مثل هذا:

فار P: مجموعة من الحقيقي؛

معالجة المصفوفة

تتم معالجة المصفوفات في البرامج مكونًا تلو الآخر. فيما يلي أمثلة لإدخال القيم في المصفوفات:

بالنسبة إلى I:= 1 إلى 12، قم بقراءة readln(T[I]); for I:= 1 to IMax do for J:= 1 to JMax do readln(Mas);

وهنا، سيتم إدخال كل قيمة لاحقة في سطر جديد. بالنسبة للإدخال سطرًا تلو الآخر، يتم استخدام عامل القراءة. وبالمثل، في حلقة باستخدام متغير فهرس، يتم تنظيم إخراج قيم المصفوفة. على سبيل المثال:

بالنسبة إلى:= 1 إلى 12 اكتب(T[I]:8:4);

ينظم جزء البرنامج التالي عرض المصفوفة صفًا تلو الآخر على الشاشة:

بالنسبة لـ I:= 1 إلى IMax، ابدأ بـ J:= l إلى JMax do write(Mas:6); كتابة؛ نهاية؛

بعد طباعة الصف التالي من المصفوفة، سيقوم عامل writeln بدون معلمات بتحريك المؤشر إلى بداية السطر الجديد. تجدر الإشارة إلى أنه في المثال الأخير سيتم الحصول على المصفوفة الموجودة على الشاشة بالشكل الطبيعي لجدول مستطيل إذا كان JMax لا يتجاوز 12.

المصفوفات الديناميكية

تمت إضافة ميزة مثيرة للاهتمام إلى FreePascal وDelphi لوصف المصفوفات دون تحديد الأبعاد، وبالتالي حدود تغيير الفهارس:

Var IntArray: مجموعة من الأعداد الصحيحة؛

هذه المصفوفات ديناميكية ولها طول صفري في البداية. يتم تحديد حجم المصفوفة وتحديده أثناء تنفيذ البرنامج بنفس الطريقة المتبعة مع السلاسل باستخدام الوظائف اضبط الطولو طول، على التوالى. يتم ترقيم العناصر في هذه الحالة بدءًا من الصفر.

برنامج باستخدامDynamicArrays1; فار أ، ب: مجموعة من الأعداد الصحيحة؛ (وصف متغيرين - المصفوفات الديناميكية للعناصر الصحيحة) يبدأ SetLength(A, 5); (ضبط حجم المصفوفة أ (5 عناصر)) A := 1; (تعيين القيمة 1 لعنصر الصفيف A بالرقم 0) النهاية.

متغيرات المصفوفة الديناميكية هي مؤشرات ويتم تنفيذ العمليات معها كما هو الحال مع المؤشرات. على سبيل المثال، عند تعيين مصفوفة إلى أخرى، لا يتم نسخ عناصر مصفوفة واحدة إلى المصفوفة الثانية، ولكن يتم نسخ عنوان المصفوفة. وبناء على ذلك، يتم إجراء مقارنة بين صفيفين في التعبيرات المنطقية من النوع "يساوي - غير متساوي" عن طريق مقارنة العناوين. مثال على تخصيص مصفوفة إلى أخرى:

برنامج باستخدامDynamicArrays2؛ var A, B: مجموعة من الأعداد الصحيحة؛ (وصف متغيرين - المصفوفات الديناميكية للعناصر الصحيحة) يبدأ SetLength(A, 5); (ضبط حجم المصفوفة A (5 عناصر)) A := 14; (تعيين القيمة 14 للعنصر الصفري للصفيف A) B:= A; (تخصيص المصفوفة A للمصفوفة B، الآن يشير المتغيران A و B إلى نفس المصفوفة) B := 2; (تعيين العنصر الصفري للمصفوفة B للقيمة 2، والآن العنصر الصفري للمصفوفة A له أيضًا القيمة 2) النهاية.

دعونا نلاحظ اختلافًا كبيرًا في العمل مع السلاسل والمصفوفات الديناميكية، التي لها نفس التمثيل الداخلي بناءً على المؤشرات، لكن طرق العمل مختلفة. تعتبر سلسلتان مختلفتان تحتويان على نفس مجموعة الأحرف متساويتين، لكن صفيفين مختلفين يحتويان على نفس العناصر غير متساويين.

يتيح لك وصف المصفوفة استخدام أي من عناصرها في البرنامج. يتم استخدام المتغيرات المفهرسة للإشارة إلى عناصر المصفوفة في لغة C.

المتغير المفهرس (تعبير الفهرس)- تعيين خلية لتخزين عنصر المصفوفة. يُشار إليه بتحديد معرف الصفيف وفهرس (فهارس) العناصر.

ü انتبه! خصوصية تسمية عناصر المصفوفة في لغة C هي ترقيم المؤشرات بدءًا من 0 وليس من 1. لذلك، فإن المؤشرات في لغة C أقل بمقدار واحد من تلك المحددة رياضيًا. ويجب مراعاة هذا الظرف في البرنامج، خاصة عند تكوين شرط تكرار (الخروج) الدورة.

مخطط تخصيص الذاكرة لتخزين مصفوفة أحادية البعد هو كما يلي:

يتم تحديد طول الخلية التي سيتم تخزين كل عنصر فيها حسب نوع المصفوفة:

· الحرف – 1 بايت;

· عدد صحيح – 2 بايت.

· حقيقي – 4 بايت.

· دقة مزدوجة – 8 بايت.

بنية التدوين للمتغير المفهرس لمصفوفة أحادية البعد:

اسم[فهرس]

حيث الاسم هو معرف الصفيف؛

الفهرس - مُعامل من النوع الصحيح الذي يحدد عدد العناصر من بين العناصر الأخرى التي تشكل المصفوفة؛

- محددات الفهرس.

على سبيل المثال، في المصفوفة D(16) الموصوفة سابقًا، يُشار إلى العنصر الأول بتعبير الفهرس d، والثاني بـ d، والتيار بـ d[i]، والعنصر قبل الأخير بـ d والأخير بـ d.

إذا لزم الأمر، يمكن تحديد الفهرس بواسطة تعبير حسابي. على سبيل المثال، د أو د. على أية حال، في وقت استخدام المتغير، يجب تحديد (حساب) الفهرس ويجب أن تقع القيمة الناتجة ضمن النطاق المحدد بواسطة الواصف.

ينطبق المثال المدروس لتحديد عناصر المصفوفة D على أي من المصفوفات أحادية البعد الموصوفة.

تسمح المتغيرات المفهرسة بتنفيذ البرامج للخوارزميات باستخدام عناصر المصفوفة. علاوة على ذلك، بالنسبة للمصفوفة أحادية البعد، يتيح لك المتغير المفهرس تحديد العنوان المحدد لكل عنصر.

يتم تحديد عنوان أي متغير بواسطة العملية &. ولذلك، فإن عنوان العنصر d هو &d، وعنوان d[i] هو &d[i]، أي. توجد جميع عناصر المصفوفة خطيًا في ذاكرة الوصول العشوائي (RAM)، بدءًا من العنوان &d.

في لغة C، يحدد معرف المصفوفة أحادية البعد بشكل فريد عنوان عنصرها الأول. على سبيل المثال، ج ْ & ج، د ْ & د.

يتم التعبير عن عنوان كل عنصر في مصفوفة أحادية البعد من خلال تبعية الاسم + الفهرس (يحدد الفهرس إزاحة العنصر بالنسبة إلى الأول بعدد العناصر المحددة به). على سبيل المثال، &c[i] (عنوان العنصر i في الصفيف C) يتم حسابه كـ c+i.

وبالتالي، يحدد تعبير الفهرس بشكل كامل موقع التخزين المحدد للعنصر المقابل.

>> مقالات

ما هي المصفوفات في البرمجة؟

المصفوفة هي متغير عبارة عن مجموعة من المكونات من نفس النوع. لاستخدام المصفوفات في البرمجة، ستحتاج إلى وصف أولي لنوع معين وإشارة إلى الوصول إلى العناصر. يتم توحيد عناصر المصفوفة في البرمجة باسم مشترك. إذا كنت بحاجة إلى الوصول إلى عنصر مصفوفة محدد، فما عليك سوى تحديد الاسم والفهرس. يوجد في الرياضيات مثال واضح للمصفوفة - وهي ناقلات وتسلسلات من الأرقام يمكن من خلالها تعيين مجموعة من الأرقام باسم واحد. عند الإشارة إلى رقم محدد، يتم استخدام مؤشرات مختلفة.

أنواع المصفوفات: أحادية البعد وثنائية الأبعاد

إذا تم استخدام واحد للوصول إلى العناصر رقم سري، فإن المصفوفة تسمى أحادية البعد أو خطية. يبدو وكأنه جدول مع صف واحد. يتم تحديد حجم المصفوفة من خلال عدد مؤشرات العناصر.

عند استخدام فهرسين، ستكون المصفوفة ثنائية الأبعاد. إذا تم تمثيل مصفوفة في فكرة جدول، فسيتوافق رقم الصف مع الفهرس الأول، وسيتوافق رقم العمود أو الخلية مع الفهرس الثاني.

كيفية ملء مجموعة؟

إحدى الطرق لملء المصفوفة هي باستخدام عامل التعيين. عندما تكون العناصر مرتبطة بشكل متكرر ولها تبعية معينة، فإن طريقة التعبئة هذه مناسبة. يمكنك أيضًا ملء مجموعة متجانسةالعناصر أو القيم المتجانسة التي يتم الحصول عليها من خلال حساس الأرقام العشوائية.

ما هي الإجراءات التي يتم تنفيذها على عناصر المصفوفة؟

فرز العناصر بترتيب معين - تنازلي أو تصاعدي

العثور على القيم

حساب عدد العناصر في المصفوفة التي تستوفي شرطًا معينًا

عندما يكون هناك صفيفان متكافئان، فمن الممكن تعيين اسم صفيف واحد للآخر. يتم نسخ جميع المكونات إلى المصفوفة التي تم تعيين القيمة لها.

كيفية الإعلان عن مصفوفة

للإعلان عن مصفوفة وتخصيص خلية في الذاكرة لتخزين العناصر، يجب عليك تحديد البعد والاسم. الكلمة الأساسية هي المصفوفة. على سبيل المثال، الرقم 20 يعني أن المصفوفة أحادية البعد تتكون من عشرين عنصرًا. ك 6.5 يعني أنه مصفوفة ثنائية الأبعاد، والذي يتم تقديمه كجدول مكون من ستة صفوف وخمس خلايا. إذا تحدثنا عن حدود المصفوفة أحادية البعد في البرمجة، فهي ألف عنصر. بالنسبة للمصفوفات ثنائية الأبعاد، فإن الحد الأقصى للقيمة المسموح بها هو جدول يتكون من ألف صف وألف خلية.

المصفوفات في البرمجة: العمل معهم

عندما يتم الإعلان عن مصفوفة، تتم معالجة كل عنصر باسم وفهرس بين قوسين مربعين. لتمييز مصفوفة أحادية البعد عن مصفوفة ثنائية الأبعاد، يتم استخدام مؤشرين. تسمى عناصر المصفوفة التي تم تعيين فهرس لها بالمتغيرات المفهرسة، ولكن يمكن استخدامها أيضًا كمتغيرات بسيطة. على سبيل المثال، أن تكون حجة في الفريق.

أنواع الأسماء والعناصر والفهارس

كيفية التوصل إلى اسم لمجموعة؟ أي معرف سيفي بالغرض. وفقًا لقواعد الأسلوب، يجب أن يبدأ الاسم بالحرف T بخط كبير. بهذه الطريقة يمكنك تمييز المعرف عن الآخرين. يمكن اختراع الجزء التالي من الاسم وفقًا للبيانات المحددة التي سيتم تخزينها في المصفوفة. ثانية مكون الاسميجب أن يبدأ أيضًا بحرف كبير. يمكن لـ T Vector تخزين معلومات حول إحداثيات المتجه المجرد.

أما بالنسبة لنوع العناصر في المصفوفة، فيمكن إدخالها مسبقًا أو قياسية. يتم استخدام الأعداد الصحيحة لإنشاء الفهارس، وسيكون النوع هو النطاق. لنفترض أن النوع 1...20 يعني أن المصفوفة تتكون من عشرين عنصرًا، كل منها يتوافق مع عدد صحيح من واحد إلى عشرين.

المصفوفة هي نوع بيانات معقد (مركب ومنظم) يتميز بما يلي:

· عناصر المصفوفة لها نفس النوع، على عكس الهياكل، لذا فإن كل عنصر في المصفوفة يشغل نفس المقدار من الذاكرة؛

· المصفوفة موجودة في ذاكرة الوصول العشوائي (RAM)، وليس على جهاز خارجي، مثل الملفات (الفصل الدراسي الثاني)؛

· تشغل عناصر المصفوفة خلايا متتالية، على عكس القوائم (الفصل الدراسي الثاني) على سبيل المثال.

يتم الوصول إلى عناصر المصفوفة بطريقتين في لغة C++.

الأول، باستخدام الرقم الترتيبي لعنصر المصفوفة، والذي يسمى فِهرِس ، وهو نموذجي للعديد من لغات البرمجة ويتم تناوله في الفصل الدراسي الأول. إنها أبسط وأكثر دراية لأولئك الذين درسوا اللغة باسكال.يمكن أن يكون الفهرس تعبيرًا عن عدد صحيح أو نوع متوافق، بما في ذلك ثابت أو متغير. لا يمكنك استخدام تعبير النوع الحقيقي كفهرس.

بالإضافة إلى ذلك، تتمتع لغة C++ بالقدرة على معالجة المصفوفات باستخدام المؤشرات (العناوين) نظرًا لوجود علاقة في لغة C++ بين المصفوفات والمؤشرات. على الرغم من حقيقة أنه في الطريقة الأولى، لا يحتوي البرنامج على نوع خاص للعمل مع العناوين، لا تزال المؤشرات تستخدم.

يمكن أن تحتوي المصفوفات على بُعد واحد أو أكثر. يناقش هذا القسم المصفوفة أحادية البعد، والتي تسمى أحيانًا المتجه , مما يعني وجود ناقل في ن-مساحة الأبعاد. التعامل مع المصفوفات ثنائية الأبعاد ( المصفوفات) تمت مناقشته في الفصل. 5. نادرا ما يتم استخدام ثلاثة أبعاد أو أكثر في الممارسة العملية، لأن هذه المصفوفات تشغل كمية كبيرة من ذاكرة الوصول العشوائي.

في كل ما يلي، نعني بكلمة "مصفوفة" مصفوفة أحادية البعد.

من وجهة نظر الوقت (المرحلة) عندما يتم تخصيص الذاكرة للمصفوفة، هناك نوعان. الذاكرة ل متحرك يتم تخصيص المصفوفة أثناء تنفيذ البرنامج، وإذا لم تكن هناك حاجة للمصفوفة، فيمكن تحرير الذاكرة الخاصة بها. تعتبر هذه المصفوفات في الفصل الدراسي الثاني.

مصفوفة أحادية البعد ذات بعد ثابت (دعنا نسميها ثابتة ) يتم الإعلان عنها بشكل عام على النحو التالي:

اكتب الاسم [N]؛

هنا يكتب- نوع عناصر المصفوفة. دعونا نلقي نظرة على الأنواع البسيطة أولاً (كثافة العمليات، تعويم، شار)، ولكن يمكنك أيضًا استخدام بنيات معقدة، على سبيل المثال. اسميتم كتابته وفقًا لقواعد المعرفات. كل عنصر في المصفوفة له نفس الاسم، فقط يتغير رقم الفهرس أو رقم العنصر. ن- البعد (أو الحجم) للمصفوفة في شكل عدد صحيح ثابت أو تعبير ثابت. تحدد هذه القيمة عدد خلايا ذاكرة الوصول العشوائي (RAM) المحجوزة للمصفوفة. على سبيل المثال:

تعويم أ؛أو ثابت ن = 10؛ تعويم أ[ن]؛

ميزة الطريقة الثانية مع الإعلان الأولي عن البعد كثابت هي ما يلي. إذا كنت بحاجة إلى تغيير أبعاد المصفوفة، يكفي القيام بذلك في مكان واحد في البرنامج عند تحديد ثابت.

على عكس المصفوفة الديناميكية، بالنسبة للمصفوفة الثابتة، يتم حجز الذاكرة في مرحلة التجميع لوضعها نأرقام من النوع المحدد (10 أرقام حقيقية). تتطلب المصفوفة ذاكرة ك * نبايت (4*10 )، أين ك- العدد المطلوب من البايتات لاستيعاب عنصر واحد من النوع المحدد (رقم واحد من النوع يطفو). يتم الاحتفاظ بهذه الذاكرة لتنفيذ البرنامج بالكامل، أو بشكل أكثر دقة، الوظيفة أو الكتلة التي تم وصف المصفوفة فيها. يتم تحديد مقدار الذاكرة المطلوبة برمجياً باستخدام العملية حجمبالطريقة الآتية:

م=حجم (النوع)*ن; أو م = حجم (الاسم); أو م = حجم الاسم;

أين م- متغير من النوع الصحيح الذي يحدد حجم المصفوفة بالبايت. يجب كتابة النوع بين قوسين، لكن يمكن كتابة الاسم بدون قوسين. سيقوم البرنامج التالي بطباعة الرقم 40 مرتين.

تعويم أ؛ كثافة العمليات M1، M2؛

M1=sizeof(float)*10; //لكن M1=حجم التعويم *10;-خطأ!

M2=sizeof(أ); //أو M2 = حجم أ؛

cout<

في العديد من أنظمة البرمجة الحديثة، بما في ذلك C++، يبدأ ترقيم عناصر المصفوفة من 0. ثم أ- العنصر الأخير في المصفوفة. ويرجع ذلك إلى استخدام المؤشرات عند العمل مع المصفوفات (انظر الفصل الدراسي الثاني). لذلك، في مثالنا، يتغير المؤشر من 0 إلى 9 ضمناً، أي فهرس العنصر الأخير في المصفوفة أقل من بعده بمقدار واحد. يتم تعيين عناصر المصفوفة العشرة المعلنة على النحو التالي: أ، أ، أ،…، أ. لا يحتوي C++ على فحص حدود الصفيف. يمكنك تجاوز حدودها وكتابة القيمة في بعض المتغيرات أو حتى في رمز البرنامج. يجب على المبرمج أن يعتني بهذه السيطرة.

عند استخدام المصفوفات الثابتة، تنشأ مشاكل إذا لم نكن نعرف حجم المصفوفة مسبقًا. في هذه الحالة، نعلن عن مصفوفة ذات أبعاد قصوى، والتي تكون معروفة عادةً. نقدم البعد الحقيقي ونستخدمه بشكل أكبر، على سبيل المثال، في الدورات ولأغراض أخرى:

كونست نماكس=100; تعويم X؛

كثافة العمليات ن؛ cout<<”Input the size of array ”; cin>>ن؛

/* دنحن نعمل أيضًا مع ن(ليس مع nmax) عناصر المصفوفة، على سبيل المثال، أدخلها.* /

ل(int i=0; i

{ // يمكن حذف هذا السطر مع الأقواس المتعرجة.

cout<<”X[“<

سين>>X[i];

هذه الطريقة أبسط، ولكنها غير فعالة من وجهة نظر تخصيص الذاكرة، لأننا "نطلب" ذاكرة أكبر مما نستخدمه بالفعل. في مثل هذه الحالات، يتم استخدام المصفوفات الديناميكية الأكثر كفاءة بشكل احترافي (انظر الفصل الدراسي الثاني).

المصفوفة (البرمجة)

مصفوفة الفهرس(في بعض لغات البرمجة أيضًا طاولة, صف) - مجموعة محددة من المتغيرات من نفس النوع، تقع في الذاكرة مباشرة واحدة تلو الأخرى (على عكس القائمة)، ويمكن الوصول إليها عن طريق الفهرس.

فِهرِسالمصفوفة - عدد صحيح، أو قيمة من النوع قابلة للتحويل إلى عدد صحيح، تشير إلى عنصر معين في المصفوفة.

وصف عام

المصفوفة - مجموعة مرتبة من البيانات، لتخزين بيانات من نوع واحد، يتم تحديدها بواسطة نوع واحد أو أكثر الفهارس. في أبسط الحالات، يكون للمصفوفة طول ثابت وتقوم بتخزين وحدات البيانات من نفس النوع.

قد يختلف عدد فهارس الصفيف المستخدمة. يتم استدعاء المصفوفات التي تحتوي على فهرس واحد أحادي البعد، مع اثنين - ثنائي الأبعادإلخ. تتوافق المصفوفة أحادية البعد بشكل فضفاض مع المتجه في الرياضيات، بينما لا تتوافق المصفوفة ثنائية الأبعاد بشكل صارم مع المصفوفة. في أغلب الأحيان، يتم استخدام المصفوفات التي تحتوي على فهرس واحد أو فهرسين، وفي كثير من الأحيان - مع ثلاثة فهارس، وحتى أكثر من الفهارس نادرة للغاية.

مثال على مجموعة ثابتة في باسكال -

WordArray: صفيف [Word] من عدد صحيح؛ // ثابت، الحجم = عالي (كلمة) + 1 multiArray: صفيف [Byte , 1 ..5] من Char ؛ // مجموعة ثابتة، 2 الأبعاد rangeArray: صفيف [5..20] من السلسلة؛ // مصفوفة ثابتة، الحجم = 16

مثال على مجموعة ثابتة في C -

صفيف كثافة العمليات[10]؛ // ثابت، الحجم 10، نوع البيانات الأساسية - intصفيف مزدوج[ 12 ] [ 15 ] ; // صفيف ثابت، بعدين، نوع البيانات الأساسية - الرقم // مع جزء كسري (مزدوج)

يتوفر دعم مصفوفات الفهرس (بناء جملة الإعلان الخاص بها، ووظائف العمل مع العناصر، وما إلى ذلك) في معظم لغات البرمجة عالية المستوى. يتم تحديد الحد الأقصى المسموح به لحجم المصفوفة وأنواع ونطاقات قيم الفهرس والقيود المفروضة على أنواع العناصر بواسطة لغة البرمجة و/أو مترجم محدد.

في لغات البرمجة التي تسمح للمبرمج بالإعلان عن أنواعه الخاصة، كقاعدة عامة، من الممكن إنشاء نوع “مصفوفة”. يمكن لتعريف النوع هذا تحديد الحجم ونوع العنصر ونطاق القيمة وأنواع الفهرس. في المستقبل، من الممكن تحديد متغيرات النوع الذي تم إنشاؤه. كل متغيرات المصفوفة هذه لها نفس البنية. تدعم بعض اللغات عمليات التعيين لمتغيرات المصفوفة (عندما تقوم إحدى العمليات بتعيين قيم العناصر المقابلة لمصفوفة أخرى لجميع عناصر المصفوفة).

التصريح عن النوع "مصفوفة" في باسكال -

اكتب TArrayType = مصفوفة [ 0..9 ] من عدد صحيح ; (* إعلانات من النوع "مصفوفة" *)فار arr1, arr2, arr3: TArrayType; (* إعلان ثلاثة متغيرات مصفوفة من نفس النوع *)

أنواع المصفوفات المحددة

المصفوفات الديناميكية

متحركعبارة عن مصفوفة يمكن أن يتغير حجمها أثناء تنفيذ البرنامج. لتغيير حجم مصفوفة ديناميكية، يجب أن توفر لغة البرمجة التي تدعم هذه المصفوفات وظيفة أو عامل تشغيل مضمن. توفر المصفوفات الديناميكية الفرصة للعمل بشكل أكثر مرونة مع البيانات، لأنها تسمح لك بعدم التنبؤ بحجم البيانات المخزنة، ولكن ضبط حجم المصفوفة وفقًا للأحجام المطلوبة فعليًا. وتسمى أيضًا المصفوفات العادية وغير الديناميكية ثابتة.

مثال على مصفوفة ديناميكية في دلفي

ByteArray: صفيف البايت؛ // مصفوفة أحادية البعد multiArray: صفيف من صفيف السلسلة؛ // مصفوفة متعددة الأبعاد

مثال على مصفوفة ديناميكية في لغة C

تعويم *array1; // مصفوفة أحادية البعدكثافة العمليات **array2; // مصفوفة متعددة الأبعاد array1=(float *) malloc (10 *sizeof (float ) ) ; // خصص 10 كتل بحجم بايت لكل منها array2=(int **) malloc (16 *sizeof (int ) ) ; // تخصيص 16*8 كتل بحجم (int) بايت لكل منهالـ (i=0;i<16 ;i++) array2[ i] =(int *) malloc (8 *sizeof (int ) ) ;

صفائف غير متجانسة

غير متجانسةعبارة عن مصفوفة يمكن من خلالها كتابة عناصر مختلفة مباشرة إلى قيم تنتمي إلى أنواع بيانات مختلفة. المصفوفة التي تخزن المؤشرات لقيم من أنواع مختلفة ليست غير متجانسة، لأن البيانات نفسها المخزنة في المصفوفة تنتمي إلى نوع واحد - نوع "المؤشر". تعتبر المصفوفات غير المتجانسة ملائمة كبنية عالمية لتخزين مجموعات البيانات ذات الأنواع العشوائية. يؤدي عدم دعمهم في لغة البرمجة إلى الحاجة إلى تنفيذ مخططات تخزين بيانات أكثر تعقيدًا. من ناحية أخرى، يتطلب تنفيذ عدم التجانس آلية دعم مصفوفة أكثر تعقيدًا في مترجم اللغة.

مصفوفات المصفوفات

عادةً ما يتم تنفيذ المصفوفات متعددة الأبعاد كمصفوفات أحادية البعد، حيث يكون كل عنصر منها مرجعًا لمصفوفة أخرى أحادية البعد.

تطبيق

الطريقة القياسية لتنفيذ المصفوفات الثابتة بنوع عنصر واحد هي كما يلي:

  1. يتم تخصيص كتلة مستمرة من الذاكرة بحجم S*m 1 *m 2 *m 3 …m n للمصفوفة، حيث S هو حجم عنصر واحد، وm 1 …m n هي أحجام نطاقات الفهرس (أي ، عدد القيم التي يمكن أن يأخذها الفهرس المقابل).
  2. عند الوصول إلى عنصر المصفوفة A، يتم حساب عنوان العنصر المقابل كـ B+S*(i 1p *m 1 +i 2p *m 2 +…+i (n-1)p *m n-1 +i np )، حيث B - القاعدة (عنوان بداية كتلة ذاكرة الصفيف)، i kp هي قيمة الفهرس k الذي تم تخفيضه إلى عدد صحيح مع إزاحة أولية صفرية.

بهذه الطريقة، يتم حساب عنوان العنصر الذي يحتوي على مجموعة معينة من المؤشرات بحيث يكون وقت الوصول إلى جميع عناصر المصفوفة هو نفسه.

قد يكون للعنصر الأول في المصفوفة فهرس مختلف، اعتمادًا على لغة البرمجة. هناك ثلاثة أنواع رئيسية من المصفوفات: المصفوفات ذات الأساس الصفري (Zero-based)، والمصفوفات ذات الأساس الواحد (One-Based)، والمصفوفات المستندة إلى قيمة محددة يحددها المبرمج (تعتمد على n). يعد حساب فهرس عنصر المصفوفة من الصفر أكثر شيوعًا بالنسبة للغات ذات المستوى المنخفض، ولكن تم نشر هذه الطريقة في اللغات ذات المستوى الأعلى عن طريق لغة البرمجة C.

يعد تنفيذ الأنواع الأكثر تعقيدًا من المصفوفات - الديناميكية وغير المتجانسة - أكثر صعوبة.

مزايا

  • سهولة حساب عنوان العنصر من خلال فهرسه (نظرًا لتواجد عناصر المصفوفة واحدة تلو الأخرى)
  • وقت وصول متساوي لجميع العناصر
  • صغر حجم العناصر: فهي تتكون فقط من حقل معلومات

عيوب

  • بالنسبة للمصفوفة الثابتة - الافتقار إلى الديناميكيات، واستحالة إزالة أو إضافة عنصر دون تغيير العناصر الأخرى
  • بالنسبة لمصفوفة ديناميكية و/أو غير متجانسة - أداء أقل (مقارنة بالمصفوفة الثابتة العادية) وحمل إضافي لدعم الخصائص الديناميكية و/أو عدم التجانس.
  • عند العمل باستخدام مصفوفة على النمط C (مع المؤشرات) وفي غياب عناصر تحكم إضافية - التهديد بتجاوز حدود المصفوفة وإتلاف البيانات