إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

تمرين : ضمان عدم التكرار عند ادخال القيم للمصفوفات

تقليص
هذا الموضوع مغلق.
X
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • #61
    المشاركة الأصلية بواسطة ثامر أبو بلقيس مشاهدة المشاركة
    بينما أنا أجبت عن الذي يجب أن يحدث بعد التنفيذ الصحيح
    شكرا لاجابتك على ما لم اسأل عنه
    و راجع ردى على مشاركة استاذ عبود

    هل تعرف اين الخطأ ؟؟
    الخطأ فى تعامل الديالوج مع المصفوفات بعد اى عملية Concat
    لاحظ ان Unpack هى احدى صور ال Table.Concat لذلك استخدمتها بالمثال

    انت تدافع عن Bug الشركة نفسها لا تنكره
    https://forums.indigorose.com/forum/...de-runs-faster
    و لخلل فى اظهار الكود بموقع الشركة
    التساؤل هناك كان عن كودين
    الكود الأول تم دمج المصفوفة ب "-" و الكود الثانى تم دمج المصفوفة ب " - "
    فهل دافع احد ؟؟

    عموما هذا يخرج تماما عن موضوع التمرين و مناقشة الكود بموضوعية
    فمن غير المنطقى ان نترك الكود و نركز على حالة وحيدة و علامة خاصة
    مع العلم اننى حللت المشكل الخاص بالرسالة بكود اعتقد انه حاسم
    http://sites.ienajah.com/vb2/showpost.p...2&postcount=52
    و طبعا لم اتلقى اى تعليق

    فلا داعى لإضاعة الوقت حول نقطة منتهية تماما بالكود السابق
    موفق

    تعليق


    • #62
      المشاركة الأصلية بواسطة عبود عبود مشاهدة المشاركة
      أما عن الكود الأساسى محور الموضوع والذى وضعته أنت أستاذ "المهاجر" فمن وجهة نظرى تكمن السرعة فى تنفيذة فى إستخدام الفانكشن من البداية
      نعلم جميعا أن الوظيفة تم تنفيذها أولا قبل تنفيذ التكرار ومن ثم فهى أسرعت كثيرا الكود "كود التكرار" نظرا لأن البرنامج نفذ بطبيعة الحال الوظيفة وخاصة أن الوظيفة مجهولة البارامترات ولكن معلومة النتيجة " نتيجة التنفيذ " عند إدخال القيم لها فى التكرار نفسة وعلى ذلك فإن كل ما يتم فى التكرار هو إستبدال مدخلات فقط فى الوظيفة " فهنا تأتى السرعة فى التنفيذ "
      وجهة نظرى التحليلية
      استاذ عبود
      ذكرت لكم مرارا انكم جميعا تستخدمون حلقتين أحدهما زائدة للبحث داخل عناصر المصفوفة
      هل تذكر الكود الذى طرحته لى
      حسنا
      راقب الآن كيف سيعمل نفس الكود بعد ازالة 8 اسطر من اصل 15
      و اجراء بعض التعديلات الخاصة بإزالة التدابير الخاصة بعداد الاندكس الخاص بالمصفوفة
      كود PHP:
      abood = {};
      for 
      i=1,do
         
      result Math.Random(16);
         --if 
      #abood<1 then
            
      --abood[#abood+1]=result ;
           
      --elseif #abood>=1  then 
             
      --for s=1,#abood do
                 
      if abood[result] == nil then            --and s==#abood then
                             
      abood[result]=result 
                   
      --elseif result==abood[sthen
                    
      -- break 
                 --
      end
             
      --end
         end
      end 
      فهمت قصدى ؟؟
      هناك حلقة زائدة لا محالة
      و ليس مجرد فصل عملية الكشف فى فانكشن
      و السرعة تزيد بزيادة أسية (رفع لأس) و ليس بنسبة مئوية
      تحياتى

      تعليق


      • #63
        المشاركة الأصلية بواسطة المـهاجر مشاهدة المشاركة
        المشاركة الأصلية بواسطة عبود عبود مشاهدة المشاركة
        كلام سليم 100% لذلك التعامل الصحيح من البداية ومعرفة كيفية إستخدام أى دالة وطريقة تعاملها مع البارامترات الخاصة بها يمنع وقوع الأخطاء
        اكواد المشاركة 51 تلتزم بقواعد الأوتوبلاى
        هنا Bug
        لا يفترض بدالة المسج توزيع عناصر مصفوفة البارامتر الثانى على باقى البارامترات من تلقاء نفسها
        هذا ما علقت علية بأنه صحيح وتمام وقدمت له بعض التوضيح بخصوص دالة unpack فى هذا الموضوع http://sites.ienajah.com/vb2/showthread.php?t=27661

        ومن الطبيعى جدا ألا تقوم دالة المسج بتوزيع عناصر unpack وأساسا إستخدمها المبرمج فى البارامتر الأول أو الثانى فى المسج " غير منطقى من يظن أن المسج سيقوم بالتوزيع "

        كلامك سليم 100%



        المشاركة الأصلية بواسطة المـهاجر مشاهدة المشاركة
        استاذ عبود
        ذكرت لكم مرارا انكم جميعا تستخدمون حلقتين أحدهما زائدة للبحث داخل عناصر المصفوفة
        هل تذكر الكود الذى طرحته لى
        حسنا
        راقب الآن كيف سيعمل نفس الكود بعد ازالة 8 اسطر من اصل 15
        و اجراء بعض التعديلات الخاصة بإزالة التدابير الخاصة بعداد الاندكس الخاص بالمصفوفة
        كود PHP:
        abood = {};
        for 
        i=1,do
           
        result Math.Random(16);
           --if 
        #abood<1 then
              
        --abood[#abood+1]=result ;
             
        --elseif #abood>=1  then 
               
        --for s=1,#abood do
                   
        if abood[result] == nil then            --and s==#abood then
                               
        abood[result]=result 
                     
        --elseif result==abood[sthen
                      
        -- break 
                   --
        end
               
        --end
           end
        end 
        فهمت قصدى ؟؟
        هناك حلقة زائدة لا محالة
        و ليس مجرد فصل عملية الكشف فى فانكشن
        و السرعة تزيد بزيادة أسية (رفع لأس) و ليس بنسبة مئوية
        تحياتى
        فهمتك جيدا ولكن أنت هنا سوف تدخل فى المصفوفة على سبيل المثال الرقم الذى تم توليدة فى أول دورة للتكرار هو 6
        المصفوفة فارغة تذكر جيدا ...... إذن سوف تخاطب بالشرط إف " abood[result] == nil " .... إذا لم يجد العنصر السادس فى المصفوفة الفارغة أصلا حتى الآن يقوم بإدخال هذا العنصر ؟

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


        تعليق


        • #64
          المشاركة الأصلية بواسطة عبود عبود مشاهدة المشاركة
          فهمتك جيدا ولكن أنت هنا سوف تدخل فى المصفوفة على سبيل المثال الرقم الذى تم توليدة فى أول دورة للتكرار هو 6
          المصفوفة فارغة تذكر جيدا ...... إذن سوف تخاطب بالشرط إف " abood[result] == nil " .... إذا لم يجد العنصر السادس فى المصفوفة الفارغة أصلا حتى الآن يقوم بإدخال هذا العنصر ؟

          منطق غريب جدا ...... تذكر أنى أكتب الرد على سبيل المناقشة وليس إلا
          اعلم تماما انك تناقش للافادة و الاستفادة
          لذلك سأطلعك و اطلع الجميع على سر نجاح الدالة رغم غرابة و عدم منطقية الكود
          التشريح
          الآن سنقوم بتشريح الدالة و نعرف ماذا وضعت من قيم بداخل الاندكس و العنصر
          كود PHP:
          if  TableName[Element]== nil then 
            TableName
          [Element] =  Element 
          ما قيمة الاندكس ؟؟ Element
          ما قيمة العنصر ؟؟ Element
          أليسا هما نفس المتغير و نفس القيمة ؟؟
          إذن وجود القيمة 6 = وجود العنصر السادس (وجهان لنفس العملة)

          سأرد الأن على سؤالك
          لنفترض اننا فى الدورة الأولى من حلقة توليد العشوائى و التى انتجت القيمة 6
          لنقم بالتعويض ب 6
          كود PHP:
          if  TableName[6]== nil then 
            TableName
          [6] =  
          الاندكس 6 قطعا يساوى nil لأن المصفوفة خالية
          أصبح شرط if محقق
          سيتم زرع القيمة 6 بداخل الاندكس 6
          قيس على ذلك باقى الدورات
          مثال
          لنفرض ان نواتج مصفوفة رمى النرد مثلا 6 و 5 و 6 و 1 و 1 و 1
          سيتم زرع القيمة 6 بداخل الاندكس 6
          سيتم زرع القيمة 5 بداخل الاندكس 5
          سيتم تجاهل القيمة 6 لأنها لن تعطى nil مع شرط if
          سيتم زرع القيمة 1 بداخل الاندكس 1
          سيتم تجاهل القيمة 1 لأنها لن تعطى nil مع شرط if
          سيتم تجاهل القيمة 1 لأنها لن تعطى nil مع شرط if

          لدينا ثلاثة اندكسات فقط 1 و 5 و 6
          و يحملون عناصر لها نفس قيمة الاندكس
          هكذا يكون عدد عناصر المصفوفة = 3 عناصر

          من داخل الكواليس
          معلومة 1 : الاستعلام عن قيمة عنصر يتطلب حلقة (نريد الهروب من ذلك)
          معلومة 2 : الاستعلام عن وجود اندكس يتطلب الشرط if فقط و لا يتطلب حلقة ( جميل جدا جدا)
          توظيف المعلومتين لحل المشكلة : قمت بجعل قيمة العنصر = نفس قيمة الاندكس
          ببساطة خدعنا المصفوفة و جعلنا الاندكس = العنصر و ذلك لإخضاعها للبحث بلا حلقة
          مسكينة جدا هذه المصفوفة الضحية .... اوهمناها اننا نبحث عن الاندكس بينما نتيجة البحث ستشير الى وجود او عدم وجود العنصر
          يحق لها طلب تعويض و التعويض جاهز و هو دالة Reindex لإعادة الاندكس لترقيم مسلسل بدون فراغات
          ( عدم تسلسل اندكس المصفوفة أزعج دالة الكونكيت و أظهرت Bug المسج .. لابد من Reindex )

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

          لأننى ببساطة سأبحث عن الاندكس ب if و بدون حلقات و نظرا لأن الاندكس = العنصر فإن البحث عن الاندكس يعادل تماما البحث عن العنصر مع فارق الزمن بين التقنيتين

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

          وهكذا فدائما ما يؤدى النقاش الهادئ الى الفائدة خصوصا لو خلت الأسئلة من اى غرض عدا النقاش المثمر
          أتمنى ان تكونوا قد استمتعتم بالشرح
          موفقين جميعا



          التعديل الأخير تم بواسطة المـهاجر; الساعة 16-02-2017, 08:07 PM. سبب آخر: التوضيح

          تعليق


          • #65
            سأرد عليك مرة أخرى إن شاء الله حوالى الساعة 10 أو 11 بتوقيت القاهرة "مصر"

            تعليق


            • #66
              المشاركة الأصلية بواسطة المـهاجر مشاهدة المشاركة
              لذلك ذكرت سابقا


              و اعلم تماما انك تناقش للافادة و الاستفادة
              لذلك سأطلعك و اطلع الجميع على سر نجاح الدالة رغم غرابة و عدم منطقية الكود
              التشريح
              الآن سنقوم بتشريح الدالة و نعرف ماذا وضعت من قيم بداخل الاندكس و العنصر
              كود PHP:
              if  TableName[Element]== nil then 
                TableName
              [Element] =  Element 
              ما قيمة الاندكس ؟؟ Element
              ما قيمة العنصر ؟؟ Element
              أليسا هما نفس المتغير و نفس القيمة ؟؟
              إذن وجود القيمة 6 = وجود العنصر السادس (وجهان لنفس العملة)

              سأرد الأن على سؤالك
              لنفترض اننا فى الدورة الأولى من حلقة توليد العشوائى و التى انتجت القيمة 6
              لنقم بالتعويض ب 6
              كود PHP:
              if  TableName[6]== nil then 
                TableName
              [6] =  
              الاندكس 6 قطعا يساوى nil لأن المصفوفة خالية
              أصبح شرط if محقق
              سيتم زرع القيمة 6 بداخل الاندكس 6
              قيس على ذلك باقى الدورات
              هل إتضحت ؟؟
              مرة ثانية بالتصوير البطيئ
              معلومة 1 : الاستعلام عن قيمة عنصر يتطلب حلقة (نريد الهروب من ذلك)
              معلومة 2 : الاستعلام عن وجود اندكس يتطلب الشرط if و لا يتطلب حلقة ( جميل جدا جدا)
              توظيف المعلومتين لحل المشكلة : قمت بجعل قيمة العنصر = نفس قيمة الاندكس
              ببساطة خدعنا المصفوفة و جعلنا الاندكس = العنصر و ذلك لإخضاعها للبحث بلا حلقة
              مسكينة جدا هذه المصفوفة الضحية .... اوهمناها اننا نبحث عن الاندكس بينما النتيجة ستشير الى وجود او عدم وجود العنصر
              يحق لها طلب تعويض و التعويض جاهز و هو دالة Reindex لإعادة الاندكس لشكل مسلسل لطبيعى

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

              لأننى ببساطة سأبحث عن الاندكس ب if و بدون حلقات و نظرا لأن الاندكس = العنصر فإن البحث عن الاندكس يعادل تماما البحث عن العنصر مع فارق الزمن بين التقنيتين

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

              وهكذا فدائما ما يؤدى النقاش الهادئ الى الفائدة خصوصا لو خلت الأسئلة من اى غرض عدا النقاش المثمر
              أتمنى ان تكونوا قد استمتعتم بالشرح
              موفقين جميعا



              شرح قيم جدا بارك الله فيك وفي علمك

              تعليق


              • #67
                المشاركة الأصلية بواسطة فرح صالحي مشاهدة المشاركة
                شرح قيم جدا بارك الله فيك وفي علمك
                شكرا استاذ فرح
                موفق

                تعليق


                • #68
                  جميل جدا الحل المقدم منك ولكن إذا إستعلمنا عن عدد عناصر المصفوفة سوف نجدها 0 نظرا لإحتوائها على أماكن فارغة لم يتم ملئها بالعناصر نظرا للإدخال العشوائى لها " حل غير تقليدى ولكن جميل "

                  إستفسار : وهل يوجد له أى مشاكل مع التكرار الكبير أو الكبير جدا ؟ لا أعلم حيث القدرة المحدودة لللاب توب بتاعى فلم أجرب


                  كما أنك فى هذة الحالة لابد من إستعمال دالة التكرار بإستخدم for in pairs

                  كود:
                  --
                  for a,z in pairs(MyTable) do
                  ListBox.AddItem("ListBox1", z, "");
                  end
                  ولا يمكن بإستعمال دالة التكرار العادية :


                  كود:
                  --
                  for i=1, #MyTable do
                  ListBox.AddItem("ListBox1", MyTable[i], "");
                  end
                  التعديل الأخير تم بواسطة عبود عبود; الساعة 17-02-2017, 11:52 PM.

                  تعليق


                  • #69
                    المشاركة الأصلية بواسطة عبود عبود مشاهدة المشاركة
                    جميل جدا الحل المقدم منك ولكن إذا إستعلمنا عن عدد عناصر المصفوفة سوف نجدها 0 نظرا لإحتوائها على أماكن فارغة لم يتم ملئها بالعناصر نظرا للإدخال العشوائى لها " حل غير تقليدى ولكن جميل "
                    بداية لا توجد اى اماكن فارغة فى المصفوفة
                    فقط أندكسات العناصر غير مرتبة
                    مثلا تجد الاندكسات 6 و 5 و 1 كما فى المثال السابق متصلة بلا اى فراغات و لكنها غير مرتبة
                    ستكون هناك قفزات للاندكس لكن لا توجد فراغات حقيقية

                    المشاركة الأصلية بواسطة عبود عبود مشاهدة المشاركة
                    كما أنك فى هذة الحالة لابد من إستعمال دالة التكرار بإستخدم for in pairs
                    من قال ذلك ؟؟ يمكنك استخدام اى تكرار

                    فقط قم بعد المصفوفة بالدالة القياسية Table.Count و ليس بالعلامة #
                    و ستعرف ان حجم المصفوفة لا يكون صفر ابدا
                    و يمكنك عندها استخدام تكرار for بكل سهولة
                    (سيكون عليك وضع شرط للتأكد من عدم وجود nil )

                    الدالة لا تفرق بين المصفوفات الكبيرة و الصغيرة
                    ما يسرى على هذا يسرى على ذاك

                    تعليق


                    • #70
                      المشاركة الأصلية بواسطة المـهاجر مشاهدة المشاركة

                      من قال ذلك ؟؟ يمكنك استخدام اى تكرار

                      فقط قم بعد المصفوفة بالدالة القياسية Table.Count و ليس بالعلامة #
                      و ستعرف ان حجم المصفوفة لا يكون صفر ابدا
                      و يمكنك عندها استخدام تكرار for بكل سهولة
                      بالنسبة للنقطة دى لماذا Table.Count ولا تعطى نتيجة صحيحة مع # أريد أن أستفيد من علمك بهذا الشيئ ما هو الفرق بينهما

                      ونقطة أخرى : أليس من المفترض فى التكرار for a,z in pairs(MyTable) do أن a تعبر عن المفتاح أو رقم الإندكس للعنصر أو ترتيبة فى المصفوفة ؟ لماذا يعطى قيمة " ما هو مخزن فى الإندكس " هو الآخر مثل z تماما فسر لى هذا أيضا

                      كود:
                      --
                      for a,z in pairs(MyTable) do
                      ListBox.AddItem("ListBox1", a, "");
                      end

                      أثقلت عليك كثيرا

                      تعليق


                      • #71
                        المشاركة الأصلية بواسطة عبود عبود مشاهدة المشاركة
                        بالنسبة للنقطة دى لماذا Table.Count ولا تعطى نتيجة صحيحة مع # أريد أن أستفيد من علمك بهذا الشيئ ما هو الفرق بينهما

                        ونقطة أخرى : أليس من المفترض فى التكرار for a,z in pairs(MyTable) do أن a تعبر عن المفتاح أو رقم الإندكس للعنصر أو ترتيبة فى المصفوفة ؟ لماذا يعطى قيمة " ما هو مخزن فى الإندكس " هو الآخر مثل z تماما فسر لى هذا أيضا

                        كود:
                        --
                        for a,z in pairs(MyTable) do
                        ListBox.AddItem("ListBox1", a, "");
                        end

                        أثقلت عليك كثيرا
                        تتشابة a و z عمدا بسبب الشرح المطول فى المشاركة 64
                        هذا مقصود و هو جوهر و فكرة التمرين (تساوى المحتوى مع المفتاح)

                        سأسهل عليك الأمر
                        المصفوفة عبارة عن مجموعة من الصناديق المغلقة عليها ترقيم
                        a هى ترقيم الصندوق
                        z هى محتويات الصندوق
                        للبحث عن محتوى معين (z) فلابد من فتح كافة الصناديق و قراءة القيم z من داخل الصناديق

                        الدالة الخاصة التى شرحتها فى المشاركة 64 تقوم بتوحيد a و z اى انها توحد المحتوى مع الترقيم
                        اصبح مجرد رؤية الصندوق من الخارج كافيا لمعرفة محتوياته من الداخل. دون الحاجة لفتح كافة الصناديق
                        لأننا وحدنا الترقيم مع المحتوى (انتهاك لقانون المصفوفات)

                        الكود ينتهك بعض القوانين الأساسية الخاصة بالمصفوفات القياسية
                        فللحصول على سرعات تفوق طاقة المحرك فلابد من اجراء بعض التعديلات فى طريقة حقن الوقود نفسها
                        و لا بأس من كسر بعض القوانين طالما نستطيع معالجتها لاحقا

                        يتسبب الانتهاك بتوقف بعض دوال اللوا عن فهم المصفوفة
                        لأن تلك الدوال لا تتوقع مثلا مصفوفة من 5 عناصر فقط و يكون ترقيم العنصر الأول فيها 14 و ترقيم العنصر الأخير 2 مثلا
                        هذا يفوق ادراك دوال اللوا القياسية و يجعلها عاجزة عن التصرف
                        ينطبق ذلك على العلامة # لأنها لا تقوم فعليا بعد المصفوفة و لا ينطبق ذلك على دالة كونكيت الأوتوبلاى التى تقوم فعليا بالعدد
                        The # operator doesn't count all the items in the table (!). Instead it finds the last integer (non-fractional number) key
                        الترجمة : لا تقوم العلامة # باحصاء عدد المصفوفة و بدلا من ذلك تقوم بإيجاد أخر مفتاح له قيمة عدد صحيح
                        المصدر
                        http://lua-users.org/wiki/TablesTutorial

                        لذلك فنصيحتى هى اعادة ترقيم الاندكس للخروج من تلك الدوامة (الكود فى المشاركة 52 التى اغفلت تماما)
                        http://sites.ienajah.com/vb2/showpost.p...2&postcount=52
                        عند عمل Reindex يتم معالجة الانتهاك السابق و ترجع المصفوفة للشكل القانونى و كأن المخالفة لم تحدث
                        و يرجع الترقيم الى صيغة الترقيم التصاعدى الطبيعى 1 2 3 4 التى يفهمها محرك اللوا و يتعامل معها بسلاسة

                        ملحوظة
                        لم افهم لماذا تستعلم عن هذا الكود
                        كود:
                        --
                        for a,z in pairs(MyTable) do
                        ListBox.AddItem("ListBox1", a, "");
                        end
                        موفق
                        التعديل الأخير تم بواسطة المـهاجر; الساعة 18-02-2017, 10:15 PM.

                        تعليق


                        • #72
                          شكرا للإفادة

                          تعليق

                          مواضيع تهمك

                          تقليص

                          المنتدى: القسم العام نشرت بواسطة: Reem2Rabeh الوقت: 04-23-2025 الساعة 04:27 PM
                          المنتدى: ضبط وتوكيد الجودة نشرت بواسطة: HeaD Master الوقت: 04-15-2025 الساعة 09:30 AM
                          المنتدى: التصنيع والانتاج نشرت بواسطة: HeaD Master الوقت: 04-11-2025 الساعة 01:08 PM
                          المنتدى: القسم العام نشرت بواسطة: نوال الخطيب الوقت: 03-19-2025 الساعة 03:07 AM
                          المنتدى: الكمبيوتر والإنترنت نشرت بواسطة: عوض السوداني الوقت: 03-18-2025 الساعة 07:22 AM
                          يعمل...
                          X