• 0
khaled_prg

استفسار حول التحميل الزائد + سؤال عن عكسية الـ atof

سؤال

السلام عليكم

بداية .. كل عام و أنتم بخير و مبروك عليكم العيد, أعاده الله علينا و عليكم بالخير و البركة :)

لا شك و أنكم اشتقتم إلى أسئلتي التي تحتاج إلى تحريك الجمجمة :D لذا فها أنا أطرح عليكم اليوم سؤالان :

السؤال الأول :

وجدت في أحد الكتب ما يلي :

التحميل الزائد للدوال (أو الـ overloading) أو استنساخها هو أن توجد عدة دوال بنفس الإسم و تختلف وسائطها من حيث النوع أو العدد او الترتيب و لا يعتمد الأمر على القيمة المرجعة.

  • هل معنى هذا أن الـ overloading هو أن توجد عدة دوال تتفق في الإسم و الأوامر و تختلف في الوسائط من حيث النوع أو العدد أو الترتيب
  • هل يمكن كتابة دالة تقوم بإرجاع أكبر عدد من بين عدد من الوسائ يترواح ما بين 3 و 8 و ذلك باستخدام الـ overloading !؟
  • إذا كانت لدينا دالة تستقبل من 3 إلى 9 و سائط من النوع char و تقارنها بـ {a,b,c} أو {1,2,3} أو {x,y,z}, هل يمكن عمل هذه الدالة باستخدام الـ overloading !؟

السؤال الثاني :

  • هل توجد دالة معرفة مسبقا في السي/السي++ تحول عدد حقيقي إلى سلسلة حرفية !؟ (تماما مثل عكس atof)
  • هل يمكننا كتابة دالة عكسية تستقبل اسم الدالة المراد عكسها ثم تعيد قيمة عكسية لما تعيده الأولى !؟ (طبعا هذا غير صالح لجميع الدوال فمثلا .. لاتوجد دالة عكسية لـ sqrt و لكنني أتحدث عن دوال معينة مثل atol)

ملاحظة : الهدية التي أطلبها منكم في هذا العيد هي إجابة هذه الأسئلة و لكم مني الدعاء بظهر الغيب :)

بانتظاركم يا أبطال الفريق :)

0

شارك هذا الرد


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

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

  • 0

السلام عليكم

بخصوص السؤال الاول تفضل مثال يوضح الامر:


int addition(int a,int b)
{
return a+b;
}

double addition(int a,int b,double c)
{
return (a+b)+c;
}
int addition(int a,int b,int c)
{
return (a+b)+c;
}


بالنسبة للدالتين الاولى و الاخيرة لهما نفس الاسم و تعيدان نفس النوع لكن عدد البارامترات(الوسائط) مختلف

اما بالنسبة للثاية فنفس الاسم لكن النوع و البارامترات مختلفة

0

شارك هذا الرد


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

السلام عليكم

بخصوص السؤال الاول تفضل مثال يوضح الامر:

int addition(int a,int b)
{
return a+b;
}

double addition(int a,int b,double c)
{
return (a+b)+c;
}
int addition(int a,int b,int c)
{
return (a+b)+c;
}

بالنسبة للدالتين الاولى و الاخيرة لهما نفس الاسم و تعيدان نفس النوع لكن عدد البارامترات(الوسائط) مختلف

اما بالنسبة للثاية فنفس الاسم لكن النوع و البارامترات مختلفة.

مرحبا بالبطريق اللينكساوي :wink: (أرتاح عندما أراه :lol: ) أشكرك على الرد :)

  • أين الـ overloading في مثالك !؟, ألا يجب أن تكون هناك دالة تجمع الدوال التي ذكرتها !؟
  • أنا طرحت أسئلة محددة (لكي لا يتشعب الموضوع) و أريد جوابها :)

بانتظاركم يا أبطال :)

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
هل معنى هذا أن الـ overloading هو أن توجد عدة دوال تتفق في الإسم و الأوامر و تختلف في الوسائط من حيث النوع أو العدد أو الترتيب !؟

العبارة كلها صحيحة ما عدا تتفق في الأوامر ، حيث أن الاتفاق في الأوامر حالة خاصة و إليك المثال التالي:

#include<iostream.h>
void test(int a,int b)
{

cout<<"a="<<a<<" b="<<b<<endl;
}
void test(int a,int b,int c)
{

cout<<"a+b+c="<<a+b+c<<endl;
}
void main()
{
test(1,2);
test(1,2,3);
}

الخرج

a=1 b=2

a+b+c=6

Press any key to continue

و التحميل الزائد لا ينحصر في موضوع الوسائط إنما له مجالات أوسع بكثير (التحميل الزائد للعمليات مثلاً) و قمة الاستفادة في التحميل الزائد تكمن في الصفوف عند التحميل الزائد لتوابع البناء مثلاً أو توابع الإخراج و الإدخال و العوامل الحسابية(+و-و++و/و*و%) و العوامل المنطقية(& و||) .

مثال على التحميل الزائد في الصفوف :

في هذا المثال قمت بالتحميل الزائد للخرج و الدخل ليصبحى تحت اسم

khalid_cout و khalid_cin

(انظر للخرج أولاً من فضلك ثم اقرأ الكود و لا تدقق على التفاصيل في الكود و لكن خذ الفكرة)

#include<iostream.h>
class test
{
//*******(without overloading)*******//
private:
int a,b;
public:
void getdata()
{
cout<<"a="<<a<<" b="<<b<<" this is without overloading"<<endl;
}
void set(int x,int y)
{
cout<<" this is without overloading"<<endl;
a=x;b=y;
}
friend ostream &operator<<(ostream &khalid_cout,test ob);
friend istream &operator>>(istream &khalid_cin,test & ob);
};
///**********************************///

///******(cin&cout)overloading*******///
ostream &operator<<(ostream &khalid_cout,test ob)
{
khalid_cout<<"a="<<ob.a;
khalid_cout<<" b="<<ob.b;
khalid_cout<<" this is with overloading"<<endl;
return khalid_cout;
}
istream &operator>>(istream &khalid_cin,test & ob)
{
cout<<"enter a,b"<<endl;
khalid_cin>>ob.a;
khalid_cin>>ob.b;
cout<<"this is with overloading"<<endl;
return khalid_cin;
}
///**********************************///


void main()
{
test object1;
//could you do the following without overloading
cin>>object1;
cout<<object1;
object1.getdata();
//without overloading
test object2;
object2.set(0,6);
object2.getdata();
}

الخرج :

enter a,b

62

12

this is with overloading

a=62 b=12 this is with overloading

a=62 b=12 this is without overloading

this is without overloading

a=0 b=6 this is without overloading

Press any key to continue

هل يمكن كتابة دالة تقوم بإرجاع أكبر عدد من بين عدد من الوسائ يترواح ما بين 3 و 8 و ذلك باستخدام الـ overloading !؟

نعم . تعرف مثلاً 5 توابع محملة بسكل زائد .

الأول3 وسائط و الثاني 4 و الثالث......وهكذا وأنت تحدد التوابع الواجب استدعاءه من خلال عدد الأعداد التي عندك .

ملاحظة :

ذا كانت لدينا دالة تستقبل من 3 إلى 9 و سائط من النوع char و تقارنها بـ {a,b,c} أو {1,2,3} أو {x,y,z}, هل يمكن عمل هذه الدالة باستخدام الـ overloading !؟

ليست دالة تستقبل من 3 إلى 9 وسائط و إنما دوال محملة بشكل زائد بحسب الحالات .

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

شارك هذا الرد


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

1-يبدو أن ترجمة ال overloading ترجمة حرفية ب"التحميل الزائد" يؤدي الى الفهم الخطأ.

ال overloading ليس له علاقة بعدد البرامترات التي تحملها دالة معينة و معناه هو :"أن توجد دالتين او اكثر لهما نفس الاسم وتختلفان في المدخلات أو المخرجات أو كلاهما معا".

مثال:


double sqrt(double x);
float sqrt(float x);
long double sqrt(long double x);

2 - توجد الدالة strtod في الهيدر cstdlib وهي تحول سلسة نصية (عبارة عن أرقام) الى النوع double.

3- يمكن كتابة دالة تستقبل اسم الدالة المراد عكسها على شكل سلسلة نصية مثلا


void reverse( char* func_name , type& output)
{
switch (name){
case "X" :
{...}
break;
case "Y":
{...}
break;
. . .
}
}

يمكن عمل ذلك بشكل أكثر تطورا : باستعمال ال templates او المؤشرات على الدوال.

0

شارك هذا الرد


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

و عليكم السلام و الرحمة, كل عام و أنت بخير.

بداية, بشكل عام الـ overloading لا يستخدم للحالات التي تسأل عنها. الحالات التي يستحب فيها الـ overloading هو عندما تريد استخدام دوال لها نفس الاسم لأغراض متعددة. تصور أن لديك مجموعة دوال كلها اسمها toStr تقوم بالتحويل لنص من أي نوع قمنا بعمل overloading له في parameters الدالة. المهم هنا, هو أننا استخدمنا دوال مختلفة, لها نفس الاسم, للقيام بعملية مشتركة في النتيجة مختلفين في كيفية تنفيذ الوظيفة نفسها. أحياناً يقال: same name for different implementation.

هل معنى هذا أن الـ overloading هو أن توجد عدة دوال تتفق في الإسم و الأوامر و تختلف في الوسائط من حيث النوع أو العدد أو الترتيب !؟

عندما يريد المترجم اختيار دالة لندائها فإن كل ما يراه أمامه هو اسم الدالة الذي تم كتابته مكان استدعائها. لاحظ أنه لا يجوز أن تقوم بنداء دالة, ثم لا يعرف المترجم أي دالة سينادي. لابد أن يقوم المترجم بتحديد دالة محددة و هذا يتم بأن "مجموعة الخصائص التي تعرف الدالة يجب أن تكون منفردة بها". قد يوجد دالتان لهما نفس الاسم و لكن يختلفان في الـ parameters. بشكل مبسط, يمكنك تصور أن اسم الدالة و الـ parameters مجتمعين هما "طريقة تعرف المترجم على الدالة المشار إليها في مكان ندائها." لاحظ أننا قلنا أن هذا التعريف مبسط, لأن هناك تفاصيل في الـ parameters نفسهم, ماذا لو كان لدينا التالي فهل هذين دالتين مختلفتين؟

void function(int n);
void function(int& n);
int main()
{
int n = 3;
function(n);
}

صدقني, هذه هي التفاصيل التي يجب على كل مصمم لغة أن يقررها, و لهذا تجد مصممي لغات البرمجة و مبرمجي الـ compilers عبارة عن super humans :)

هناك آلالف التفاصيل الصغيرة, و إذا أردت أن تصبح language lawyer فعليك أن تفهمها.

هل يمكن كتابة دالة تقوم بإرجاع أكبر عدد من بين عدد من الوسائ يترواح ما بين 3 و 8 و ذلك باستخدام الـ overloading !؟

هذا الأمر ممكن, قم بكتابة الكود للدوال التالية:

int maximum(int a, int b, int c, int d, int e, int f, int g, int h);
int maximum(int a, int b, int c, int d, int e, int f, int g);
int maximum(int a, int b, int c, int d, int e, int f);
int maximum(int a, int b, int c, int d, int e);
int maximum(int a, int b, int c, int d);
int maximum(int a, int b, int c);

و لكن حقيقة, هل تعتقد أن هذا حل صحيح للمسألة؟ ماذا لو كان لدينا عشرة أعداد؟

الحل يكون باستخدام المصفوفات و std::max_element من المكتبة القياسية. أو استخدام std::set. في Cpp0x يمكن كتابة دالة واحدة تقوم باستقبال عدد غير محدد مسبقاً من الأعداد على سبيل المثال. ثم تأتيك تلك الأعداد على شكل مصفوفة "خاصة". بعدها تقوم بتطبيق std::max_element عليها في الدالة و تعيد الـ max!

إذا كانت لدينا دالة تستقبل من 3 إلى 9 و سائط من النوع char و تقارنها بـ {a,b,c} أو {1,2,3} أو {x,y,z}, هل يمكن عمل هذه الدالة باستخدام الـ overloading !؟

نفس الإجابة السابقة, الـ overloading لم يضعه مصمم اللغة لهذه الأغراض أساساً. هناك طريق أفضل بكثير و أكثر وضوحاً و أفضل عند الكتابة و القراءة و التنفيذ.

هل توجد دالة معرفة مسبقا في السي/السي++ تحول عدد حقيقي إلى سلسلة حرفية !؟ (تماما مثل عكس atof)

إذا كنت تستخدم C فلا تستخدم atoi و أخواتها. استخدم strtod بدلاً من ذلك لأنها تعطيك معلومات حصول حصول خطاً من عدمه. أيضاً, إجابة على سؤالك يمكنك استخدام sprintf. عموماً لو كان الأمر بـ ++C فهو سهل جداً:


#include <sstream>
#include <string>
using namespace std;

template <typename T>
string toStr(const T& value)
{
ostringstream convertor;
convertor << value;
return convertor.str();
}

int main()
{
string number_string = toStr(5.66);
}

كل هذه الأدوات الصغير ستجدها في boost. تسمى في boost بـ lexical_cast عند الحديث عن التحويل بين النصوص و الأنواع المختلفة.

* هل يمكننا كتابة دالة عكسية تستقبل اسم الدالة المراد عكسها ثم تعيد قيمة عكسية لما تعيده الأولى !؟ (طبعا هذا غير صالح لجميع الدوال فمثلا .. لاتوجد دالة عكسية لـ sqrt و لكنني أتحدث عن دوال معينة مثل atol)

لا أدري ماذا تقصده بهذا السؤال, و لماذا نحتاج لشيء كهذا.

تحياتي...

2

شارك هذا الرد


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

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

هل أفهم من كلامك أن التحميل الزائد هو أن توجد عدة دوال بنفس الإسم و لا يُشترط أن تكون لها نفس الأوامر أو حتى نفس الهدف !؟

التحميل الزائد لا ينحصر في موضوع الوسائط إنما له مجالات أوسع بكثير (التحميل الزائد للعمليات مثلاً) و قمة الاستفادة في التحميل الزائد تكمن في الصفوف عند التحميل الزائد لتوابع البناء مثلاً أو توابع الإخراج و الإدخال و العوامل الحسابية(+و-و++و/و*و%) و العوامل المنطقية(& و||) .

مثال على التحميل الزائد في الصفوف :

في هذا المثال قمت بالتحميل الزائد للخرج و الدخل ليصبحى تحت اسم

khalid_cout و khalid_cin

(انظر للخرج أولاً من فضلك ثم اقرأ الكود و لا تدقق على التفاصيل في الكود و لكن خذ الفكرة)

أنا طرحت أسئلة محددة (لكي لا يتشعب الموضوع) و أريد جوابها :)

الأول3 وسائط و الثاني 4 و الثالث......وهكذا وأنت تحدد التوابع الواجب استدعاءه من خلال عدد الأعداد التي عندك .

  • ممكن مثال !؟
  • ألا يمكننا كتابة دال واحدة تتولى المهمة !؟

يمكن كتابة دالة تستقبل اسم الدالة المراد عكسها على شكل سلسلة نصية مثلا

:blink: :wacko:

الحل يكون باستخدام المصفوفات و std::max_element من المكتبة القياسية. أو استخدام std::set. في Cpp0x يمكن كتابة دالة واحدة تقوم باستقبال عدد غير محدد مسبقاً من الأعداد على سبيل المثال. ثم تأتيك تلك الأعداد على شكل مصفوفة "خاصة". بعدها تقوم بتطبيق std::max_element عليها في الدالة و تعيد الـ max!

ممكن مثال لو سمحت !؟

إذا كنت تستخدم C فلا تستخدم atoi و أخواتها. استخدم strtod بدلاً من ذلك لأنها تعطيك معلومات حصول حصول خطاً من عدمه

هل يمكن أن تلعب الدالة strtod دور عائلة atox, أقصد {atof,atofl,atoi} !؟ و كيف !؟

يمكنك استخدام sprintf

كيف ذاك !؟

لا أدري ماذا تقصده بهذا السؤال, و لماذا نحتاج لشيء كهذا.

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

بانتظاركم يا أبطال :)

0

شارك هذا الرد


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

أين انتم يا أبطال الفريق !؟

ألا يوجد من يريد تقديم هدية لي !؟ :)

