في ال لغة البرمجة ج ، المصفوفات الثابتة هي مناطق متجاورة من ذاكرة ذات حجم ثابت يتم الإعلان عنها في مرحلة التجميع. ومع ذلك ، في بعض الحالات ، قد يكون من الضروري تغيير حجم المصفوفة أثناء تنفيذ البرنامج. في مثل هذه الحالات ، يمكن استخدام مصفوفة ديناميكية ، مما يسمح لك بتخصيص الذاكرة وتحريرها حسب الحاجة.
لإنشاء مصفوفة ديناميكية في ج ، يتم استخدام وظيفة مالوك () ، والتي تخصص كتلة من الذاكرة بالحجم المحدد. يؤدي هذا إلى إرجاع مؤشر إلى بداية كتلة الذاكرة هذه. ومع ذلك ، من المهم ملاحظة أنه بعد استخدام مصفوفة ديناميكية ، من الضروري تحرير الذاكرة المخصصة باستخدام الوظيفة المجانية() لمنع تسرب الذاكرة.
مثال على مصفوفة ديناميكية:
في هذا المثال ، يتم إنشاء مصفوفة ديناميكية ديناميكية من 5 عناصر كثافة العمليات. إذا فشل تخصيص الذاكرة ، يعرض البرنامج رسالة خطأ. بعد استخدام مصفوفة ديناميكية ، تحتاج إلى تحرير الذاكرة المخصصة باستخدام الوظيفة المجانية ().
- العمل مع المصفوفات الديناميكية في ج
- ما هي مجموعة ديناميكية?
- مزايا المصفوفات الديناميكية
- إنشاء مصفوفة ديناميكية
- تغيير حجم المصفوفة الديناميكية
- إضافة عناصر إلى مصفوفة ديناميكية
- إزالة العناصر من مصفوفة ديناميكية
- تحرير الذاكرة بعد استخدام مصفوفة ديناميكية
- مثال على استخدام مصفوفة ديناميكية في ج
- سؤال وجواب
- ما هي مجموعة ديناميكية?
- كيفية جعل مجموعة ديناميكية من واحد ثابت في ج?
- هل من الممكن تغيير حجم مجموعة ديناميكية?
- كيف يمكنني تحرير الذاكرة المخصصة لمجموعة ديناميكية?
- ما هو الفرق بين مجموعة ديناميكية واحدة ثابتة?
العمل مع المصفوفات الديناميكية في ج
المصفوفة الديناميكية هي مصفوفة يتم تخصيص حجمها أثناء تنفيذ البرنامج. على عكس المصفوفة الثابتة ، التي يتم تعيين حجمها مسبقا ولا يمكن تغييرها ، يمكن للمصفوفة الديناميكية تغيير حجمها حسب الحاجة.
العمل مع المصفوفات الديناميكية في ج يتضمن الخطوات التالية:
- تخصيص الذاكرة. لإنشاء مصفوفة ديناميكية ، تحتاج إلى تخصيص الذاكرة باستخدام وظيفة مالوك (). تأخذ الدالة حجم المصفوفة بالبايت وتعيد مؤشرا إلى الذاكرة المخصصة.
- باستخدام صفيف. بعد تخصيص الذاكرة ، يمكنك استخدام مصفوفة ديناميكية بنفس طريقة استخدام مصفوفة ثابتة. يمكنك تعيين قيم لعناصر المصفوفة ، والحصول على قيم العناصر ، وتنفيذ العمليات على العناصر ، وما إلى ذلك.
- تحرير الذاكرة. بعد أن تصبح المصفوفة الديناميكية غير ضرورية ، من الضروري تحرير الذاكرة المخصصة باستخدام الوظيفة المجانية (). هذا يتجنب تسرب الذاكرة ويحسن أداء البرنامج.
مثال على العمل مع مصفوفة ديناميكية في ج:
# تشمل
# تشمل
كثافة العمليات الرئيسية () {
حجم كثافة العمليات;
إنت * ديناميكاراي;
برينتف ("أدخل حجم المصفوفة:");
المسح الضوئي ("٪د " ، والحجم);
// تخصيص الذاكرة لمجموعة ديناميكية
ديناميكاراي = (إنت*)مالوك (حجم * حجم (إنت));
// ملء المصفوفة بالعناصر
ل (إنت أنا = 0 ؛ أنا < الحجم ؛ أنا i) {
ديناميكاراي [أنا] = أنا + 1;
}
// إخراج عناصر المصفوفة
برينتف ("عناصر المصفوفة:");
ل (إنت أنا = 0 ؛ أنا < الحجم ؛ أنا i) {
برينتف ("٪د" ، ديناميكاراي [أنا]);
}
// تحرير الذاكرة
مجانا (ديناميكاراي);
العودة 0;
}
في هذا المثال ، نطلب أولا من المستخدم حجم المصفوفة. ثم نخصص الذاكرة لمجموعة ديناميكية باستخدام وظيفة مالوك (). بعد ذلك ، نملأ المصفوفة بقيم من 1 إلى الحجم ونخرج عناصرها. في نهاية البرنامج ، نحرر الذاكرة المخصصة باستخدام الوظيفة المجانية ().
باستخدام المصفوفات الديناميكية في ج ، يمكنك العمل بسهولة مع أحجام البيانات المتغيرة واستخدام ذاكرة الكمبيوتر بكفاءة.
ما هي مجموعة ديناميكية?
المصفوفة الديناميكية هي بنية بيانات تسمح لك بتغيير حجمها أثناء تنفيذ البرنامج. على عكس المصفوفة الثابتة ، لا يتم تعيين حجم المصفوفة الديناميكية مسبقا ويمكن تغييرها حسب احتياجات البرنامج.
يتم تنفيذ مجموعة ديناميكية في لغة البرمجة ج باستخدام وظائف مالوك() ومجانية () ، والتي تسمح لك لتخصيص الذاكرة لمجموعة أثناء تنفيذ البرنامج وتحرير هذه الذاكرة بعد الاستخدام.
تتضمن عملية العمل مع مصفوفة ديناميكية الخطوات الأساسية التالية:
- تخصيص الذاكرة لمجموعة باستخدام وظيفة مالوك ().
- تهيئة عناصر الصفيف.
- العمل مع عناصر المصفوفة.
- تحرير الذاكرة باستخدام وظيفة مجانية ().
تتمثل إحدى المزايا الرئيسية للمصفوفة الديناميكية في أنها تسمح للبرنامج باستخدام ذاكرة الكمبيوتر بشكل أكثر كفاءة. تسمح لك المصفوفة الديناميكية بتخصيص الذاكرة فقط لتلك العناصر المطلوبة حقا في الوقت الحالي ، مما يقلل من مقدار الذاكرة المستخدمة. بالإضافة إلى ذلك ، تتيح لك المصفوفة الديناميكية تغيير حجمها حسب الحاجة ، مما يجعلها أكثر مرونة في الاستخدام.
مزايا المصفوفات الديناميكية
المصفوفات الديناميكية هي هياكل بيانات تسمح لك بإنشاء صفائف ذات حجم متغير أثناء تنفيذ البرنامج. لديهم عدد من المزايا على المصفوفات الثابتة:
حجم المرونة:
واحدة من المزايا الرئيسية للمصفوفات الديناميكية هي قدرتها على تغيير الحجم حسب الحاجة. يتيح لك ذلك استخدام الذاكرة بكفاءة وحفظ موارد الكمبيوتر. يمكن زيادة المصفوفات الديناميكية أو تقليلها حسب احتياجات البرنامج.
تخصيص الذاكرة الديناميكية:
تسمح المصفوفات الديناميكية للمبرمج بتخصيص الذاكرة أثناء تنفيذ البرنامج. يتيح لك ذلك تحسين استخدام الذاكرة ومنع استخدامها المفرط. وبالتالي ، يمكن أن تكون المصفوفات الديناميكية أكثر كفاءة من حيث العمل مع الذاكرة من المصفوفات الثابتة.
تعدد الاستخدامات:
يمكن استخدام المصفوفات الديناميكية لتخزين أي نوع من البيانات ، بما في ذلك أنواع البيانات البدائية وأنواع البيانات المخصصة والمؤشرات. هذا يجعلها أدوات متعددة الاستخدامات للعمل مع مجموعة متنوعة من البيانات.
التوفر:
على عكس المصفوفات الثابتة ، يمكن تمرير المصفوفات الديناميكية إلى الوظائف دون الحاجة إلى تمرير حجمها بواسطة معلمة منفصلة. هذا يبسط ويحسن تنظيم التعليمات البرمجية ويجعلها أكثر مرونة.
سهولة الاستخدام:
تتمتع المصفوفات الديناميكية بمرونة ووظائف أكثر من المصفوفات الثابتة. إنها تسمح للمبرمجين بإضافة عناصر المصفوفة وإزالتها وتعديلها دون الحاجة إلى إعادة كتابة أو إعادة ترجمة الكود بأكمله. هذا يبسط تطوير وصيانة البرنامج.
كل هذه المزايا تجعل المصفوفات الديناميكية أداة قوية في تطوير البرنامج ، خاصة في الحالات التي تحتاج فيها إلى العمل مع مصفوفات ذات حجم متغير أو تغيير حجم المصفوفة أثناء تنفيذ البرنامج.
إنشاء مصفوفة ديناميكية
المصفوفة الديناميكية هي مصفوفة يمكن تغيير حجمها أثناء تنفيذ البرنامج. على عكس المصفوفة الثابتة ، التي لها حجم ثابت ، يمكن زيادة المصفوفة الديناميكية أو تقليلها حسب الحاجة.
في ال لغة البرمجة سي ، يتم استخدام آليات تخصيص الذاكرة وإلغاء التخصيص لإنشاء مصفوفة ديناميكية باستخدام وظائف مالوك() ومجانية ().
لإنشاء مصفوفة ديناميكية في ج ، يجب تنفيذ الخطوات التالية:
- ل (إنت أنا = 0 ؛ أنا < الحجم ؛ أنا i) {
}
استخدم المصفوفة حسب تقديرك في البرنامج.
قم بتحرير الذاكرة التي تشغلها المصفوفة الديناميكية باستخدام الوظيفة المجانية() :
مجانا;
وبالتالي ، فإن إنشاء مصفوفة ديناميكية في لغة البرمجة سي يسمح لك بالتحكم بمرونة في حجم المصفوفة أثناء تنفيذ البرنامج واستخدامه بسهولة لتخزين البيانات ومعالجتها.
تغيير حجم المصفوفة الديناميكية
في لغة البرمجة سي ، توفر المصفوفة الديناميكية المرونة عند العمل مع البيانات ، حيث يمكن تغيير حجمها أثناء تنفيذ البرنامج. على عكس المصفوفة الثابتة ، تسمح لك المصفوفة الديناميكية بإضافة عناصر أو إزالتها حسب الحاجة.
لتغيير حجم مصفوفة ديناميكية في ج ، يتم استخدام وظائف إعادة التخصيص() والوظائف المجانية ().
وظيفة ريالوك () يسمح لك لتغيير حجم الذاكرة المخصصة لمجموعة. فإنه يأخذ وسيطتين: مؤشر إلى مجموعة الحالية وحجم جديد في بايت. تقوم الدالة بإرجاع مؤشر إلى صفيف جديد أو فارغ في حالة حدوث خطأ.
Пример использования функции realloc() для увеличения размера массива:
#include
#include
int main() {
int *arr;
int size = 5;
arr = (int *)malloc(size * sizeof(int));
if (arr == NULL) {
printf("Не удалось выделить память для массива");
return 1;
}
// заполнение массива
size = 10;
arr = (int *)realloc(arr, size * sizeof(int));
if (arr == NULL) {
printf("Не удалось изменить размер массива");
return 1;
}
// العمل مع مجموعة أكبر
مجانا;
العودة 0;
}
في هذا المثال ، نقوم أولا بتخصيص ذاكرة للمصفوفة باستخدام وظيفة مالوك (). ثم نقوم بتغيير حجم المصفوفة باستخدام وظيفة ريالوك () وتعيين الحجم الجديد. إذا نجحت العملية ، تقوم الوظيفة بإرجاع مؤشر إلى المصفوفة الجديدة ، ونواصل العمل معها. في نهاية البرنامج ، نقوم بتحرير الذاكرة باستخدام الوظيفة المجانية ().
لاحظ أنه يمكن أيضا استخدام وظيفة إعادة التخصيص () لتقليل حجم المصفوفة. للقيام بذلك ، يجب أن تكون الوسيطة الثانية للوظيفة أصغر من الحجم الحالي للمصفوفة. ومع ذلك ، عند تقليل حجم المصفوفة ، سيتم فقد البيانات التي لا تتناسب مع الحجم الجديد.
عند العمل مع المصفوفات الديناميكية ، يجب أن تكون حذرا وأن تخصص وقتا كافيا للعمل بشكل صحيح مع الذاكرة.
إضافة عناصر إلى مصفوفة ديناميكية
عند إنشاء مصفوفة ديناميكية في ج ، يمكنك إضافة عناصر إليها حسب الحاجة. للقيام بذلك ، يمكنك استخدام وظيفة ريالوك () ، والذي يسمح لك لتغيير حجم الذاكرة المخصصة لمجموعة.
فيما يلي نموذج رمز يوضح كيفية إضافة عناصر إلى مصفوفة ديناميكية:
# تشمل
# تشمل
كثافة العمليات الرئيسية () {
إنت * ديناميكاراي = لاغية;
كثافة العمليات الحجم = 0;
قيمة كثافة العمليات;
// أدخل عناصر المصفوفة من لوحة المفاتيح حتى يتم إدخال 0
بينما (1) {
برينتف ("أدخل قيمة (0 للخروج):");
المسح الضوئي ("٪د " ، والقيمة);
// تحقق مما إذا تم إدخال 0 ، إذا كان الأمر كذلك، فاخرج من الحلقة
إذا (القيمة == 0) {
استراحة;
}
// زيادة حجم المصفوفة بمقدار 1
حجم++;
// تغيير حجم الذاكرة المخصصة لمجموعة ديناميكية
ديناميكاراي = (إنت*)ريالوك(ديناميكاراي ، حجم * سيزوف(إنت));
// إضافة عنصر جديد إلى المصفوفة
ديناميكاراي [الحجم - 1] = القيمة;
}
// إخراج عناصر المصفوفة
برينتف(" لقد أدخلت عناصر المصفوفة التالية:");
ل (إنت أنا = 0 ؛ أنا < الحجم ؛ أنا i) {
برينتف ("٪د " ، ديناميكاراي [أنا]);
}
// تحرير الذاكرة المخصصة
مجانا (ديناميكاراي);
العودة 0;
- }
- في هذا المثال ، نقوم بإنشاء مصفوفة ديناميكية ديناميكية فارغة وحجم متغير مسؤول عن الحجم الحالي للمصفوفة. ثم ندخل عناصر المصفوفة من لوحة المفاتيح حتى يتم إدخال 0. لكل عنصر جديد ، نقوم بزيادة حجم المصفوفة بمقدار 1 وتغيير حجم الذاكرة المخصصة للمصفوفة الديناميكية باستخدام ريالوك(). ثم نضيف عنصرا جديدا إلى المصفوفة ونكرر العملية حتى يتم إدخال 0.
- بعد ذلك ، نعرض جميع عناصر المصفوفة على الشاشة ونحرر الذاكرة المخصصة باستخدام الوظيفة المجانية ().
- إزالة العناصر من المصفوفة الديناميكية
- يمكن تنفيذ إزالة العناصر من مصفوفة ديناميكية في ج على النحو التالي:
حدد فهرس العنصر الذي تريد إزالته من المصفوفة.
إنشاء مصفوفة ديناميكية جديدة عنصر واحد أصغر من العنصر الأصلي.
انسخ جميع العناصر من المصفوفة الأصلية إلى المصفوفة الجديدة ، مع تخطي العنصر الذي تريد حذفه.
تحرير الذاكرة المخصصة لمجموعة المصدر.
Установите указатель на новый массив в качестве нового значения указателя на исходный массив.
Ниже приведен пример кода, иллюстрирующего эту процедуру:
#include
#include
int *removeElement(int *arr, int size, int index) {
int *newArr = (int *)malloc((size - 1) * sizeof(int));
int newIndex = 0;
for(int i = 0; i < size; i++) {
if(i != index) {
newArr[newIndex] = arr[i];
newIndex++;
}
}
free(arr);
return newArr;
}
int main() {
int size = 5;
int *arr = (int *)malloc(size * sizeof(int));
for(int i = 0; i < size; i++) {
arr[i] = i + 1;
}
int index = 2;
printf("Исходный массив:
");
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
arr = removeElement(arr, size, index);
size = size - 1;
printf("
Массив после удаления элемента:
");
for(int i = 0; i < size; i++) {
free(arr);
الرئيسية()
وظيفة ومليئة القيم من 1 إلى حجم الصفيف. ثم
تسمى وظيفة ريموفيليمنت ()
لحذف عنصر مع الفهرس المحدد ، ويتم تقليل حجم الصفيف بمقدار 1. بعد ذلك ، يتم إخراج المصفوفة الأصلية والمعدلة.
لا تنس تحرير الذاكرة المخصصة للمصفوفة الديناميكية باستخدام الوظيفة
مجانا()
بعد الانتهاء من العمل مع المصفوفة.
تحرير الذاكرة بعد استخدام مصفوفة ديناميكية
لإنشاء مصفوفة ديناميكية في ج ، نستخدم وظيفة مالوك. ولكن بعد استخدام المصفوفة ، نحتاج إلى تحرير الذاكرة المخصصة لها لتجنب تسرب الذاكرة. للقيام بذلك ، نستخدم الوظيفة المجانية ، التي تعيد الذاكرة إلى نظام التشغيل.
عادة ، يتم تحرير الذاكرة في نهاية البرنامج ، عندما لا تكون هناك حاجة إلى المصفوفة. ولكن في بعض الحالات ، قد تحتاج إلى تحرير الذاكرة في وقت سابق. على سبيل المثال ، إذا كانت لدينا وظيفة تعمل مع مصفوفة ديناميكية وتعيد نتيجة ، فيجب علينا تحرير الذاكرة قبل العودة من الوظيفة.
مثال على تحرير الذاكرة بعد استخدام مصفوفة ديناميكية:
# تشمل
# تشمل
كثافة العمليات الرئيسية () {
كثافة العمليات الحجم = 5;
إنت * أر = (إنت *)مالوك(حجم * سيزوف(إنت));
// باستخدام صفيف
مجانا;
العودة 0;
}
في المثال أعلاه ، ونحن أولا تخصيص الذاكرة لمجموعة ديناميكية باستخدام وظيفة مالوك. ثم استخدمنا المصفوفة لبعض العمليات. بعد الانتهاء من استخدام المصفوفة ، نسمي الوظيفة المجانية ، ونمررها بمؤشر إلى المصفوفة. نتيجة لذلك ، سيتم تحرير الذاكرة المخصصة للمصفوفة.
يعد استخدام الوظيفة المجانية أمرا مهما للغاية لتجنب تسرب الذاكرة. إذا نسينا استدعاء هذه الوظيفة ، فسيتم الاحتفاظ بالذاكرة بواسطة البرنامج ، وقد يؤدي ذلك إلى تشغيل غير صحيح وعدم كفاءة البرنامج.
مثال على استخدام مصفوفة ديناميكية في ج
المصفوفة الديناميكية هي مصفوفة يمكن أن يتغير حجمها أثناء تنفيذ البرنامج. في ج ، يتم إنشاء المصفوفات الديناميكية باستخدام وظائف مالوك () أو كالوك () أو ريالوك ().
ضع في اعتبارك مثالا على استخدام مصفوفة ديناميكية لتخزين بيانات الطالب:
# تشمل
# تشمل
اكتببنية الدفاع {
اسم الحرف [20];
كثافة العمليات العمر;
} طالب;
كثافة العمليات الرئيسية () {
عدد الطلاب;
printf("Введите количество студентов: ");
scanf("%d", &numStudents);
// Выделение памяти для студентов
Student* students = (Student*)malloc(numStudents * sizeof(Student));
// Ввод данных о студентах
for (int i = 0; i < numStudents; i++) {
printf("Введите имя студента %d: ", i+1);
scanf("%s", students[i].name);
printf("Введите возраст студента %d: ", i+1);
scanf("%d", &students[i].age);
}
// Вывод данных о студентах
printf("
Данные о студентах:
");
ل (إنت أنا = 0 ؛ أنا < نومستودينتس ؛ أنا i) {
برينتف ("الطالب ٪ د: ٪ ق ، العمر ٪ د
"،أنا+1 ، الطلاب[أنا].الاسم ، الطلاب [أنا].العمر);
}
// تحرير الذاكرة
مجانا (الطلاب);
العودة 0;
}
في هذا المثال ، نسأل المستخدم أولا عن عدد الطلاب. ثم نخصص الذاكرة لتخزين هذا العدد من هياكل الطلاب. بعد ذلك ، نطلب من المستخدم بيانات عن كل طالب وحفظها في مجموعة ديناميكية من الهياكل.
بعد الانتهاء من الإدخال ، نعرض البيانات حول كل طالب على الشاشة. ثم نقوم بتحرير الذاكرة المخصصة باستخدام الوظيفة المجانية ().
يتيح لنا استخدام مصفوفة ديناميكية العمل مع مجموعة من الأحجام المتغيرة ، والتي يمكن أن تكون مفيدة في العديد من المواقف.
سؤال وجواب
ما هي مجموعة ديناميكية?
المصفوفة الديناميكية هي مصفوفة يمكن أن يتغير حجمها أثناء تنفيذ البرنامج. على عكس المصفوفة الثابتة ، يتم تعيين حجم المصفوفة الديناميكية أو تغييرها يدويا في رمز البرنامج.
كيفية جعل مجموعة ديناميكية من واحد ثابت في ج?
لإنشاء مصفوفة ديناميكية من مصفوفة ثابتة في ج ، تحتاج إلى استخدام وظيفة مالوك() أو كالوك (). تقوم هذه الوظائف بتخصيص الذاكرة في الكومة ، وإرجاع مؤشر إلى الذاكرة المخصصة ، والتي يمكن استخدامها كمصفوفة ديناميكية.
هل من الممكن تغيير حجم مجموعة ديناميكية?