• 0
khaled_prg

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

سؤال

السلام عليكم

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[i]<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[i]<<" ";

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[i]==value) break;
//إرجاع عناصر المصفوفة
for(i;i<10;i++)
array[i]=array[i-1];
//إظهار عناصر المصفوفة بعد عملية الحذف و الإرجاع
for(i=0;i<10;i++)
cout<<array[i]<<" ";
system("pause");
return 0;
}

سلامي.

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

27 إجابة على هذا السؤال .

  • 0

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

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

0

شارك هذا الرد


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

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

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

تم تعديل بواسطه هويدي
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

إستخدم ال 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--;
}
}
}

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

بانتظارك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

تم تعديل بواسطه اسراء شلبى
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

#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[i]<value && value<array[i+1])
{
index=i+1;
for(int i=9 ; i>=index ; i--)
array[i]=array[i-1];
array[index]=value;
break;
}
//إظهار عناصر المصفوفة بعد عملية الإدراج و الإزاحة
for(int i=0;i<10;i++)
cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}

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

بالتوفيق ,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

هو بالضبط :wink:

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

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
طيب .. ماذا عن عملية الحذف (حذف عنصر من عناصر المصفوفة) !؟

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

ماذا لو أن 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[i]);
}
}
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[i];
}
return ret;
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

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

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

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

بانتظارك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبة لل 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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

ماذا لو أن 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[i]);
}
}
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[i];
}
return ret;
}

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أنا أفضل استعمال الحاوية 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[i]<<",";
}
cout<<endl;
}


0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

ليصبح:

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
اخي باستعمال الحجز الديناميكي بواسطة 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[i]);
}
free(result); //<< HERE??
}
return 0;
}

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ما رأيكم في هذا الكود الذي يقوم بحذف عنصر من عناصر المصفوفة بدون استخدام الخزعبلات ! أقصد المؤشرات :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[i] == value) break;
for(i; i<8; i++)
array[i] = array[i+1];
for(i=0; i<8; i++)
cout << array[i] << " ";
system("pause");
return 0;
}

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لكن في حالتي هذه,,, أين بالظبط يجب تحرير الذاكره,,, في الدالة 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[i]);
}
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[i];
}
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[i]);
}
}

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[i];
}
arr=ret;
free(ret) ;



}

السلام عليكم

ما رأيكم في هذا الكود الذي يقوم بحذف عنصر من عناصر المصفوفة بدون استخدام الخزعبلات ! أقصد المؤشرات :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[i] == value) break;
for(i; i<8; i++)
array[i] = array[i+1];
for(i=0; i<8; i++)
cout << array[i] << " ";
system("pause");
return 0;
}

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك أخي xpro ,,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .