• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

Khaled Alshaya

المشرفون
  • عدد المشاركات

    2,052
  • تاريخ الانضمام

  • تاريخ اخر زياره

مشاركه بواسطة Khaled Alshaya


  1. يمكنك استخدام مكتبة Boost.Rational للقيام بهذا الأمر:

    #include <iostream>
    #include <boost/rational.hpp>
    using namespace std;
    using namespace boost;

    int main()
    {
    typedef boost::rational<long> fraction_t;

    // f1 = 1/10, f2 = 2/3;
    fraction_t f1(1, 10), f2(2, 3), f3;
    std::cin >> f3; // enter 1/5
    std::cout << f1*f2*f3; // 1/75
    }

    تحياتي...

    2

  2. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    0

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

    هناک خطأ فی Windows Calculator.

    هذا ليس خطأ في الحاسبة التي تأتي مع Windows بقدر ماهو trade-off في التصميم نفسه.

    حسب اعتقادي, فإن الحاسبة الموجودة في Windows و الحاسبة الموجودة في Ubuntu يستخدمان الـ Floating Point Types مثل double. كما تعلم فإن جذر الإثنين عدد حقيقي و ليس نسبياً, و لا يمكن تمثيله أصلاً باستخدام عدد منته من الخانات. بالتالي, فإن قيمة الجذر عبارة عن قيمة تقريبية. الفرق بين البرنامجين, أن الحاسبة في Windows لا تقوم بتقريب الناتج النهائي, بينما الحاسبة في Ubuntu تقوم بتقريب الناتج النهائي. هذا كل ما في الأمر.

    ملاحظة, الحاسبة الموجودة في Windows تقوم بالتقريب في حالة أعداد أصغر بكثير, مثل لو قمت بحساب جذر الإثنين لوحده. صحيح أن الناتج النهائي عبارة عن قيمة تقريبية و لكنها قريبة جداً من القيمة الحقيقية للإثنين و بالتالي يحصل التقريب.

    كما ذكرت سابقاً, هذا ليس خطأ و إنما قرار اتخذه كل مبرمج حول الدقة التي يتم التقريب عندها.

    تحياتي...

    3

  4. (ملاحظة منذ البداية, لست رياضياً و لكن الاساتذة يمكن أن يصححوا لنا).

    معنى المعاملات يختلف بحسب السياق. و لكن إذا أردت الكلام على مستوى العلاقات Relations بين الفئات Sets فإن العلاقة التي تكون Reflexive و Symmetric و Transitive فإنها تعرف على أنها علاقة تكافؤ. لنفترض أن لدينا Relation اسمها R. العلاقة R بكل بساطة مبنية على فئة S. الفئة S بها عناصر, و العلاقة R تقوم بالربط بين تلك العناصر مثل التالي:

    S = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    R = {(0, 5), (1, 6), (2, 7), (3, 8), (4, 9), (5, 0), (6, 1), (7, 2), (8, 3), (9, 4)}

    العلاقة بكل بساطة, هي الحالة العامة للدوال. أي أن الدوال عبارة عن حالات خاصة من العلاقات. نأتي للجزء الأول, العلاقة تكون Reflexive عندما:

    (x, x) is in R, for each x in S

    قد تكون العلاقة Irrflexive و هذا يعني أن:

    (x, x) is NOT in R, for each x in S

    بالنسبة للمثال الذي طرحناه في الأعلى, فإن R عبارة Irreflexive Relation. بالتالي R ليست علاقة تكافؤ. بالنسبة للـ Symmetry فتعني:

    if (x, y) is in R, then (y, x) is in R too

    العلاقة R عبارة عن Symmetric Relation. أما الخاصية الأخيرة, و هي كالتالي:

    if (x, y) is in R and (y, z) is in R, then (x, z) is in R

    بالنسبة لـ R فهي Transitive. في النهاية المثال المطروح حول العلاقة R لا يمثل علاقة تكافؤ, لأن R ليست Reflexive. بمعنى آخر, أو بطريقة كتابة أخرى مبسطة بشكل أصح:

    x != x

    هذا الذي أفهمه, أما عن أي معامل فيجب أن يكون معرفاً على مستوى الفئات و العلاقات حتى نحدد ماذا تقصد "بالفرق". ببساطة, لم تعطنا تعريفين للمعاملين.

    عذراً لأساتذتنا لعدم استخدام Latex لأني على عجل :)

    تحياتي,

    3

  5. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    0

  6. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    0

  7. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    1

  8. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    0

  9. :)

    المشكلة يا عزيزي, هي أني لا أقوم بحساب ناتج الـ Arbitrary Precision Number(المكتبة التي نتكلم عنها) من خلال حساب الـ bits. أنا لا أبني معالج, و إنما سأقوم بتقسيم الـ bits إلى digits من base أكبر كـ hex أو 256 أو أكبر. بهذه الطريقة, يمكنك تخيل أن لدي أدوات جاهزة في اللغة للتعامل مع الـ digit فقط و لدي جميع العمليات الحسابية و المنطقية التي أحتاجها, و يبقى على المكتبة بناء arithmetic system لعدد متغير من الـ digits. لذلك, كلما كان الـ digit و الذي في هذه الحالة هو unsigned char أو unsigned long أو واحداً من باقي الأنواع - أكبر و يستطيع استيعاب base أكبر, قمنا بتقليل عدد العمليات اللازمة بشكل كبير. تصور معي العدد ذو 128 bits. لو قمنا بتنفيذ عملية كالضرب عليه, سنقسمه إلى digits لكي نقوم بالعمليات الحسابية. لو كان الـ digit عبارة عن bit فسنحتاج إلى 128*128 عملية في خوارزميات الضرب السهلة. بينما لو قسمنا العدد إلى unsigned long long ستصبح النتيجة على بعد 2*2 عمليات. باختصار, لو أخذنا bits و قسمناها إلى مصفوفة من أكبر نوع, هل سنحتاج إلى padding bits غير مستعملة في النهاية؟ إذا كان كذلك, قم بمحاولة تقسيمه إلى نوع أصغر و هكذا.

    سؤالي هو حول auto ، هل لها بديل في المواصفات الحالية ؟ استخدم الآن VS 2008 .

    للأسف لا أعتقد أنها موجودة. و لكن يمكنك تجربة 2010 فهو جميل جداً بالمناسبة. و به الكثير من مكتبات 0x و تقريباً خمس ميزات في اللغة من ضمنها auto. باختصار, هي تعمل type inference تمام كـ var في #C.

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

    type_factory<64>::type i = 0;

    إضافة إلى ذلك, قم بإزالة السطر الذي يتضمن static_assert. هذه عبارة عن compile-time tool لكي تقوم بإصدار أخطاء "مفهومة" تقوم أنت بكتابتها بنفسك و هي ميزة رائعة جداً للمكتبات.

    لم أفهم كل شيء ، طريقة template specialization أكثر وضوحاً من meta التي و الحمد لله لم أفهم منها شيء إطلاقاً :/ . عندما قرأت في العنوان metaprogramming ، " خلت " أنك تستخدم macro بسيط define# :-) .

    طريقة الـ partial specialization بالفعل أسهل عند النظر لأول مرة. و لكن الـ meta-if أسهل في التفكير و الكتابة عندما تمعن النظر فيها قليلاً. كل ما في الأمر, أن IF ستستقبل condition, فإذا كان صحيحاً ستقوم بإعادة النوع Then. إذا لم يكن صحيحاً ستقوم بإعادة النوع Else :)

    الآن, سنقول لو أن bits يمكن تقسيمها إلى مصفوفة unsigned long long تماماً, سنعيد النوع unsigned long long. إذا لم يكن كذلك, سنقوم بإعادة النوع Else. النوع Else في هذه الحالة هو نوع يتم حسابه من خلال IF أخرى, و التي ستعيد unsigned long في حالة تحقق الشرط, و إذا لم يكن كذلك سنختبر النوع الأصغر في Else و هكذا حتى نصل إلى unsigned char. بالطبع الاختلاف بين المثال الأول و الثاني, هو أن الأول سيصدر خطأ في حالة كون bits لا تقسم تماماً إلى unsigned char array. بينما في meta-if لم أستطع حل هذه المشكلة حتى الآن.

    تحياتي...

    2

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

    يا أخ خالد, الـ iostream أو في حالتنا هذه لديها overloading خاص للنصوص و الحروف مثل:

    char
    const char*
    std::string
    ...

    كل ما يقوم به cout هو النظر إلى العدد المعطى, و رؤية المقصد من وراءه فإذا كان أحد الأنواع السابقة قام بتحويله إلى شكل نصي(encoding كـ ASCII).

    0

  11. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    0

  12. السلام عليكم,

    خلال تطوير uint, صادفت العديد من المشاكل(لاحصر لها :lol:) و لكن إحدى الحلول تضمنت الـ metaprogramming على أصول. القضية, أن المستخدم يقوم بكتابة شيء مشابه للتالي:

    // unsigned integer: 128 bits
    uint<128> number;

    هذه المئة و ثمانية و عشرون bits سوف تخزن في مصفوفة بكل تأكيد, و لكن ماهو نوع هذه المصفوفة؟

    unsigned char
    unsigned short int
    unsigned int
    unsigned long
    unsigned long long

    أضف لذلك, أن المكتبة لاتقبل كسوراً, مثلاً لا يوجد لدي عدد من الـ bits يكون مصفوفة مكونة من ثلاث عناصر "و ربع". باختصار, الحل كان لابد أن يكون من الشكل التالي:

    template <std::size_t size>
    struct type_factory
    {
    typedef typename type_factory_impl<size>::type type;
    };

    int main()
    {
    auto a = type_factory<8>::type(0); // unsigned char
    auto b = type_factory<16>::type(0); // unsigned short int
    auto c = type_factory<24>::type(0); // unsigned char
    auto d = type_factory<32>::type(0); // unsigned long
    auto e = type_factory<40>::type(0); // unsigned char
    auto f = type_factory<48>::type(0); // unsigned short int
    auto g = type_factory<56>::type(0); // unsigned char
    auto h = type_factory<64>::type(0); // unsigned long long
    }

    و الخوارزمية المتبعة في اختيار النوع المناسب:

    if(size % bits<unsigned long long>::value == 0)
    typedef unsigned long long type;
    else if(size % bits<unsigned long>::value == 0)
    typedef unsigned long type;
    else if(size % bits<unsigned int>::value == 0)
    typedef unsigned int type;
    else if(size % bits<unsigned short int>::value == 0)
    typedef unsigned short int type;
    else if(size % bits<unsigned char>::value == 0)
    typedef unsigned char type;
    else
    static_assert(false, "The type should be multiple of 'unsigned char' size");

    الحقيقة كان الحل ممتعاً, و خارجاً عن المألوف. حللت المشكلة بطريقتين: الأولى باستخدام الـ pattern matching أو ما يطلق عليه partial template specialization. فكرت قليلاً, ثم قمت بعمل refactoring لأن الكود و إن كان سهل الفهم نسبياً, إلا أنه طويل. لذلك قمت بكتابة meta if-else و اختصرت الحل :wink:

    بالنسبة للحل الأول:


    #include <cstddef>
    #include <climits>

    typedef unsigned char uchar;
    typedef unsigned short int usint;
    typedef unsigned int uint;
    typedef unsigned long ulong;
    typedef unsigned long long ulonglong;

    // Returns how many bits in Unsigned_Type
    template <typename Unsigned_Type>
    struct bits
    { enum { value = sizeof(Unsigned_Type)*CHAR_BIT }; };

    template <bool is_uchar>
    struct unsigned_char
    {
    typedef unsigned char type;
    static_assert(is_uchar,
    "error: size must be multiple of 'unsigned char' size");
    };
    template <>
    struct unsigned_char <true>
    { typedef uchar type; };

    template <bool is_usint, std::size_t size>
    struct unsigned_short_int
    { typedef typename
    unsigned_char<size % bits<uchar>::value == 0>::type type; };
    template <std::size_t size>
    struct unsigned_short_int <true, size>
    { typedef usint type; };

    template <bool is_uint, std::size_t size>
    struct unsigned_int
    { typedef typename
    unsigned_short_int<size % bits<usint>::value == 0, size>::type type; };
    template <std::size_t size>
    struct unsigned_int <true, size>
    { typedef uint type; };

    template <bool is_ulong, std::size_t size>
    struct unsigned_long
    { typedef typename
    unsigned_int<size % bits<uint>::value == 0, size>::type type; };
    template <std::size_t size>
    struct unsigned_long <true, size>
    { typedef ulong type; };

    template <bool is_ulonglong, std::size_t size>
    struct unsigned_long_long
    { typedef typename
    unsigned_long<size % bits<ulong>::value == 0, size>::type type; };
    template <std::size_t size>
    struct unsigned_long_long <true, size>
    { typedef ulonglong type; };

    template <std::size_t size>
    struct type_factory_impl
    { typedef typename
    unsigned_long_long<size % bits<ulonglong>::value == 0, size>::type type; };

    template <std::size_t size>
    struct type_factory
    {
    typedef typename type_factory_impl<size>::type type;
    };

    int main()
    {
    auto a = type_factory<8>::type(0); // unsigned char
    auto b = type_factory<16>::type(0); // unsigned short int
    auto c = type_factory<24>::type(0); // unsigned char
    auto d = type_factory<32>::type(0); // unsigned long
    auto e = type_factory<40>::type(0); // unsigned char
    auto f = type_factory<48>::type(0); // unsigned short int
    auto g = type_factory<56>::type(0); // unsigned char
    auto h = type_factory<64>::type(0); // unsigned long long
    }

    أما الحل الثاني:


    #include <cstddef>
    #include <climits>

    typedef unsigned char uchar;
    typedef unsigned short int usint;
    typedef unsigned int uint;
    typedef unsigned long ulong;
    typedef unsigned long long ulonglong;

    // Returns how many bits in Unsigned_Type
    template <typename Unsigned_Type>
    struct bits
    { enum { value = sizeof(Unsigned_Type)*CHAR_BIT }; };

    template <bool condition, typename Then, typename Else>
    struct IF
    { typedef Else type; };
    template <typename Then, typename Else>
    struct IF <true, Then, Else>
    { typedef Then type; };

    template <std::size_t size>
    struct type_factory_impl
    {
    typedef typename
    IF<size % bits<ulonglong>::value == 0, ulonglong,
    typename IF<size % bits<ulong>::value == 0, ulong,
    typename IF<size % bits<uint>::value == 0, uint,
    typename IF<size % bits<usint>::value == 0, usint,
    typename IF<size % bits<uchar>::value == 0, uchar, uchar>::type
    >::type
    >::type
    >::type
    >::type type;
    };

    template <std::size_t size>
    struct type_factory
    {
    typedef typename type_factory_impl<size>::type type;
    };

    int main()
    {
    auto a = type_factory<8>::type(0); // unsigned char
    auto b = type_factory<16>::type(0); // unsigned short int
    auto c = type_factory<24>::type(0); // unsigned char
    auto d = type_factory<32>::type(0); // unsigned long
    auto e = type_factory<40>::type(0); // unsigned char
    auto f = type_factory<48>::type(0); // unsigned short int
    auto g = type_factory<56>::type(0); // unsigned char
    auto h = type_factory<64>::type(0); // unsigned long long
    }

    استخدمت static_assert و auto في visual studio 2010. لن أشرح الكود, لأني لا أعرف من أين أبدأ في شرحه. و لكن أرحب بأي سؤال أو مناقشة أو مثال آخر.

    تحياتي...

    4

  13. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    0

  14. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    0

  15. أخ محمد حديثي عن الـ POD أصلاً.

    و لهذا إن كان سيتم وضع padding فالمكان الوحيد المتاح هو بعد اخر Field.

    هذا ليس ما فهمته أنا من الـ standards, و لا ما فهمه صانعو المترجمات:

    http://msdn.microsoft.com/en-us/library/71kf49f1%28VS.80%29.aspx

    http://stackoverflow.com/questions/364483/determining-the-alignment-of-c-c-structures-in-relation-to-its-members/364491#364491

    1

  16. فى الجزء الملون بالأزرق يعطى لنا تلميح بأن المترجم له الحق فى وضع padding كما يريد و لكن ليس فى بداية الكائن، بدمج هذا الجزء مع الأول يمكننا ان نستنتج أن المكان الوحيد المتاح للمترجم ان يقوم بوضع padding به بعد عناصر النوع.

    هذا صحيح, لا يمكن أن يكون هناك padding في أول الكائن. سقطت هذه النقطة في ردي السابق.

    عموماً, سؤال. ماذا تقصد بـ "بعد عناصر النوع"؟ هل تقصد بعد جميع العناصر؟ أم يحق له وضع padding بعد أي بين أي عنصرين و في النهاية؟ :sleep:

    0

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

    هذه هي الطريقة التقليدية في ++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 لأي قيمة سابقة؟ يمكنك بناء ما تريد, قم بكتابة مكتبة تحتفظ بالقيمة و معلومات جميع الدوال التي تم تطبيقها عليها. إضافة إلى ذلك تحتاج إلى جدول يوضح كل دالة و الدالة المعاكسة لها لتقوم بعملية التطبيق لأي عمق تريده!

    تحياتي...

    1

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

    هل يوجد اختلاف بين هذين التركيبن :(اذا كان الجواب نعم قم بيتوضيح هذا الاختلاف)

    نعم هناك اختلاف, لأن ترتيب الـ fields أصلاً مختلف! و يجب عليك كتابة الكود يدوياً إن كنت تريد نقل البيانات من الأول للثاني بشكل صحيح. و المترجم له الحق بوضع padding في أي مكان يحبه! أيضاً, للمعلومية فقط, هناك فرق بين C و ++C في هذه الناحية. تصور أن لدينا التالي:

    struct first
    { int x; int y; };
    struct second
    { int x; int y; };

    هل هذان مختلفان؟ ليست لدي وثائق المقاييس حالياً لتأكيد ما أقول و لكن حسبما أذكر, في ++C هناك اختلاف بين first و second و لكن في C ليس هناك اختلاف. لأن ++C تعتمد على الاسم في تعيين مساواة الأنواع بينما C تعتمد على الـ structure الخاص بالـ struct.

    هل يمكن الوصول لعناصر التركيبين السابقين بدون استعمال المعاملين "." و "->"؟

    لماذا تريد عمل ذلك؟


    #include <cstddef> // for offsetof macro

    struct my_type
    { int x; int y; };

    int main()
    {
    my_type point;
    int *x_ptr, *y_ptr;
    x_ptr = (int*)((char*)&point + offsetof(my_type, x));
    y_ptr = (int*)((char*)&point + offsetof(my_type, y));
    *x_ptr = *y_ptr = 10;
    /*
    point.x == 10;
    point.y == 10;
    */
    }

    0

  19. الأخ الكريم/الأخت الكريمة

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

    مرحباً بكم في منتدى الفريق العربي للبرمجة

    تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين.

    قواعد طرح المشاركات

    http://www.arabteam2000-forum.com/index.php?showtopic=29343

    شاكرين لكم حُسن تعاونكم

    1

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

    بداية, بشكل عام الـ 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