الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إضافة أو حذف عنصر من عناصر المصفوفة

رائج
بدأه khaled_prg في 20 يوليو 2010 · 27 رد · 21,192 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

#include<iostream>
using namespace std;
int main()
{
    int array[10]={-2,1,0,2,3,7,8,10,15};
    int value,i,j;
    cout<<"value=";
    cin>>value;
    //البحث عن مكان العنصر في المصفوفة و إدراجه 
    for(i=0;i<10;i++)
    if(array<value && value<array[i+1])
    {
       array[i+2]=array[i+1];
       array[i+1]=value;
       break;
    }
    //إزاحة عناصر المصفوفة
    for(j=i+2;j<9;j++)
    array[j]=array[j+1];
    //إظهار عناصر المصفوفة بعد عملية الإدراج و الإزاحة
    for(i=0;i<10;i++)
    cout<<array<<" ";

    system("pause");
    return 0;
}

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

#include<iostream>
using namespace std;
int main()
{
    int array[10]={-2,1,0,2,3,7,8,10,15};
    int value,i,j;
    cout<<"value=";
    cin>>value;
    //البحث عن مكان العنصر المُراد حذفه من المصفوفة
    for(i=0;i<10;i++)
    if(array==value) break;
	//إرجاع عناصر المصفوفة
    for(i;i<10;i++)
    array=array[i-1];
    //إظهار عناصر المصفوفة بعد عملية الحذف و الإرجاع
    for(i=0;i<10;i++)
    cout<<array<<" ";
	system("pause");
    return 0;
}

سلامي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 20 يوليو 2010 في 17:02

#2

و عليكم السلام ..

ما المشكلة في الكود ؟ هل تريد إظهار عناصر المصفوفة و مضاف لها العنصر المدخل من قبل المستخدم ؟

لا يمكنك فعل ذلك .. لأنك حجزت للمصفوفة 10 عناصر فقط ..

إذا أردت المرونة في إضافة و حذف العناصر .. أستخدم List مثلاً ..

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#3

السلام عليكم

اقتباس
لا يمكنك فعل ذلك .. لأنك حجزت للمصفوفة 10 عناصر فقط ..

أعرف أنه عندما يتم إدراج عنصر في المصفوفة فسيتم إلغاء العنصر الأخير من المصفوفة و السبب يعود لعملية الإزاحة , و لكن لا بأس .. المهم أن نقوم بعملية الإدراج بغض النظر عن إلغاء أخر عناصر المصفوفة.

اقتباس
إذا أردت المرونة في إضافة و حذف العناصر .. أستخدم List مثلاً ..

لا أستطيع ...! لم أدرسها بعد (ما زلت مبتدءا :blush:)

#4
اقتباس
1-أريد أن أكتب كود يطلب من المستخدم إدخال عنصر ثم يقوم بإدراجه في المصفوفة و هذه محاولتي:

إستخدم ال Insertion Sort فبه طريقة لعمل ذلك...

http://m-hewedy.blogspot.com/2010/07/bubble-sort-selection-sort-and.html

تم تعديل هذه المشاركة بواسطة هويدي في 20 يوليو 2010 في 17:34

1
#5

السلام عليكم

اقتباس
إستخدم ال Insertion Sort فبه طريقة لعمل ذلك...

+1 على الكود الجميل :)

هل تقصد بأن الدالة التالية هي المسؤولة عن عملية الإدراج:

void insertion_sort(int arr[], int length)
{    
    int outter, inner, tmp;
    for (outter=1; outter<=length-1; outter++)
    {
        inner = outter;
        while (inner>0 && arr[inner-1]>arr[inner])
        {    
            //print(arr, length);
            tmp = arr[inner];
            arr[inner] = arr[inner-1];
            arr[inner-1] = tmp;
            inner--;
        }
    }
}

إذا كان الجواب نعم فيا ريت لو تضع شرح للدالة :)

بانتظارك.

#6

الدلة الموجودة فى مشاركتك الاخيرة اخى خالد تقوم بترتيب عناصر المصفوفة

بطريقة ال Insertion Sort اى انها تقوم بترتيب عناصر المصفوفة تصاعديا

تم تعديل هذه المشاركة بواسطة اسراء شلبى في 20 يوليو 2010 في 19:06

00020309t.gif

1958_1963.gif
#7

السلام عليكم

اقتباس
الدلة الموجودة فى مشاركتك الاخيرة اخى خالد تقوم بترتيب عناصر المصفوفة

بطريقة ال Insertion Sort اى انها تقوم بترتيب عناصر المصفوفة تصاعديا

أها .. , و لكن ما علاقة الترتيب بالإدراج !؟

#8
khaled_prg كتب:

و لكن ما علاقة الترتيب بالإدراج !؟

لابد أن تكون العناصر مرتبة .. حتى تتم عملية الإضافة بشكل صحيح ..

كودك بعد التعديل :

#include<iostream> 
using namespace std; 
int main() 
{
	int array[10]={1,2,4,5,6,7,8,9,10,11};
    int value , index;
    cout<<"value=";
    cin>>value;
    //البحث عن مكان العنصر في المصفوفة و إدراجه 
    for(int i=0;i<10;i++)
    if(array<value && value<array[i+1])
	{
		index=i+1;
		for(int i=9 ; i>=index ; i--)
			array=array[i-1];
       array[index]=value;
       break;
	}
	   //إظهار عناصر المصفوفة بعد عملية الإدراج و الإزاحة
    for(int i=0;i<10;i++)
    cout<<array<<" ";
    cout<<endl;
	system("pause");
    return 0; 
	}

أتمنى يكون المطلوب ..

بالتوفيق ,

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#9

شكرا أخ خالد,,,

لتفهم الترتيب بالإدراج,, انصحك أن تشاهد هذا الفيديو:

2
#10

السلام عليكم

اقتباس
لتفهم الترتيب بالإدراج,, انصحك أن تشاهد هذا الفيديو:

أنا لا أعرف الانجليزية (للأسف الشديد) :blush:

اقتباس
أتمنى يكون المطلوب

هو بالضبط :wink:

طيب .. ماذا عن عملية الحذف (حذف عنصر من عناصر المصفوفة) !؟

تم تعديل هذه المشاركة بواسطة khaled_prg في 20 يوليو 2010 في 21:40

#11
اقتباس
طيب .. ماذا عن عملية الحذف (حذف عنصر من عناصر المصفوفة) !؟

أظن أنه لا يفضل حذف العناصر من المصفوفه بناء على قيمهم, بل على أماكنهم..

ماذا لو أن 10 عناصر من 15 عنصر في المصفوفه يحملون القيمه 25 و أردت أن تحذف القيمه 25 فإنه سيتم حذف 10 عناصر,,,,

لذا أعتقد انه من الأفضل حذف العناصر على حسب ال index .....

(أرجو سماع أراء الأخوه الخبراء في رأيي هذا)

خذ مثال على ذلك:

#include <stdio.h>
#include <stdlib.h>

int* delete_form_arr(int* , int, int);

int main(void)
{
	int arr[] = {10, 20, 30, 40, 50};

	int* result= delete_form_arr(arr, 5, 2);

	if (result != NULL)
	{
		int i;
		for (i=0; i<4; i++)
		{
			printf("%i\n", result);
		}
	}
	return 0;
}

int* delete_form_arr(int* arr, int length, int delete_index)
{
	int i, j, *ret;
	if (delete_index > length-1)
		return NULL;
	ret = malloc((length-2)*sizeof(int));

	for (i=0, j=0; i<length; i++)
	{
		if (i == delete_index) continue;
		ret[j++] = arr;
	}
	return ret;
}
#12

السلام عليكم

اقتباس
أظن أنه لا يفضل حذف العناصر من المصفوفه بناء على قيمهم, بل على أماكنهم..

ماذا لو أن 10 عناصر من 15 عنصر في المصفوفه يحملون القيمه 25 و أردت أن تحذف القيمه 25 فإنه سيتم حذف 10 عناصر,,,,

لذا أعتقد انه من الأفضل حذف العناصر على حسب ال index .....

فكرة جيدة يابو حميد :)

اقتباس
خذ مثال على ذلك

يا ريت لو تشرح المثال .. لأنني مازلت مبتدء في المؤشرات و أرجو أن يكون الشرح بالتفصيل الممل :blush:

بانتظارك.

#13

بالنسبة لل insertion sort و أسف على التأخير يا خالد,,,

تصور أن لديك عدد 5 كروت من الكوتشينه الغير مرتبه و التي تريد ترتيبها...

دعنا نقل أن الكروت التي دليك تحمل الأرقام

10 8 9 6 7

الأن نضع الكارت 10 في الأول, فتصبح المصفوفه:

10

الأن نريد ترتبيها تصاعديا...

أولا نقوم بمقارنة الكارت رقم 2 (الذي يحمل الرقم 8 ) مع كل الكروت السابقة له,,,

قارن 8 ب 10, نجد أن 8 أقل, الأن نقوم بالتبديل فيصبح:

8 10

الأن درو الكارت رقم 3 و الذي يحمل القيمه 9 ..

نقارن 9 بكل ما قبله... نجد أن 3 مكانه بين 8 و 10,, نقوم بوضعه بين 8 و 10 ليصبح

8 9 10

الأن الكارت ذا القيمه 6 ,, مكانه قبل الكارت ذا القيمه 8,, فنقوم بإذاحة كل الكروت ووضعه في الأول ليصبح

6 8 9 10

الأن الكارت ذا القيمه 7,,, نقوم مقارنتة بجميع الكروت إبتداء من الكارت ذا القيمه 6, فنجد مكانه سيكون بين 6 و 8 فيصبح

6 7 8 9 10

وبهذا نكون قد رتبنا المصفوفه....

هذه طريقة بسيطه لشرح الترتيب بالإدراج...... إذا فهمتها.. قم بقراءة الكود و حاول فهمه....

#14
هويدي كتب:

أظن أنه لا يفضل حذف العناصر من المصفوفه بناء على قيمهم, بل على أماكنهم..

ماذا لو أن 10 عناصر من 15 عنصر في المصفوفه يحملون القيمه 25 و أردت أن تحذف القيمه 25 فإنه سيتم حذف 10 عناصر,,,,

لذا أعتقد انه من الأفضل حذف العناصر على حسب ال index .....

(أرجو سماع أراء الأخوه الخبراء في رأيي هذا)

خذ مثال على ذلك:

#include <stdio.h>
#include <stdlib.h>

int* delete_form_arr(int* , int, int);

int main(void)
{
	int arr[] = {10, 20, 30, 40, 50};

	int* result= delete_form_arr(arr, 5, 2);

	if (result != NULL)
	{
		int i;
		for (i=0; i<4; i++)
		{
			printf("%i\n", result);
		}
	}
	return 0;
}

int* delete_form_arr(int* arr, int length, int delete_index)
{
	int i, j, *ret;
	if (delete_index > length-1)
		return NULL;
	ret = malloc((length-2)*sizeof(int));

	for (i=0, j=0; i<length; i++)
	{
		if (i == delete_index) continue;
		ret[j++] = arr;
	}
	return ret;
}

ألا تظن ان هناك بعض ال memory leaks في هذا الكود؟ وخصوصا المتغير ret.

#15

أنا أفضل استعمال الحاوية vector في حالة اردنا حذف أو اضافة بعض العناصر.


#include <iostream>
#include <vector>
using namespace std;
void insertItem(vector<int> &v,int value);
void removeItem(vector<int> &v,int value);
void print(vector<int> &v);

int main()
{
int nums[]={1,2,3,4,5,6,7,8,9,10,100,89};
vector <int> numbers(nums,nums+sizeof(nums)/sizeof(int));
insertItem(numbers,69);
print(numbers);
removeItem(numbers,6);
print(numbers);
return 0;
}

void insertItem(vector<int> &v,int value)
{
v.push_back(value);
}
void removeItem(vector<int> &v,int value)
{
vector <int>::iterator iter ;

for(iter=v.begin();iter<=v.end();iter++)
{
if(*iter==value)
{
v.erase(iter);
}
}
}
void print(vector<int>&v)
{
for(unsigned int i=0;i<v.size();i++)
{
cout<<v<<",";
}
cout<<endl;
}


#16

السلام عليكم

اقتباس
هذه طريقة بسيطه لشرح الترتيب بالإدراج...... إذا فهمتها.. قم بقراءة الكود و حاول فهمه....

أنا لا أتحدث عن طريقة الإدراج و إنما كيفية استخدام المؤشرات في الطريقة .. أريدك أن تشرح فكرة استخدام المؤشرات في طريقة الإدراج :)

اقتباس
أنا أفضل استعمال الحاوية vector في حالة اردنا حذف أو اضافة بعض العناصر.

هههههه .. ما زلت أشكو من المؤشرات و أنت تتكلم عن الحاويات :ohmy: , يا إلهي !!!!

#17

الأخ Xpero ,,, هلا من فضلك وضحت لي أين تقع المشكله بالتحديد, فأنا مازلت مبتدأ في لغة ال C ؟

الأخ خالد,, لقد وضعت دروس في إحدي المواضيع تتحدث عن شرح للسي بالعربيه,, إقرأ الموضوع الخاص بالمؤشرات

#18

السلام عليكم

اقتباس
ألا تظن ان هناك بعض ال memory leaks في هذا الكود؟ وخصوصا المتغير ret.

قمت بتجربة الكود و ظهر لي الخطأ التالي:

invalid conversion from 'void*' to 'int*'
#19

شكرا أخي خالد على محاولة المساعدة, جزاك الله خيرا.. بالنسبة للخطأ في الترجمه

أي مترجم تستخدم؟

قم بتغير السطر

ret = malloc((length-2)*sizeof(int));

ليصبح:

ret = (int*)malloc((length-2)*sizeof(int));

و ذلك لأن الدالة mallocتقوم بإرجاع void* و بالتالي بعد المترجمات تتطلب عمل cast ...

أظن الأخ xpro يقصد شئ أخر, أليس كذلك؟

#20
هويدي كتب:

الأخ Xpero ,,, هلا من فضلك وضحت لي أين تقع المشكله بالتحديد, فأنا مازلت مبتدأ في لغة ال C ؟

الأخ خالد,, لقد وضعت دروس في إحدي المواضيع تتحدث عن شرح للسي بالعربيه,, إقرأ الموضوع الخاص بالمؤشرات

اخي باستعمال الحجز الديناميكي بواسطة malloc يجب عليك تحرير تلك القطعة المحجوزة من الذاكرة بعد انتهائك منها باستعمال free.

#21
khaled_prg كتب:

السلام عليكم

قمت بتجربة الكود و ظهر لي الخطأ التالي:

invalid conversion from 'void*' to 'int*'

لم انتبه لهذا الجزء .. :) يجب استعمال explicit cast من void* ل *int في هذه الحالة.

#22
اقتباس
اخي باستعمال الحجز الديناميكي بواسطة malloc يجب عليك تحرير تلك القطعة المحجوزة من الذاكرة بعد انتهائك منها باستعمال free.

لكن في حالتي هذه,,, أين بالظبط يجب تحرير الذاكره,,, في الدالة main ؟

لتصبح هكذا:

int main(void)
{
    	int arr[] = {10, 20, 30, 40, 50};

    	int* result= delete_form_arr(arr, 5, 2);

    	if (result != NULL)
    	{
            	int i;
            	for (i=0; i<4; i++)
            	{
                    	printf("%i\n", result);
            	}
     			free(result);		//<< HERE??   	
    	}
    	return 0;
}

حيث أني في الدالة delete_form_arr أقوم بإرجاع المؤشر, لذا أظن أنه لا أستطيع تحرير الذاكره المحجوزه به,, أليس كذلك؟؟

#23

السلام عليكم

ما رأيكم في هذا الكود الذي يقوم بحذف عنصر من عناصر المصفوفة بدون استخدام الخزعبلات ! أقصد المؤشرات :lol: :

#include<iostream>
using namespace std;
int main()
{
    int array[9]={-2,1,0,2,3,7,8,10,15};
    int value,i,j;
    cout << "value = ";
    cin >> value;
    for(i=0; i<9; i++)
    if(array == value) break;
    for(i; i<8; i++)
    array = array[i+1];
    for(i=0; i<8; i++)
    cout << array << " ";
    system("pause");
    return 0;
}

و إذا تكرر العنصر المراد حذفه من المصفوفة فسيتم حذف أول هذه العناصر المتساوية.

#24

ماشاء الله أخي خالد .. شئ جميل :D

لكن ماذا لو أدخل المستخدم قيمه غير موجوده في المصفوفه, ماذا سوف يحدث ؟

#25
هويدي كتب:

لكن في حالتي هذه,,, أين بالظبط يجب تحرير الذاكره,,, في الدالة main ؟

لتصبح هكذا:

int main(void)
{
    	int arr[] = {10, 20, 30, 40, 50};

    	int* result= delete_form_arr(arr, 5, 2);

    	if (result != NULL)
    	{
            	int i;
            	for (i=0; i<4; i++)
            	{
                    	printf("%i\n", result);
            	}
 				free(result);		//<< HERE??   	
    	}
    	return 0;
}

حيث أني في الدالة delete_form_arr أقوم بإرجاع المؤشر, لذا أظن أنه لا أستطيع تحرير الذاكره المحجوزه به,, أليس كذلك؟؟

ليس هنا بل هنا في كود الدالة نفسها




int* delete_form_arr(int* arr, int length, int delete_index)
{
int i, j, *ret;
if (delete_index > length-1)
return NULL;
ret = malloc((length-2)*sizeof(int));

for (i=0, j=0; i<length; i++)
{
if (i == delete_index) continue;
ret[j++] = arr;
}
return ret;
}

أرى انه لا جاجة لارجاع قيمة من نوع int* لان الدالة تستقبل برامتر من نوع array : int* arr و نعلم ان تمرير ال arrays يكون دائما by adress وبالتالي فاي تغيير يقع على البرامتر سيقع على ال array الذي مررناه للدالة ايضا.

سنحول الكود للاتي:



#include <stdio.h>
#include <stdlib.h>

void delete_form_arr(int* , int, int);

int main(void)
{
int arr[] = {10, 20, 30, 40, 50};

delete_form_arr(arr, 5, 2);

if (arr != NULL)
{
int i;
for (i=0; i<4; i++)
{
printf("%i\n", arr);
}
}

return 0;
}

void delete_form_arr(int* arr, int length, int delete_index)
{
int i, j, *ret;
if (delete_index > length-1)
arr= NULL;
ret = (int*)malloc((length-2)*sizeof(int));

for (i=0, j=0; i<length; i++)
{
if (i == delete_index) continue;
ret[j++] = arr;
}
arr=ret;
free(ret) ;



}

khaled_prg كتب:

السلام عليكم

ما رأيكم في هذا الكود الذي يقوم بحذف عنصر من عناصر المصفوفة بدون استخدام الخزعبلات ! أقصد المؤشرات :lol: :

#include<iostream>
using namespace std;
int main()
{
    int array[9]={-2,1,0,2,3,7,8,10,15};
    int value,i,j;
    cout << "value = ";
    cin >> value;
    for(i=0; i<9; i++)
    if(array == value) break;
    for(i; i<8; i++)
    array = array[i+1];
    for(i=0; i<8; i++)
    cout << array << " ";
    system("pause");
    return 0;
}

و إذا تكرر العنصر المراد حذفه من المصفوفة فسيتم حذف أول هذه العناصر المتساوية.

انك تستعملها دون ان تعلم ههه. دائما التعامل مع المصفوفات يتم عن طريق المؤشرات :)

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…