0

شارك هذا الرد


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

ممكن مثال لو سمحت !؟

هذه هي الطريقة التقليدية في ++C الحالية. كل ما سنقوم به هو أننا سنستخدم المصفوفات العادية في ++C و من ثم نقوم بإيجاد أكبر عدد(و أصغر عدد):

#include <cstddef>   // for std::size_t
#include <algorithm> // for std::max_element
#include <iostream> // for std::cout

int main()
{
const std::size_t size = 10;
int array[size] = {6, 5, 2, 0, 4, 9, 7, 1, 3, 8};
int* max_ptr = std::max_element(array, array+size);
int* min_ptr = std::min_element(array, array+size);
std::cout << "max = " << *max_ptr << std::endl;
std::cout << "min = " << *min_ptr;
}

الأمر أسهل بدون استخدام مصفوفات إضافية في Cpp0x, يمكنك كتابة دالة تستقبل initializer_list. و هناك طرق أخرى أيضاً:

#include <iostream>
#include <algorithm>

template <typename T>
T maximum(const std::initializer_list<T>& l)
{ return *std::max_element(l.begin(), l.end()); }

int main()
{
int max_int = maximum({6, 5, 2, 0, 4, 9, 7, 1, 3, 8});
double max_double = maximum({8.0, 3.0, 1.0, 7.0, 9.0, 4.0, 0.0, 2.0, 5.0, 6.0});
std::cout << "max_int = " << max_int << std::endl;
std::cout << "max_double = " << max_double << std::endl;
}

هل يمكن أن تلعب الدالة strtod دور عائلة atox, أقصد {atof,atofl,atoi} !؟ و كيف !؟

و لماذا تستخدم عائلة atox؟ هذه الدوال لا يستخدمها مبرمجو C! استخدام الدوال الموفرة في المكتبة القياسية المخصصة للتحويل! نعم strtod و أخواتها. هذا إذا كنت مصراً على C دون ++C. أما باستخدام ++C, فاستخدام الـ streams دائماً.

كيف ذاك !؟

نفس استخدام printf و لكن تمرر لها النص الذي قمت بحجزه سابقاً لكي تقوم بعملية الإخراج للنص بدلاً من الشاشة.

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

حتى الآن لا أفهم ماذا تريد بالضبط؟

هل تريد عمل شيء مثل قواعد البيانات بحيث تقوم بعمل rollback لأي قيمة سابقة؟ يمكنك بناء ما تريد, قم بكتابة مكتبة تحتفظ بالقيمة و معلومات جميع الدوال التي تم تطبيقها عليها. إضافة إلى ذلك تحتاج إلى جدول يوضح كل دالة و الدالة المعاكسة لها لتقوم بعملية التطبيق لأي عمق تريده!

تحياتي...

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

شارك هذا الرد


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

هل تريد عمل شيء مثل قواعد البيانات بحيث تقوم بعمل rollback لأي قيمة سابقة؟ يمكنك بناء ما تريد, قم بكتابة مكتبة تحتفظ بالقيمة و معلومات جميع الدوال التي تم تطبيقها عليها. إضافة إلى ذلك تحتاج إلى جدول يوضح كل دالة و الدالة المعاكسة لها لتقوم بعملية التطبيق لأي عمق تريده!

تنازلت عن الفكرة :blush:

الآن لدي سؤالين :

  • هل معنى التحميل الزائد هو أن توجد عدة دوال بنفس الإسم و لا يُشترط أن تكون لها نفس الأوامر أو حتى نفس الهدف !؟
  • أريد شرح للدالة strtod, ماذا تستقبل و ماذا تعيد و مثال للتوضيح :)

بالإنتظار.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
* هل معنى التحميل الزائد هو أن توجد عدة دوال بنفس الإسم و لا يُشترط أن تكون لها نفس الأوامر أو حتى نفس الهدف !؟

نعم بنفس الإسم، ولكن تستقبل معاملات مختلفة العدد أو النوع،، هذا ما يهم المترجم.. أما اذا كانت الدالة المسمى ب a1 تأخذ int وترجع مضروبه والدالة a1 تأخذ double وترجع صفر فهذا ليس من مهمه المترجم ولن يقول الimplementation يختلف عن الأخرى .

