السلام عليكم
سبق و أت كتبت برنامج يقوم بترتيب عناصر المصفوفة بشكل تصاعدي و أريد أن أكتب الآن دالة تستقبل المصفوفة ثم ترتب عناصرها تصاعديا ثم تعيد المصفوفة الجديدة بعد الترتيب.
تحياتي.
السلام عليكم
سبق و أت كتبت برنامج يقوم بترتيب عناصر المصفوفة بشكل تصاعدي و أريد أن أكتب الآن دالة تستقبل المصفوفة ثم ترتب عناصرها تصاعديا ثم تعيد المصفوفة الجديدة بعد الترتيب.
تحياتي.
ماهي خوارزمية الترتيب المستعملة
في النهاية المصفوفة عبارة عن مؤشر لآول عنصر
لذا أعدها من النوع *int
أو قم بوضع مصفوفة كبارامتير لكي يُقام عليها التغيرات لآن التغييرات في القيمة للمؤشرات تتغير حتى بعد الخروج من الدالة
بالتوفيق
اقتباسماهي خوارزمية الترتيب المستعملة
لا تهمني طريقة الترتيب امستعملة !, الفكرة تعمتد على كتابة دالة تعيد مصفوفة int بغض النظر عن طريقة الفرز المستعملة !
اقتباسفي النهاية المصفوفة عبارة عن مؤشر لآول عنصرلذا أعدها من النوع *int
أو قم بوضع مصفوفة كبارامتير لكي يُقام عليها التغيرات لآن التغييرات في القيمة للمؤشرات تتغير حتى بعد الخروج من الدالة
بالتوفيق
ممكن مثال لو سمحت !؟
تم تعديل هذه المشاركة بواسطة khaled_prg في 2 نوفمبر 2010 في 02:44
تفضل
#include<iostream>
using namespace std;
void trier(int (*a)[2])
{
// trier la matrice a[j]
}
void main()
{
int a[2][2]={{1,2},{3,4}};
trier(a);
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
cout<<a[j];
}int* f(int a[],const int size,int &new_size)
{
int *b=new int[size];
new_size=size;
for(int i=0;i<size;i++)
{
b=a*2;
}
return b;
}
void main()
{
const int size=5;
int a[size];
for(int i=0;i<size;i++)
{
a=(i+1);
}
int new_size;
int *b=f(a,size,new_size);
for(int i=0;i<new_size;i++)
cout<<b<<endl;
int ii;cin>>ii;
}هذه الطريقة الأولى
أما الطريقة الثانية التي أفضلها
void f(int a[],const int size,int b[])
{
for(int i=0;i<size;i++)
{
b=a*2;
}
}
void main()
{
const int size=5;
int a[size];
for(int i=0;i<size;i++)
{
a=(i+1);
}
int b[size];
f(a,size,b);
for(int i=0;i<size;i++)
cout<<b<<endl;
int ii;cin>>ii;
}@aohammed
بالنسبة للطريقة الأولى فما فائدة المرجع new_size !؟
بالنسبة للطريقة الثاينة, ألن تستقبل الدالة نسخ من قيم خانات المصفوفة !؟
========
يا ريت لو تشرح الطريقتين بشيء من الإختصار :)
تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 8 نوفمبر 2010 في 21:48
voila l'algorithme :
fonction trier tableau (t ( n ) tableau d'entier) var i : entier vper : entier per : entier repeter per <-- faux pour i <-- 1 à n-1 si t(i+1) < t(i) alors vper <-- t(i) t(i) <-- t(i+1) t(i+1)<-- vper per<-- vrais fin si fin pour i jusqu'à per = faux retourne t (n) fin fonction
peut-etre ma solution peut t'aider a trouver se ke tu veux ....a bientot et bn chance j serais pas là cette semaine
salamo alikom
اقتباسpeut-etre ma solution peut t'aider a trouver se ke tu veux
للأسف ليس هذا ما أريده !, إنما أريد الحل بلغة السي أو السي++ فتحويل الخوارزمية إلى لغة السي/السي++ يتطلب بعض الخبرة في الأوامر المقابلة للخوارزميات في السي/السي++.
اقتباسa bientot et bn chance j serais pas là cette semaine
salamo alikom
أرجو لك التوفيق
^_^
هذي داله كتبتها تو بس معقده كثير .. لان خبرتي بسيطه .. وانا استعملتها ..
#include <iostream>
using namespace std;
int* f(int *a,const int size)
{
int *x = a;
int t,i;
cout<<"Before sorting .. "<<endl;
for( i = 0 ;i<size;i++)
cout<<*(x+i);
cout<<"\n";
for(i = 0 ;i<size;i++)
{
for(int j=1;j<size;j++)
{
if(*(x+i)>*(x+j))
{
t=*(x+i);
*(x+i)=*(x+j);
*(x+j)=t;
}
}
}
for(i=0;i<size;i++)
cout<<*x+i;
return 0;
}
int main()
{
const int size = 5;
int a[5]={5,4,3,2,1};
f(&a[0],size);
system("pause");
return 0;
}اتمنى قدرت افدتك ..
اقتباسaohammedبالنسبة للطريقة الأولى فما فائدة المرجع new_size !؟
بالنسبة للطريقة الثاينة, ألن تستقبل الدالة نسخ من قيم خانات المصفوفة !؟
مرجع لاننا نريد أن نغير حجم المصفوفة " احتمال يكبر أو يصغر " و تغير القيمة لا يكون إلا return أو مرجع لذلك عملنا المصفوفة return و الحجم مرجع
الطريقة الثانية نعم ستسقبل . لكن أن تقوم بتعبئتها " الترتيب مثلا ً " و بشكل عام كل المتغيرات في سي بلس تكون عشوائية لذا فما المشكلة ؟ أتمنى توضيح السؤال لآنني لم أفهم عليك جيداً
toi tu peu la traduire queque soit le langage vb c c++ avec les instructiosn c simple wlah
اقتباسهذي داله كتبتها تو بس معقده كثير .. لان خبرتي بسيطه .. وانا استعملتها ..
أنا أريد دالة تعيد مصفوفة و أنت كتبت في الأخير return 0 !!!
اقتباسمرجع لاننا نريد أن نغير حجم المصفوفة " احتمال يكبر أو يصغر " و تغير القيمة لا يكون إلا return أو مرجع لذلك عملنا المصفوفة return و الحجم مرجعالطريقة الثانية نعم ستسقبل . لكن أن تقوم بتعبئتها " الترتيب مثلا ً " و بشكل عام كل المتغيرات في سي بلس تكون عشوائية لذا فما المشكلة ؟ أتمنى توضيح السؤال لآنني لم أفهم عليك جيداً
باختصار .. أريدك أن تشرح لي كلتا الطريقتين و بشيء من التفصيل لو سمحت :)
اقتباسtoi tu peu la traduire queque soit le langage vb c c++ avec les instructiosn c simple wlah
للأسف لست متعودا على تحويل الخوارزميات إلى لغة برمجة لأنني أستخدم الأوامر البرمجية مباشرة :)
معليش .. " لم انتبه لهذه النقطه .."
هذه مع التعديل .. ^_^
#include <iostream>
using namespace std;
int* f(int *a,const int size)
{
int *x = a;
int t,i;
cout<<"Before sorting .. "<<endl;
for( i = 0 ;i<size;i++)
cout<<*(x+i);
cout<<"\n";
for(i = 0 ;i<size;i++)
{
for(int j=1;j<size;j++)
{
if(*(x+i)>*(x+j))
{
t=*(x+i);
*(x+i)=*(x+j);
*(x+j)=t;
}
}
}
for(i=0;i<size;i++)
cout<<*(x+i);
cout<<"\n";
return x;
}
int main()
{
const int size = 5;
int e[size];
int *r;
int a[5]={5,4,3,2,1};
r=f(&a[0],size);
for(int i = 0;i<size;i++)
{
e=*(r+i);
}
for(i=0;i<size;i++)
cout<<e;
system("pause");
return 0;
}بالنسبة للأخ mr.4one فقد فهمت طريقته و أعجبتني أيضا, قمت بتعديل الكود قليلا و هاهو بعد التعديل :
#include<iostream>
using namespace std;
void F(int *x,int size)
{
int t;
for(int i = 0;i < size;i++)
for(int j = 0;j < size-1;j++)
if(*(x+i) < *(x+j))
{
t = *(x+i);
*(x+i) = *(x+j);
*(x+j) = t;
}
}
int main()
{
int A[5] = {5,4,3,2,1};
F(A,5);
for(int i = 0;i < 5;i++)
cout<<A<<" ";
cout<<endl;
system("pause");
return 0;
}لاحظت أنه لا فائدة من كون الدالة تعيد شيء !, لأن الهدف الرئيسي من الدالة هو تغيير/ترتيب قيم المصفوفة و لا توجد مصفوفة جديدة لنعيد مؤشر يشير إلى أول عنصر فيها بل المصفوفة وحيدة و الذي تغير هو قيم خاناتها فقط :)
============
بالنسبة لطرق الأخ aohammed فلم أفهمها بعد بشكل كامل !
أعتقد أن الطريقة الأولى تقوم بإنشاء مصفوفة ديناميكية و تغير قيم خاناتها ثم تعيد مؤشر يشير إلى أول عناصر هذه المصفوفة, أما الطريقة الثانية فتستخدم مصفوفتين و تسند قيم الجديدة للمصفوفة الثانية.
و لكن .. لماذا تستخدم مصفوفة ديناميكية و المصفوفة موجودة مسبقا و ما نريده هو ترتيبها فقط !؟
ألا تعتقد بأن استخدام مصفوفتين أمر لا داعي له و ربما لا محل له من الإعراب !؟
تحياتي.
عندما نمرر مصفوفة لدالة, هل سيكون التمرير هنا بالقيمة أو بالعنوان !؟
لم أكن أظن أن الكود التالي سيؤدي المطلوب لأنني لم أستخدم فيه المؤشرات ! :
#include<iostream>
using namespace std;
void F(int x[],int size)
{
int t;
for(int i = 0;i < size;i++)
for(int j = 0;j < size-1;j++)
if(x < x[j])
{
t = x;
x = x[j];
x[j] = t;
}
}
int main()
{
int A[5] = {5,4,3,2,1};
F(A,5);
for(int i = 0;i < 5;i++)
cout<<A<<" ";
cout<<endl;
system("pause");
return 0;
}و لكنه أدى المطلوب بشكل تام !!!
ما تفسيركم للقضية !؟
1- الدالة لن تقوم بارجاع جدول من نوع int بل سترجع مؤشر على متغير من نوع int : سيكون هو العنصر الأول في الجدول. الجداول في سي++ تختلف عن جداول اللغات الاخرى مثلا جافا التي يمكن فيها ارجاع جدول من دالة. الجدول في جافا هو عبارة عن كلاس اي كائن واحد بينما الجدول في سي++ هو مجموعة من المتغيرات ذات نوع معين: لا توجد دالة يمكنها ارجاع عدة قيم في ان واحد و بطريقة مباشرة.
2- لا حاجة لارجاع مؤشر على العنصر الاول من الجدول لأن تمرير الجداول يتم بالمرجع في
C++.
3- يبدو أنك تريد التعامل مع الجداول من انواع اخرى كما يتم التعامل مع الجداول من نوع char . الجداول من نوع char هي حالة خاصة و نهاية هذه الجدول تكون محددة ب'\0' مما يسهل التعامل معها دون تجاوز الحجم.
4- اذا أردت ارجاع جدول من دالة معينة مثل جافا او سي شارب مثلا عليك باستعمال الفئة vector من المكتبة القياسية ل سي++.
تم تعديل هذه المشاركة بواسطة xpero في 5 نوفمبر 2010 في 23:29