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

ارجاع انواع بيانات مختلفة من دالة واحدة

بدأه Islamic_Empire في 10 يناير 2009 · 10 رد · 1,860 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هل يمكن لدالة في سي بلس بلس ان ترجع اكثر من نوع من البيانات بناء ً على شرط معين

مثلا حاولت

int a; string b 
template <class t>
t get(int choice)
{
if(choice == 0)
return a;
else
return b;
}

و طبعا لم تفلح محاولتي

هل هناك طريقة اخرى ام انني مضطر لتعريف اكثر من دالة

تم تعديل هذه المشاركة بواسطة Islamic_Empire في 10 يناير 2009 في 23:01

#2

السلام عليكم

هل تقصد ارجاع اكثر من قيمة ؟

ان كانت الاجابة نعم، فكما اعلم انه يمكن (في السي وليس سي بلس بلس، لكن اعتقد انهما متماثلان بالأمر).

يمكن ذلك عن طريق المؤشرات لكن لا أعلم بالضبط كيف، لكن ربما تعرف انت ^_^

ويمكن ايضا كما أخبرني عندما سألت عن ذلك اخي فهد، وهو عن طريق عمل structer

ان شاء الله اكون افدتك اخي الكريم :)

بالتوفيق ان شاء الله

السلام عليكم

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#3

لا أخي العزيز , بل أقصد إرجاع قيمة واحدة ولكن من نوع مختلف كل مرة فعندما ترسل صفر مثلا ترجع الدالة عدد و عندما ترسل واحد ترجع حرف

في الحقيقة انا عندي class به انواع مختلفة من البيانات واريد من أحد ال member functions أن ترجع هذه البيانات حسب الطلب فاذا ارسلت صفر ترجع لي مثلا اسم العميل واذا ارسلت واحد ترجع لي عمره وهكذا

قرأت عن ال Unions ولكني ما زلت مبتدئ ولا اعرف كيف اوظفها

اتمنى ان يكون سؤالي واضح

#4

بالنسبه للقالب فيجب ان يكون القيمه المرجع من نوع البارمترات المدخله.

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

  1. #include<iostream>
  2. #include<string>
  3. #include<cstdlib>
  4. using namespace std;
  5.  
  6.  
  7.  
  8. int a=7; char b[]="i am muslim";
  9. char* get(int choice)
  10. {
  11. char tmp[10] ;
  12.  
  13. if(choice==0)
  14.  
  15. {
  16. itoa(a,tmp,10);
  17. return tmp;
  18. }
  19. else return b;
  20. return (tmp) ;
  21. }
  22.  
  23.  
  24.  
  25. int main()
  26. {
  27. int k;
  28. cout<<"Enter Number:";
  29. cin>>k;
  30. cout<<get(k)<<endl;
  31.  
  32.  
  33.  
  34.  
  35. cin.get();
  36. cin.get();
  37. return 0;
  38. }
  39.  

tvquran_6.gif

#5
اقتباس
عندي Class به انواع مختلفة من البيانات واريد من أحد ال member functions أن ترجع هذه البيانات

يفترض في الكلاس ان تستخدم عضودالي لكل نوع .

مثلا getname getnumber

tvquran_6.gif

#6

وعليكــم السـلام ورحمة الله وبركاتـه..

من منظور object oriented ، العمليه غير مستحسنه أبدا ولا ينصح بها ، فلنفرض أنك أستطعت أن ترجع من الداله أكثر من نوع ، الأن كيف تستقبل هذه القيمه أقصد الراجع من الداله ، قد يكون أكثر من قيمه من انواع بيانات مختلفه (كائن ، نص ، عدد) ، لذلك ستضطر بطريقه ما بوضعه ما مكان ما ، أو الأشاره الى ذلك المؤشر من خلال مؤشر void ، أو أي طريقه المهم بعدها عليك أن تعرف نوع البيانات الحقيقي حتى تستطيع التعامل معه ،، في جافا لأن جميع الكائنات تعتبر من نوع Object تستطيع ارجاع Object ، لكن ستقع في نفس المشكله وهي ما بعد ارجاع القيمه كيف تستطيع أن تتعامل معها ، كيف ستعرف أن القيمه هي عدد أو كائن من كلاس معين ، أو نص أو أو ...

لذلك دائما أبتعد عن التعقيد في كتابه الكلاسات وأجعلها natural بقدر الإمكان ، اذا لديك الكائن Person ، وأردت أن تستدعى داله ما فلتكن الداله مباشره وذات هدف محدد ، فقد تريد أن تسأل الكائن عن عمره أو أسمه أو أي خصائص اخرى person.getName مثلا person.getAge وهكذا ..

في حال أردت للمستخدم الخيار بادخال ما يريده فأعرض قائمه يختار منها المستخدم الخيار الذي يريده x ، وبجمله if بسيطه اختبر x واستدعي الداله المناسبه ،، هكذا ستكون تجنبت جميع المسائل التي ستقع فيها حينما تجعل داله في الكائن تستقبل القيمه وتقوم بارجاع ما يناسب ،،

أمر أخر ، الكائن ليس من مهماته اختبار قيمه أو حتى ادخال قيمه cin أو اخراج قيمه cout ،، التصميم الجيد في الكلاسات يبعد الI/O تماما عن الكلاسات وخاصه الكلاسات الرئيسيه في المشكله problem domain ، وهو نمط Desgin pattern معروف وهو Model-View-Controller بمعني أبعد الكلاس عن طريقه عرضه عن طريقه التحكم به(ادخال للقيم أو event handling في حال كان الكائن يستمع لحدث معين) .