* أريد شرح للدالة strtod, ماذا تستقبل و ماذا تعيد و مثال للتوضيح :)

google it :):

http://www.cplusplus.com/reference/clibrary/cstdlib/strtod/

بالتوفيق،،

0

شارك هذا الرد


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

دخلتُ هذه الصفحة من قبل ! :blush:

أنا أدرس بالفرنسية فقط !, و ترجمة جوجل ليست دقيقة بما يكفي !

==========

حسبما فهمت من الصفحة هو أن الدالة strtod تستقبل مؤشر و مؤشر لمؤشر (الطف يا رب :blush: ) ثم تعيد متغير من نوع double يحتوي على العدد الحقيقي الذي كان في المؤشر الأول (على هيئة string) :happy:

فهمت أن المؤشر الأول يحتوي على السلسلة التي نريد تحويلها إلى double و لكن ما فائدة المؤشر لمؤشر الثاني !؟ :blink: :wacko:

0

شارك هذا الرد


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

منذ فتره طويله كنت قد كتبت دالتين لتحويل الحروف لأرقام يمكنك ان تجدها فى هذا الموضوع.

و الله ولي التوفيق

تم تعديل بواسطه محمد علاء الدين
0

شارك هذا الرد


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

الدالة تستقبل جدول char و مؤشر على جدول من ال chars


double strtod ( const char * str, char ** endptr );

الاول : const char* str

هو النص الذي تريد تحويله ل double

الثاني char** endptr

هو مؤشر على متغير من نوع char*

هنا تقموم الدالة strtod بحفظ مؤشر الى العدد الموالي في str.



char* endp;
doube d1,d2;
d1=strtod("18-10-2010",&endp); //d1 ==18.0
d2=strtod(endp,NULL); // d2==10.0 ==> endp=="10-2010"

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

شارك هذا الرد


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

منذ فتره طويله كنت قد كتبت دالتين لتحويل الحروف لأرقام يمكنك ان تجدها فى هذا الموضوع.

أشكرك على المساعدة, فعلا.. دوال تثلج الصدر ! :)

أظن أنني سأتعملها لاحقا و لكنني الآن أريد شرح الدوال الجاهزة فقط ! :blush:

هو مؤشر على متغير من نوع char*

هنا تقموم الدالة strtod بحفظ مؤشر الى العدد الموالي في str.

لم أفهم قصدك من هذه الفقرة !, يمكنك التعبير بالفرنسية إن أردت :happy:

0

شارك هذا الرد


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

أشكرك على المساعدة, فعلا.. دوال تثلج الصدر ! :)

أظن أنني سأتعملها لاحقا و لكنني الآن أريد شرح الدوال الجاهزة فقط ! :blush:

لم أفهم قصدك من هذه الفقرة !, يمكنك التعبير بالفرنسية إن أردت :happy:

كانها تقوم بحذف العدد الاول الذي تم تحويله من الجدول. انظر المثال لتفهم.

هذا موقع بالفرنسية كمرجع ل c++

http://www.cppreference.com/wiki/fr/string/c/strtod

0

شارك هذا الرد


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

كانها تقوم بحذف العدد الاول الذي تم تحويله من الجدول. انظر المثال لتفهم.

هذا موقع بالفرنسية كمرجع ل c++

http://www.cpprefere...string/c/strtod

جميل جدا .. :)

يعني .. الدالة strtod تستقبل مؤشر و مؤشر لمؤشر و تعيد متغير من نوع double يحتوي على العدد الحقيقي الذي كان على هيئة string في المؤشر الأول, إذا كانت الـ string (الوسيط الأول) لا تمثل عدد حقيقي صالح فستعيد الدالة 0.000000, أما إذا تم تحويل الـ string (الذي كان في المؤشر الأول) إلى عدد حقيقي فسيتم تخزين باقي السلسلة (إن وُجد) في المؤشر لمؤشر الثاني, مثال :

#include <iostream>
using namespace std;
int main ()
{
char str[] = "36.435435#434234";
char* STR;
double d = strtod (str,&STR);
cout<<STR<<endl<<d<<endl;
system("pause");
return 0;
}

  • ما تعقيبكم !؟
  • لماذا نحتاج إلى يكون الوسيط الثاني مؤشر لمؤشر !؟ ألا يكفي أن يكون مؤشرا نخزن فيه الجزء المتبقي من السلسلة المُحولة !؟

