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

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

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

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

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

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

    تمرين اليوم هام جدا
    الدوال تنتج القيم
    المصفوفات تحفظ القيم فى جداول
    احيانا تتكرر القيم
    و احيانا لا نرغب الا فى تسجيل القيم الفريدة (غير المتكررة فقط)
    غالبا ما يلجأ المبرمج لإنشاء المصفوفة ثم يحاول مسح القيم المتكررة
    و هنا اهدار لطاقة المعالجة و الحوسبة و التى قد تبطئ البرنامج بشكل ملحوظ
    من هنا جاءت فكرة التمرين

    التمرين
    لدينا نرد لعبة الطاولة (الزهر) و هو له 6 أوجه
    و عند القاؤه فإنه يعطى لنا احتمال من 6

    المطلوب
    كتابة برنامج
    يرمى زهر (نرد) الطاولة اى يؤلف رقم عشوائى من 1 الى 6
    و لستة مرات فقط
    يقوم البرنامج بتسجيل القيم الغير متكررة الناتجة من هذه العملية فى مصفوفة ثم يعرضها فى ليست
    ثم يعرض البرنامج رسالة تبين طول المصفوفة

    توضيح
    نفترض ان النرد اعطى هذه القيم من الستة رميات
    1 و 2 و 2 و 5 و5 و 5
    المفروض ان يسجل البرنامج القيم التالية
    1 و 2 و 5 فقط لأن الباقى مكرر
    هنا يكون طول المصفوفة 3 عناصر فقط

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

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

    عدم انشاء سوى مصفوفة واحدة فقط فى كل البرنامج (غير مسموح بإنشاء مصفوفات وسيطة)

    عدم اقحام الليستبوكس فى اى عملية عدا اظهار العناصر فقط
    (يحظر استخدام الدالة ListBox.FindItem فى التمرين)

    اتمنى ان تستمتعوا بالتمرين
    بالمرفقات مشروع خالى من الأكواد و به ليست بوكس و زر
    حظ موفق

    الملفات المرفقة
    التعديل الأخير تم بواسطة المـهاجر; الساعة 21-01-2017, 03:54 PM.

  • #2
    سؤال جميل و مفيد برجاء عدم كتابة الحل لأطول فترة ممكنة لاتاحة المحاولة
    مشكور

    تعليق


    • #3
      هل يسمح باستعمال الكود الجاهز AE.ListBoxDeleteItemsRepeat(); في الاضافة AE

      تعليق


      • #4
        المشاركة الأصلية بواسطة ربيع مشاهدة المشاركة
        هل يسمح باستعمال الكود الجاهز AE.ListBoxDeleteItemsRepeat(); في الاضافة AE
        أخى الكريم الأستاذ ربيع
        لاحظ
        عدم اقحام الليستبوكس فى اى عملية عدا اظهار العناصر فقط
        (يحظر استخدام الدالة ListBox.FindItem فى التمرين)
        اذا كان غير مسموح بالليست القياسى بالتدخل
        فبالتأكيد غير مسموح بإستخدام اى اضافات من اى نوع

        نريدها عمليات تيبل خالية من اى عناصر داخلية او خارجية
        موفق بإذن الله

        تعليق


        • #5
          موفق بإذن الله ... لك مني أجمل تحية .

          تعليق


          • #6
            جميل جدا
            نحاول حتى نجد حل او شبه حل بارك الله فيكم

            تعليق


            • #7
              بسم الله الرحمن الرحيم
              تمرين رائع ..... وصعب على المبتدئين امثالي
              نحاول لعلي وعسي
              شـكــ وبارك الله فيك ـــرا لك
              لك مني أجمل تحية .

              تعليق


              • #8
                "" عدم إستخدام اى كود لحذف اى قيم من المصفوفة "" ألا ترى أنه شرط موجه نحو كود بعينــــه
                في تقديري هذا الشرط ( يأتي كتهذيب لأي محاولة فيما بعد )
                على كل عني سأكتب كأول محاولة
                كود PHP:
                = { 1,1,2,1,1,3,3,}
                table.sort(t, function(a,b) return a<b end)
                for 
                d,p in pairs (t)  do
                repeat
                if [p] == t[p+1then
                Table
                .Remove(tt[p]);
                end
                until t 
                [p] ~= t[p+1]
                end
                -----------------------
                result Dialog.Message("Notice"#t); 
                يمكنك عرض العناصر و اعتمدت على الترتيب ثم الحذف

                تعليق


                • #9
                  إذا بقى الموضوع مفتوح لفترة أطول سوف أحاول معكم بالطريقة التقليدية عن طريق إستخدام التكرار

                  معذرة فالإنشغال حاليا هو المعوق للمحاولة معكم

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

                  فإذا كان المدخل موجود لا يتم الإدخال فى المصفوفة أما إذا كان المدخل غير موجود وكان العنصر الأخير فى المصفوفة غير مساوى للمدخل سوف يتم التخزين أو الإدخال إلى المصفوفة

                  تعليق


                  • #10
                    المشاركة الأصلية بواسطة ثامر أبو بلقيس مشاهدة المشاركة
                    "" عدم إستخدام اى كود لحذف اى قيم من المصفوفة "" ألا ترى أنه شرط موجه نحو كود بعينــــه
                    في تقديري هذا الشرط ( يأتي كتهذيب لأي محاولة فيما بعد )
                    على كل عني سأكتب كأول محاولة
                    كود PHP:
                    = { 1,1,2,1,1,3,3,}
                    table.sort(t, function(a,b) return a<b end)
                    for 
                    d,p in pairs (t)  do
                    repeat
                    if [p] == t[p+1then
                    Table
                    .Remove(tt[p]);
                    end
                    until t 
                    [p] ~= t[p+1]
                    end
                    -----------------------
                    result Dialog.Message("Notice"#t); 
                    يمكنك عرض العناصر و اعتمدت على الترتيب ثم الحذف
                    كما تفضلت بالذكر تماما
                    فعلا انا اقصد تهذيب أو تقييد للكود
                    لكن ليس لكود محدد
                    بل لأسلوب محدد
                    و هو اسلوب "عدم الادراج ثم الحذف لاحقا"
                    و وضع النرد فى السؤال له معنى هام و هو "العشوائية"
                    لذلك غير مسموح نهائيا بتثبيت عناصر مصفوفة نواتج رمى النرد
                    لأن التمرين يفترض ان يتعامل مع مصفوفة تتغير عناصرها
                    لتناسب عمليات ال Permutation (التباديل أو العشوائية)
                    التى قد تنتج عناصر مكررة بكثافة كبيرة

                    بجميع الاحوال محاولة جميلة جدا
                    ستكون اجمل لو راعت الشروط التى أوضحت الآن اهميتها على الصعيد العملى
                    و ليست أبدا شروط للتصعيب او لحصر الحل
                    التعديل الأخير تم بواسطة المـهاجر; الساعة 21-01-2017, 10:28 AM.

                    تعليق


                    • #11
                      شكرا للمرور زملائى الأساتذة فرح و ياسر و المحترف و عبود
                      و التمرين يظل مفتوح لفترة كافية
                      و لا بأس من الانتظار فالفائدة المرتقبة ثمينة بإذن الله


                      تعليق


                      • #12
                        كود PHP:
                        my_table = {};-----  الاعلان عن  المصفوفة شاغرة 
                        result
                        ="" ----  حاوية  تجميع  الأريقام العشوائية  كرقم واحد
                        for 1,do  ----   دالة  تفيد  تكرار للدالة العشوائية
                        result 
                        =result.. Math.Random(16) ---  كلما  ظهر رقم عشوائي من  الستة  يخزن  كرقم عادي متجانب
                        end
                        tmer
                        =result   ---  ذلك  الرقم  خزنته في متعير  جديد  لاجراء هليه عملبات
                        for 1String.Length(result) do  ---  
                        =String.Mid(result,m1)  ---  عند  دورة  للدالة  الجديدة  سألتقط  الرقم الاول 
                        String.Find(tmer""..x1false);---  وابحث  عنخ وفق المتعير الجديد
                        if ~= -1 then   ---  اذ كانت  النتيجة للبحث  أقل من -1
                        Table
                        .Insert(my_table1,);  ---  يكتب  العنصر في  المصفوفة
                        yy 
                        Table.Concat(my_table";"1,TABLE_ALL);
                        tmer String.Replace(tmer""..x""false); ---  ويحذف  كل  العناصر المشابهة  لما خزن
                        end
                        end
                        Dialog
                        .Message("Length ="..Table.Count(my_table),yy);   ---   طول  المصفوفة في الاعلى  و عناصرها  في الحوار 

                        تعليق


                        • #13
                          http://sites.ienajah.com/vb2/images/editor/php.gif

                          المشاركة الأصلية بواسطة ثامر أبو بلقيس مشاهدة المشاركة
                          كود PHP:
                          my_table = {};-----  الاعلان عن  المصفوفة شاغرة 
                          result
                          ="" ----  حاوية  تجميع  الأريقام العشوائية  كرقم واحد
                          for 1,do  ----   دالة  تفيد  تكرار للدالة العشوائية
                          result 
                          =result.. Math.random(16) ---  كلما  ظهر رقم عشوائي من  الستة  يخزن  كرقم عادي متجانب
                          end
                          tmer
                          =result   ---  ذلك  الرقم  خزنته في متعير  جديد  لاجراء هليه عملبات
                          for 1string.length(result) do  ---  
                          =string.mid(result,m1)  ---  عند  دورة  للدالة  الجديدة  سألتقط  الرقم الاول 
                          string.find(tmer""..x1false);---  وابحث  عنخ وفق المتعير الجديد
                          if ~= -1 then   ---  اذ كانت  النتيجة للبحث  أقل من -1
                          table
                          .insert(my_table1,);  ---  يكتب  العنصر في  المصفوفة
                          yy 
                          table.concat(my_table";"1,table_all);
                          tmer string.replace(tmer""..x""false); ---  ويحذف  كل  العناصر المشابهة  لما خزن
                          end
                          end
                          dialog
                          .message("length ="..table.count(my_table),yy);   ---   طول  المصفوفة في الاعلى  و عناصرها  في الحوار 
                          أخى الكريم
                          شكرا للمرة الثانية لمحاولتك
                          الحل فعلا يعطى النتائج المرجوة
                          لكن لاحظ
                          انت اعتمدت على التعامل مع المصفوفة كأنها سترنج
                          لكن أتعلم ما هى ضريبة ذلك ؟؟؟
                          الثمن باهظ جدا و هو التضحية بسرعة التنفيذ
                          طبق الكود الخاص بك بعد رفع الحد من 6 إلى 100000 "مائة ألف"
                          سيستغرق الكود أكثر من 11 ثانية للتنفيذ
                          بنهاية التمرين سترى أن التنفيذ لا يفترض ان يستغرق أكثر من ربع ثانية فى نفس الظروف

                          يمكنك التأكد بنفسك بتطبيق الكود خاصتك
                          بعد ان قمت برفع الحد ل 100000 و كذلك أضفت دالة اظهار الوقت بغرض التوضيح فقط
                          كود PHP:
                          my_table = {};
                          result="" 
                          for 1,100000 do
                          result =result.. Math.Random(16
                          end
                          time1 
                          os.clock()
                          tmer=result  
                          for 1String.Length(result) do 
                          =String.Mid(result,m1
                          String.Find(tmer""..x1false);
                          if 
                          ~= -1 then 
                          Table
                          .Insert(my_table1,); 
                          yy Table.Concat(my_table";"1,TABLE_ALL);
                          tmer String.Replace(tmer""..x""false);
                          end
                          end
                          time2 
                          os.clock()
                          TotalTime time2 time1
                          Dialog
                          .Message("Length ="..Table.Count(my_table), yy.."     time  =  "..TotalTime); 
                          شكرا جزيلا لمشاركتك
                          و ننتظر الحل المرتكز على المصفوفات

                          تعليق


                          • #14
                            السلام عليكم ورحمة الله وبركاته
                            محاولة عديمي الخبرة
                            كود:
                            maTable = {
                                  a = 1,
                                  b = 2,
                                  c = 3,
                                  d = 4,
                                  e = 5,
                                  f = 6,
                                  }
                                maMetaTable = {}
                                function maMetaTable.__index(la_table, la_key)
                                  print(la_table, la_key)
                                  return 666
                                end
                                setmetatable(maTable, maMetaTable)

                            تعليق


                            • #15
                              مرحبا أخى فرح
                              سعدت جدا بمشاركتك
                              واصل المحاولة

                              تعليق

                              مواضيع تهمك

                              تقليص

                              المنتدى: القسم العام نشرت بواسطة: 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