بالنسبه للUnion فهي مثل الstruct لكن فقط متغير واحد من داخل الunion تستطيع أن تعطيه قيمه والبقيه بدون .. فاذا كان لديك عدد صحيح وحقيقي ونص ، وأعطيت قيمه للنص فبقيه المتغيرات لن تكون لها قيمه ،،،

ربما تريد أن تكون هذه القيمه الوحيده التي تريد أن ترجعها من الكلاس ،، لكن كيف ستعرف بعد استدعاء الداله نوعيه هذه القيمه العائده من الكلاس..

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

بالتوفيق :) .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#7

أخوتي شكرا لمشاركاتكم

المشكلة اني عندي كلاس اسمها person وقمت بإنشاء مصفوفة منها

الآن انا اريد ترتيب المصفوفة على حسب

مثلا العمر المرتب الاسم ... وبما إن خوارزمية الترتيب واحدة حاولت كتابة دالة ترتيب موحدة

. ولكن حسب كلامكم يعني ذلك اني ساضطر لأكتب عدد كبير من دوال الترتيب ,فلو كان عندي ستة عناصر يلزمني ستة دوال , هل هذا هو الحل الوحيد ام ان ال OOP تقدم طريقة افضل

بانتظار مشاركاتكم

تم تعديل هذه المشاركة بواسطة Islamic_Empire في 11 يناير 2009 في 14:09

#8

هذا مثال بسيط يشرح الفكرة :

  1. #include<iostream>
  2. #include<string>
  3.  
  4. using namespace std;
  5.  
  6.  
  7.  
  8. class person
  9. {
  10. private:
  11. string name;
  12. int age;
  13. float salary ;
  14.  
  15. public:
  16.  
  17.  
  18. void set_name(string str) { name=str;}
  19.  
  20. void set_age(int num){age=num;}
  21.  
  22. void set_salary(float sala){salary=sala; }
  23.  
  24. string get_name(){ return name; }
  25.  
  26. int get_age() { return age; }
  27.  
  28. float get_salary(){return salary;}
  29.  
  30.  
  31.  
  32.  
  33.  
  34. };
  35.  
  36. int main()
  37. {
  38. person per[5];
  39. string str;
  40. int ag;
  41. float sala;
  42. person tmp;
  43. for(int i=0;i<5;i++)
  44. {
  45. cout<<"Enter Name:";
  46. cin>>str;
  47. per[i].set_name(str);
  48. cout<<"Enter age:";
  49. cin>>ag;
  50. per[i].set_age(ag);
  51. cout<<"Enter salary :";
  52. cin>>sala;
  53. per[i].set_salary(sala);
  54.  
  55. }
  56.  
  57. for(int i=0;i<4;i++)
  58. {
  59. for(int j=i;j<5;j++)
  60. {
  61. if(per[i].get_age()<per[j].get_age())
  62. {
  63. tmp=per[i];
  64. per[i]=per[j];
  65. per[j]=tmp;
  66.  
  67. }
  68. }
  69. }
  70.  
  71.  
  72. for(int i=0;i<4;i++)
  73. {
  74.  
  75. cout<<"Name :"<<per[i].get_name()<<endl;
  76. cout<<"age :"<<per[i].get_age()<<endl;
  77. cout<<"salary:"<<per[i].get_salary()<<endl;
  78. }
  79.  
  80.  
  81.  
  82. return 0;
  83. }
  84.  

tvquran_6.gif

#9

اخي لقد فهمت ما تقصد

ولكن ماذا لو كنت اريد المقارنة حسب الاسم و العمر والمرتب والطول

ماذا لو كان عندي نظام قواعد بيانات به عشرين حقل مختلف

هل سأكتب دالة ترتيب لكل نوع من الحقول

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

#10

حسنا في تلك الحاله ستضطر الى كتابه داله واحده sort تأخذ قيمه غير معروفه Template ،، وتحتوي على نفس الحلقتين في كود أخ فهد ،، وتحتوي على داله Swap تأخذ متغيرين أيضا غير معروفين Template ، ويتم التبديل بينهم ،،

الأن في حال أراد المستخدم الترتيب بناء على الراتب ، ستقوم بعمل instance للقالب بنوع بيانات الراتب ،، واستدعى الداله sort ،، وبنفس الفكره لو أراد الترتيب حسب الأسم أو العمر ،،

بالتوفيق :) .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#11

حسنا أخي ولكن ماهو instance ارجو بأن توضحلي اكثر

هذا هو كودي :

#include <string>
#include <iostream> 
#include <vector>
using namespace std;

class Person
{
private:
 string fName , lName;
 int age; float salary;
public:
 Person(string f,string l, int a , float s)
 {
  fName = f; l = lName;
  age = a; salary = s;
 }
 void display()
 {
  cout << fName << " " << lName << " " << age << " years old  " << salary << "$";
 }

};

//---------------End of class Person-------------//

class pList
{
private:
 vector<Person*> per;
 int nElem;
public:
 pList()
 {nElem = 0;}

 void insert(string f , string l , int  a , float s)
 { 
  per[nElem++] = new Person(f,l,a,s);
 }

 void sort()
 {

 }

};

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

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

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

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

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