0

شارك هذا الرد


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

جميل جدا .. :)

يعني .. الدالة strtod تستقبل مؤشر و مؤشر لمؤشر و تعيد متغير من نوع double يحتوي على العدد الحقيقي الذي كان على هيئة string في المؤشر الأول, إذا كانت الـ string (الوسيط الأول) لا تمثل عدد حقيقي صالح فستعيد الدالة 0.000000, أما إذا تم تحويل الـ string (الذي كان في المؤشر الأول) إلى عدد حقيقي فسيتم تخزين باقي السلسلة (إن وُجد) في المؤشر لمؤشر الثاني, مثال :

#include <iostream>
using namespace std;
int main ()
{
char str[] = "36.435435#434234";
char* STR;
double d = strtod (str,&STR);
cout<<STR<<endl<<d<<endl;
system("pause");
return 0;
}

  • ما تعقيبكم !؟
  • لماذا نحتاج إلى يكون الوسيط الثاني مؤشر لمؤشر !؟ ألا يكفي أن يكون مؤشرا نخزن فيه الجزء المتبقي من السلسلة المُحولة !؟

الجداول في سي++ تمرر دائما بالعنوان ..سواء بطريقة مباشرة او غير مباشرة.

بالنسبة لهذه الدالة فهي تقبل وسيط ثاني عبارة عن مؤشر على مؤشر لتفادي تمرير برامتر خاطئ (في نظري):

لو كان الوسيط الثاني عبارة عن char* endp عوض char** endp

فيمكننا كتابة :


double d = strtod (str,"faut paramètre!");

وهذا سيؤدي الى خطأ في التنفيذ.

0

شارك هذا الرد


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

أشكرك على المساعدة و لكن يبدو أنني طرحت السؤال غلطا ! :blush:

ما أريده هو دالة تحول متغير double إلى string :)

بانتظار الأبطال :wink:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
ما أريده هو دالة تحول متغير double إلى string :)

إستخدم التى كتبها الأخ خالد بالمشاركه رقم 7 فهى تحول أى نوع من الأنواع الإفتراضيه باللغه إلى نص.


template <typename T>
string toStr(const T& value)
{
ostringstream convertor;
convertor << value;
return convertor.str();
}

و الله ولي التوفيق

0

شارك هذا الرد


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

إستخدم التى كتبها الأخ خالد بالمشاركه رقم 7 فهى تحول أى نوع من الأنواع الإفتراضيه باللغه إلى نص.

يا جماعة .. بالله عليكم !, أنا لم أدرس القوالب بعد ! خاطبوني حسب مستواي البرمجي لكي أفهم ما تكتبونه ! :blush:

بالإنتظار ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
يا جماعة .. بالله عليكم !, أنا لم أدرس القوالب بعد ! خاطبوني حسب مستواي البرمجي لكي أفهم ما تكتبونه ! :blush:

هل معنى انك لم تدرس القوالب انك لا تستطيع فهم الكود المكتوب! يمكنك تحويل الكود السابق بكل سهوله ليستخدم double كالتالى:


string toStr(double value)
{
ostringstream convertor;
convertor << value;
return convertor.str();
}

و الله ولي التوفيق

0

شارك هذا الرد


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

هل معنى انك لم تدرس القوالب انك لا تستطيع فهم الكود المكتوب !

لا أريد التعامل مع كود لا أفقه أصله و فصله ! :blush:

ألا توجد طرق أبسط .. لا نحتاج فيها إلى القوالب !؟

0

شارك هذا الرد


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

لا أريد التعامل مع كود لا أفقه أصله و فصله ! :blush:

ألا توجد طرق أبسط .. لا نحتاج فيها إلى القوالب !؟

overloading! تقوم بكتابة دالة لكل نوع.

0

شارك هذا الرد


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

overloading! تقوم بكتابة دالة لكل نوع.

أنا أريد كتابة دالة واحدة تحول double إلى string فقط,. هل هذا ممكن !؟

0

شارك هذا الرد


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

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

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