المساعد الشخصي الرقمي

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


المـهاجر
19-01-2017, 06:18 AM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

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

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

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

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

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

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

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

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

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

ربيع
19-01-2017, 01:27 PM
سؤال جميل و مفيد برجاء عدم كتابة الحل لأطول فترة ممكنة لاتاحة المحاولة
مشكور

ربيع
19-01-2017, 01:35 PM
هل يسمح باستعمال الكود الجاهز AE.ListBoxDeleteItemsRepeat(); في الاضافة AE

المـهاجر
19-01-2017, 01:56 PM
هل يسمح باستعمال الكود الجاهز AE.ListBoxDeleteItemsRepeat(); في الاضافة AE

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


اذا كان غير مسموح بالليست القياسى بالتدخل
فبالتأكيد غير مسموح بإستخدام اى اضافات من اى نوع

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

فرح صالحي
19-01-2017, 03:01 PM
موفق بإذن الله .:abc_152:.. لك مني أجمل تحية .

عبد الهادي بهاب
19-01-2017, 06:02 PM
جميل جدا
نحاول حتى نجد حل او شبه حل بارك الله فيكم

ياسرهتهت
19-01-2017, 07:28 PM
بسم الله الرحمن الرحيم
تمرين رائع ..... وصعب على المبتدئين امثالي
نحاول لعلي وعسي:abc_102:
شـكــ وبارك الله فيك ـــرا لك
لك مني أجمل تحية .

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

يمكنك عرض العناصر و اعتمدت على الترتيب ثم الحذف :abc_139:

عبود عبود
20-01-2017, 12:47 PM
إذا بقى الموضوع مفتوح لفترة أطول سوف أحاول معكم بالطريقة التقليدية عن طريق إستخدام التكرار

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

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

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

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

يمكنك عرض العناصر و اعتمدت على الترتيب ثم الحذف :abc_139:

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

بجميع الاحوال محاولة جميلة جدا
ستكون اجمل لو راعت الشروط التى أوضحت الآن اهميتها على الصعيد العملى
و ليست أبدا شروط للتصعيب او لحصر الحل
:abc_022:

المـهاجر
21-01-2017, 09:26 AM
شكرا للمرور زملائى الأساتذة فرح و ياسر و المحترف و عبود
و التمرين يظل مفتوح لفترة كافية
و لا بأس من الانتظار فالفائدة المرتقبة ثمينة بإذن الله
:abc_152::abc_152::abc_152:
:abc_152::abc_152:
:abc_152:

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

المـهاجر
21-01-2017, 01:33 PM
my_table = {};----- الاعلان عن المصفوفة شاغرة
result="" ---- حاوية تجميع الأريقام العشوائية كرقم واحد
for i = 1,6 do ---- دالة تفيد تكرار للدالة العشوائية
result =result.. Math.random(1, 6) --- كلما ظهر رقم عشوائي من الستة يخزن كرقم عادي متجانب
end
tmer=result --- ذلك الرقم خزنته في متعير جديد لاجراء هليه عملبات
for m = 1, string.length(result) do ---
x =string.mid(result,m, 1) --- عند دورة للدالة الجديدة سألتقط الرقم الاول
k = string.find(tmer, ""..x, 1, false);--- وابحث عنخ وفق المتعير الجديد
if k ~= -1 then --- اذ كانت النتيجة للبحث أقل من -1
table.insert(my_table, 1,x ); --- يكتب العنصر في المصفوفة
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 و كذلك أضفت دالة اظهار الوقت بغرض التوضيح فقط
my_table = {};
result=""
for i = 1,100000 do
result =result.. Math.Random(1, 6)
end
time1 = os.clock()
tmer=result
for m = 1, String.Length(result) do
x =String.Mid(result,m, 1)
k = String.Find(tmer, ""..x, 1, false);
if k ~= -1 then
Table.Insert(my_table, 1,x );
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);
شكرا جزيلا لمشاركتك
و ننتظر الحل المرتكز على المصفوفات
:abc_022:

فرح صالحي
21-01-2017, 10:06 PM
السلام عليكم ورحمة الله وبركاته
محاولة عديمي الخبرة
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)

المـهاجر
22-01-2017, 01:23 AM
مرحبا أخى فرح
سعدت جدا بمشاركتك
واصل المحاولة
:abc_152:

ثامر أبو بلقيس
10-02-2017, 10:54 PM
أ
طبق الكود الخاص بك بعد رفع الحد من 6 إلى 100000 "مائة ألف"
سيستغرق الكود أكثر من 11 ثانية للتنفيذ
بنهاية التمرين سترى أن التنفيذ لا يفترض ان يستغرق أكثر من ربع ثانية فى نفس الظروف
:abc_022:

ترى ما الزمن المستغرق لهكذا كود
local function yes(G, X)
for i=1,#G do
if G[i] == X then
return true
end
end
return false
end
local G = {}
for k = 1 ,6 do
X = math.random(1,6);
if not yes(G, X) then
Table.Insert(G, 1,X);
end
end
result = Table.Concat(G, "-", 1, TABLE_ALL);
Dialog.Message("Notice",result);


هي محاولات ... لكن من الجيد أنها كلها أعطت النتائج الصحيحة لكن يبقى الحكم بصحتها أو عدمها
حق مشروع لطارح التساؤل موفقين:abc_138:

المـهاجر
11-02-2017, 03:52 AM
بداية شكرا للمحاولة الجميلة :abc_152:

ترى ما الزمن المستغرق لهكذا كود


لا أعرف
يمكنك تجربة
local function yes(G, X)
for i=1,#G do
if G[i] == X then
return true
end
end
return false
end
local G = {}
t1 = os.clock()
for k = 1 ,500000 do
X = math.random(1,60);
if not yes(G, X) then
Table.Insert(G, 1,X);
end
end
t2 = os.clock()
t3 = t2 - t1
tco = Table.Count(G);
Dialog.Message("Notice",tco.." "..t3);
و لاحظ النتيجة

يمكنك تغيير رقم 60 ب 6000
X = math.random(1,6000);

هل هناك نتيجة ؟

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


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

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

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

واصل و لا تيأس
:abc_152:

ثامر أبو بلقيس
11-02-2017, 08:26 AM
جيد إذن الان مشكل سرعة كود لدوران رفع إلى 500000 :abc_139:
------------
بالوصول إلى هاته المقاربة يمكنك طرح كود الحل
:abc_087: في حال عدم توفر بوادر للحل أو المحاولات المرتقبة :abc_088:
- لأنها ستكون بالنسبة لي مسألة مقارنة بين كفاءة أكواد -
موفق :abc_138:

فرح صالحي
11-02-2017, 12:11 PM
ترى ما الزمن المستغرق لهكذا كود
local function yes(G, X)
for i=1,#G do
if G[i] == X then
return true
end
end
return false
end
local G = {}
for k = 1 ,6 do
X = math.random(1,6);
if not yes(G, X) then
Table.Insert(G, 1,X);
end
end
result = Table.Concat(G, "-", 1, TABLE_ALL);
Dialog.Message("Notice",result);


هي محاولات ... لكن من الجيد أنها كلها أعطت النتائج الصحيحة لكن يبقى الحكم بصحتها أو عدمها
حق مشروع لطارح التساؤل موفقين:abc_138:

استغرق عندي انا 12 ثانية و 12 جزء من الثانية
وهذه مواصفات جهازي
http://e.top4top.net/p_407jr22h1.png

المـهاجر
11-02-2017, 08:51 PM
جيد إذن الان مشكل سرعة كود لدوران رفع إلى 500000 :abc_139:


طبعا لا
التمرين الأصلى يتعامل مع 6 عناصر و ليس 500000 عنصر
لكن كيف سنختبر قوة دالة دون ان نضعها فى ظروف قاسية ؟

تلميح
دالتك تعانى من استهلاك شديد للذاكرة - تحتاج للترشيد


لأنها ستكون بالنسبة لي مسألة مقارنة بين كفاءة أكواد -

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

المـهاجر
11-02-2017, 09:17 PM
استغرق عندي انا 12 ثانية و 12 جزء من الثانية
وهذه مواصفات جهازي
http://e.top4top.net/p_407jr22h1.png

ليست لهذه الدرجة استاذ فرح
استبدل آخر سطرين فى الكود الذى اقتبسته ب
tco = Table.Count(G);
Dialog.Message("Notice",tco);
لأن الأوتوبلاى بها Bug فى إظهار الرسائل المحتوية على تلك العلامة " - "
لاحظ اننى فى الملف المفتوح للتمرين الأصلى تعمدت وضع ليست بوكس لتفادى الاظهار برسالة عموما

المـهاجر
11-02-2017, 11:24 PM
حسنا مضى ثلاثة اسابيع
سأمنحكم تلميح
تحدثت فى مشاركتى قبل السابقة عن موروث خاطئ جدا فى التعامل مع المصفوفات
سأمنحكم فكرة عن هذا الموروث

1- كل الحلول التى طرحت فى هذا الموضوع اعتمدت تكرار بحلقة (خطأ فادح)

2- هذه المشاركة فى موضوع أخر مشابه و سنجد به تكرار مرة اخرى
http://www.abc4web.net/vb/showpost.php?p=308845&postcount=7
لاحظوا جيدا ردى عليها
http://www.abc4web.net/vb/showpost.php?p=308847&postcount=8

3- أيضا هنا

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

للمرة الثالثة التكرار و الحلقة
كل ما سبق يشترك فى نفس الموروث الشائع

التلميح
لن نستخدم التكرار للكشف :abc_088:
:abc_152:

المـهاجر
12-02-2017, 10:48 PM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

موعدنا الآن مع الحل الصحيح للتمرين
بداية كافة الحلول التى طرحت اعتمدت حلقة للكشف

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

طبعا كلامى غير واضح حتى الآن
نأتى للكود
راقب جيدا هذه الفانكشن
-- Mohager Prevent Table Duplicate--
function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end
هل ترون اى تكرار ؟؟
سيرد الغالبية بالنفى
لكن فى واقع الأمر هذا السطر تكرار بحد ذاته
if TableName[Element]== nil then
لا يهمنى ان كنتم لا ترون كلمة for او repeat أو while
لكنها تبقى تكرار حتى دون وجود ملامح الحلقة
هنا الشرط اف سيكرر نفسه و سيراجع كافة عناصر المصفوفة و لا يحتاج لوجود اى حلقة
بل على العكس
فلو احطناه بأي حلقة فسيكون عدد التكرار يساوى عدد عناصر المصفوفة مضروبا فى نفسه
فلو كان عدد العناصر = 10000 عنصر و قمنا بإنشاء حلقة
تكون النتيجة هى الدوران و التكرار 100000000مرة (مائة مليون مرة)

و لكن لو اعتمدنا الحل الصحيح و عدم انشاء اى حلقات خارجية فسيتم الدوران 10000 مرة (عشرة آلاف مرة)
أظن الفرق بين زمن تنفيذ عشرة آلاف و زمن تنفيذ المائة مليون واضح
فما بالك لو بدأنا بمائة ألف ؟؟ .. نصل لعشرة مليارات تكرار
ماذا لو بدأنا بمليون ؟؟ .. نصل لبليون تكرار (مليون مليون تكرار)
و هذا هو سر تباطؤ جميع الحلول

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

الكود كاملا
-- Mohager Prevent Table Duplicate--
function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

MyTable = {}
ListBox.DeleteItem("ListBox1", -1);

for i = 1,6 do
rnd = Math.Random(1, 6);
Add_Unique(MyTable,rnd)
end

for a,z in pairs(MyTable) do
ListBox.AddItem("ListBox1", z, "");
end

و ان اردتم وضع الكود فى ظروف قاسية و معرفة الزمن الذى سيستغرقه يمكنكم تجربة
-- Mohager Prevent Table Duplicate--
function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

MyTable = {}
t1 = os.clock()
for i = 1,50000 do
rnd = Math.Random(1, 10000);
Add_Unique(MyTable,rnd)
end
t2 = os.clock()
t3 = t2 - t1
tco = Table.Count(MyTable);
Dialog.Message("Notice", tco.. " "..t3);

الملف المفتوح الخاص بالحل مرفق
الى اللقاء مع تمرين آخر
:abc_152: :abc_152: :abc_152:
:abc_152: :abc_152:
:abc_152:

فرح صالحي
13-02-2017, 08:49 AM
لم استطع قياس سرعة استجابة الكود
اضغط على الزر فتقع استجابة فورية
شـكــ وبارك الله فيك ـــرا لك :abc_152:... لك مني أجمل تحية .
************************************************** *******
هذا كود الظروف القاسية لا حظ كيف خرج عن السكة ولم يستعمل اليست بوكس
http://a.top4top.net/p_409yp7m91.png
وهذا الكود النهائي لاحظ كيف كان منضبطا واتبع المسار الصحيح
http://b.top4top.net/p_409dp0en1.png

فهل من تفسير اخي المهاجر لهذا الاختلاف
ملاحظة : بالنسبة لسرعة الاستجابة بين الكودين فهي متقاربة جدا جدا ولا تكاد تذكر
:abc_152:

عبود عبود
13-02-2017, 02:14 PM
الإنشغال هو سبب عدم المتابعة آسف جدا جدا ولكن لى تعقيب إن شاء الله على هذا الحل من طرفكم

عذرا على الإنشغال قليلا وعدم صفاء الذهن حاليا

عبود عبود
13-02-2017, 07:42 PM
السلام عليكم ورحمة الله وبركاته

عذرا للتأخير مرة أخرى " بالنسبة للحل من طرفى " يكون كالتالى :

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


الملف المفتوح فى المرفقات

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

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

طبعا تعليقى هو عن إستخدامك هذا الكود بهذا الشكل :

for i = 1,6 do
rnd = Math.Random(1, 6);
Add_Unique(MyTable,rnd)
end


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

المـهاجر
13-02-2017, 11:46 PM
السلام عليكم ورحمة الله وبركاته
مرحبا بمشاركتك و الحل المقدم من طرفك اخى عبود حتى و ان جاء متأخرا و لك العذر فى انشغالك


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

التمرين لم يطلب اظهار اى رسالة للمستخدم و لا نريد ذلك لعدم مقاطعة سير البرنامج للسبب الآتى

لأن التمرين يفترض ان يتعامل مع مصفوفة تتغير عناصرها
لتناسب عمليات ال Permutation (التباديل أو العشوائية)
التى قد تنتج عناصر مكررة بكثافة كبيرة


لاحظ أيضا

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


فى الحل المقدم من طرفكم
يقوم المستخدم برمى الزهر يدويا بالضغط على الزر كل مرة ثم يرد على رسالة
لا يتفق ذلك مع متطلبات التمرين
بل يفترض ان تتم العملية آليا
يمكنك تعديل ملفك المفتوح ليتلائم مع فكرة التمرين و ابراز وجهة نظرك

و أعدك بالرد على كافة النقاط التى أثرتها بالتفصيل
تحياتى
:abc_152:

عبود عبود
13-02-2017, 11:59 PM
السلام عليكم ورحمة الله وبركاته
مرحبا بمشاركتك و الحل المقدم من طرفك اخى عبود حتى و ان جاء متأخرا و لك العذر فى انشغالك



التمرين لم يطلب اظهار اى رسالة للمستخدم و لا نريد ذلك لعدم مقاطعة سير البرنامج للسبب الآتى


لاحظ أيضا


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

و أعدك بالرد على كافة النقاط التى أثرتها بالتفصيل
تحياتى
:abc_152:

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

لا تعديل على الملف المفتوح سوى إلغاء سطر الرسالة فقط لا غير

المـهاجر
14-02-2017, 12:06 AM
الرسالة مجرد توضيح للعثور على نفس العنصر المراد إدخالة إلى المصفوفة " طبعا يمكن إلغاؤها بعلامة -- قبلها فقط " ليست هى المشكلة التى يتكلم عنها مبرمج مخضرم مثلك أخى العزيز فهى مجرد توضيح للعملية فقط لا غير وللمبتدئين ولمن يريد التأكد من صحة أو عدم صحة سير العملية لباقى الزملاء الأعزاء

لا تعديل على الملف المفتوح سوى إلغاء سطر الرسالة فقط لا غير

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

و لذلك السبب وضعت فى الملف المفتوح الخاص بالتمرين ليست بوكس

فهل هناك ما يمنع من استخدامه ؟
خالص تحياتى

عبود عبود
14-02-2017, 12:11 AM
هههههه يعنى إنت عايز التوليد للرقم العشوائى يتم بإستمرار حتى يتم إدخال كافة الأرقام داخل المصفوفة بدون تكرار ؟

طيب ما هى مشكل إدخال كود التوليد داخل الحلقة التكرارية ومن ثم عملية المقارنة كما هو واضح فى الملف السابق بسيطة ومن الممكن إجراء هذة العملية بدون وضع الشرط للمقارنة داخل وظيفة " كده فهمت طلبك السابق "

المـهاجر
14-02-2017, 12:18 AM
طيب ما هى مشكل إدخال كود التوليد داخل الحلقة التكرارية ومن ثم عملية المقارنة كما هو واضح فى الملف السابق بسيطة ومن الممكن إجراء هذة العملية بدون وضع الشرط للمقارنة داخل وظيفة " كده فهمت طلبك السابق "

بالضبط
هذا هو المطلوب فى التمرين
و لا اعتقد انه سيشكل اى مشكل لك
و وضع كود المقارنة بداخل وظيفة ليس شرطا فى التمرين

فقط "ان امكن" نريد رؤية الكود كاملا :abc_088:

عبود عبود
14-02-2017, 12:25 AM
ماشى نكمل غدا إن شاء الله " سوف أحاول ضبط الأكواد الآن شوية فإن لم أتمكن من ذلك سوف أعاود المحاولة غدا وبنفس الطريقة التى أعتمدت عليها "

المـهاجر
14-02-2017, 12:29 AM
لا بأس .. خذ وقتك
فتنوع الحلول سيثرى الموضوع و سيفيد الجميع
خالص تحياتى
:abc_152:

المـهاجر
14-02-2017, 12:58 AM
لم استطع قياس سرعة استجابة الكود
اضغط على الزر فتقع استجابة فورية
شـكــ وبارك الله فيك ـــرا لك :abc_152:... لك مني أجمل تحية .
************************************************** *******
هذا كود الظروف القاسية لا حظ كيف خرج عن السكة ولم يستعمل اليست بوكس

اخى فرح
إليك كود الظروف القاسية بعد تعديله ليناسب الاظهار فى الليستبوكس
-- Mohager Prevent Table Duplicate--
ListBox.DeleteItem("ListBox1", -1);
ListBox.SetUpdate("ListBox1", false);
t1 = os.clock()

function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

MyTable = {}
t1 = os.clock()
for i = 1,50000 do
rnd = Math.Random(1, 10000);
Add_Unique(MyTable,rnd)
end

t2 = os.clock()
t3 = t2 - t1
tco = Table.Count(MyTable);
Dialog.Message("Notice", tco.. " "..t3);

for a,z in pairs(MyTable) do
ListBox.AddItem("ListBox1", z, "");
end
ListBox.SetUpdate("ListBox1", true);

لاحظ اننا سنقيس الوقت قبل الاظهار فى الليستبوكس
لأننا نريد إختبار سرعة الكود ..(انا المسئول عن ذلك) :abc_088:
و ليس إختبار سرعة كائن الليستبوكس فى اظهار النتائج ...(انديجوروز و ميكروسوفت هما المسئولان عن ذلك) :abc_088:

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

عبود عبود
14-02-2017, 01:10 AM
تصدق بعد محاولات عديدة ثم الرجوع للنظر فى ملفك المفتوح " دماغى إتقلبت لما شوفت النتيجة التى تظهر فى الليست بوكس أثناء معاينة ملفك المفتوح فلم أجد بعض الأرقام والمفروض أنى فهمت طلبك أو تمرينك أن العملية العشوائية للتوليد تستمر حتى ينتج فى الليست بوكس كافة عناصرها من 1 إلى 6 "

بجد دماغى إتقلبت هههههههه

المـهاجر
14-02-2017, 01:21 AM
:abc_152:
المطلوب ببساطة توليد رقم عشوائى 6 مرات فقط
مع عدم ادراج اى عنصر مكرر فى مصفوفة النتائج
يمكنك الرجوع للمشاركة الأولى ففيها شرح مفصل
:abc_152:


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

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

عبود عبود
14-02-2017, 02:18 AM
:abc_152:
المطلوب ببساطة توليد رقم عشوائى 6 مرات فقط
مع عدم ادراج اى عنصر مكرر فى مصفوفة النتائج
يمكنك الرجوع للمشاركة الأولى ففيها شرح مفصل
:abc_152:

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

abood = {};
for i=1,6 do
result = Math.Random(1, 6);
if #abood<1 then
abood[#abood+1]=result ;
elseif #abood>=1 then
for s=1,#abood do
if result~=abood[s] and s==#abood then
abood[#abood+1]=result ;
elseif result==abood[s] then
break
end
end
end
end
t = Table.Concat(abood, ",", 1, TABLE_ALL);
Input.SetText("Input1", t);

المـهاجر
14-02-2017, 02:41 AM
فعلا الكود يأتى بالنتائج الصحيحة 10/10

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

قارن السرعة و ستفهم وجهة نظرى
الكود خاصتك
t1 = os.clock()
abood = {};
for i=1,10000 do
result = Math.Random(1, 1000);
if #abood<1 then
abood[#abood+1]=result ;
elseif #abood>=1 then
for s=1,#abood do
if result~=abood[s] and s==#abood then
abood[#abood+1]=result ;
elseif result==abood[s] then
break
end
end
end
end

t2 = os.clock()
t3 = t2 - t1
tco = Table.Count(abood);
Dialog.Message("Notice", tco.. " "..t3);

الكود الخاص بحل التمرين بعد وضعه بنفس الظروف
-- Mohager Prevent Table Duplicate--
ListBox.DeleteItem("ListBox1", -1);
t1 = os.clock()

function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

MyTable = {}
t1 = os.clock()
for i = 1,10000 do
rnd = Math.Random(1, 1000);
Add_Unique(MyTable,rnd)
end

t2 = os.clock()
t3 = t2 - t1
tco = Table.Count(MyTable);
Dialog.Message("Notice", tco.. " "..t3);

الفرق يصل ل 285 ضعف لسرعة التنفيذ
هل تتفق معى الان فى الرأى ؟
حسنا
لنقم بتعديل على الكود خاصتك
إليك الكود خاصتك بدون اى تعديل سوى تعليق الحلقة الخاصة بالبحث
فهل تجربه و تخبرنى بأنك وضعت حلقة تكرار زائدة تماما عن الاحتياج ؟؟
أم لا زلت ترانى مخطئ ؟؟
كيف يعمل الكود خاصتك بشكل صحيح بعد ان قمت انا بحذف حلقة فور "For" الثانية منه ؟؟
بعد هذا التعديل تتساوى السرعتين
t1 = os.clock()
abood = {};
for i=1,10000 do
result = Math.Random(1, 1000);
if #abood<1 then
abood[#abood+1]=result ;
elseif #abood>=1 then
--for s=1,#abood do
if result~=abood[s] then --and s==#abood then
abood[#abood+1]=result ;
elseif result==abood[s] then
-- break
end
--end
end
end

t2 = os.clock()
t3 = t2 - t1
tco = Table.Count(abood);
Dialog.Message("Notice", tco.. " "..t3);

خالص تحياتى

عبود عبود
14-02-2017, 02:48 AM
علشان أفهم كويس التعديل على كودى لابد من النوم الآن " فصلت خالص " لكن مبدئيا قمة الإمتياز التعديل الذى أدخلته أنت على كودى

المـهاجر
14-02-2017, 02:51 AM
يبدو اننى انا الآخر بحاجة للنوم .. فقدت التركيز تماما
لا أظن ان الكود المعدل سيظهر نتائج صحيحة عند ارجاع حدود الحلقتين ل 6
لم استطع التعامل مع الكود دون فصل دالة البحث الى فانكشن مستقل

للحديث بقية
تصبح على خير
:abc_139:

ثامر أبو بلقيس
14-02-2017, 08:07 PM
مشكــــور جدا

طلبي بسيط للغاية أظهر النتائج التي حجزت بكودك في ملقك المفتوح
في Dialog.Message لا أريد الليست بوكس فبحكم أن الكود المطروح حجز العناصر في مصفوفة
أحببت أن أقرأها في ديالوج أنتظر الجواب إن أمكن عن طلبي البسيط :abc_139:

المـهاجر
15-02-2017, 06:09 AM
?? :abc_087:معقول :abc_088: ؟؟؟
هل تسأل عن كود الاظهار برسالة ديالوج بسيطة ؟؟
:abc_083: :abc_083::abc_083:
-- Mohager Prevent Table Duplicate--
function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

MyTable = {}

for i = 1,10000 do
rnd = Math.Random(1, 1000);
Add_Unique(MyTable,rnd)
end

msg = Table.Concat(MyTable, " - ", 1, TABLE_ALL);
Dialog.Message("Notice", msg);

الكود سيظهر لك 1000 عنصر دفعة واحدة برسالة فورية :abc_152:

ثامر أبو بلقيس
15-02-2017, 06:34 AM
ما تفسيـــرك عند استعمال الكود
function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

MyTable = {}

for i = 1,6 do
rnd = Math.Random(1, 6);
Add_Unique(MyTable,rnd)
end

msg = Table.Concat(MyTable, " , ", 1, TABLE_ALL);
Dialog.Message("Notice", msg);

ظهور مصفوفات مهدورة تظهر عند تعدد المحاولات أي المصفوفة تكون خالية :abc_139:

المـهاجر
15-02-2017, 06:48 AM
حقيقة الامر :abc_088:
لا اعرف :abc_070:

لكنى متأكد ان الأمر لا علاقة له بالكود
-- Mohager Prevent Table Duplicate--
function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

MyTable = {}
ListBox.DeleteItem("ListBox1", -1);

for i = 1,6 do
rnd = Math.Random(1, 6);
Add_Unique(MyTable,rnd)
end

msg = Table.Concat(MyTable, " , ", 1, TABLE_ALL);
Dialog.Message("Notice", msg);

for a,z in pairs(MyTable) do
ListBox.AddItem("ListBox1", z, "");
end
يبدو ان هناك bug فى دالة Table.Concat و تمت الاشارة اليها بموقع الشركة المنتجة منذ وقت بعيد

ثامر أبو بلقيس
15-02-2017, 06:57 AM
حقيقة الامر :abc_088:
لا اعرف :abc_070:

لكنى متأكد ان الأمر لا علاقة له بالكود

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

أتمنى أن يكون الخطأ عندي موفق و مشكور :abc_138:

المـهاجر
15-02-2017, 07:06 AM
الكود قد لا يجيب عن التمرين المطروح " ضمان عدم التكرار عند إدخال القيم للمصفوفات "

خطأ 100%


بل يهمل المصفوفة كاملة عند وجود التكرار و ينتقي فقط المصفوفات التي لا يوجد فيها تكرار
:abc_138:

عذرا
هل الكود الذى امامك ينتقى مصفوفات ام عناصر ؟

حسنا
راجع مشاركتى السابقة
و فسر لى كيف يتصادف ان لا تعطى الرسالة اى نتائج بينما يعطى لنا الليست كافة العناصر الصحيحة فى نفس الوقت ؟؟
و كيف تتمكن الرسالة من العمل عند الدمج بواسطة " - " ؟؟

الكود صحيح 100% و لا يشغلنى ابدا bug الدمج Table.Concat فهى مشكلة انديجوروز و ليست مشكلتى

ثامر أبو بلقيس
15-02-2017, 07:18 AM
بالخطأ المشار إليه سأعتبر الأمر إنتقاء مادام هناك إهمال
و هل ما طرح من أكواد في مشاركات سابقة يشملها هذا bug
سبق وذكرت لك بأن الأمر بالنسية لي سيكون دراسة كفاءة أكواد
قنحن الان أمام مقاربة " السرعة مع الخطأ الذي لا يظهر مع رفع الاحتمالات
و بطء مقبول مع دقة في التنفيذ "

مشكور أخي الكريم :abc_138:
وفي النهاية كلها أراء لا غير

المـهاجر
15-02-2017, 09:40 AM
بالخطأ المشار إليه سأعتبر الأمر إنتقاء مادام هناك إهمال
و هل ما طرح من أكواد في مشاركات سابقة يشملها هذا bug
سبق وذكرت لك بأن الأمر بالنسية لي سيكون دراسة كفاءة أكواد
قنحن الان أمام مقاربة " السرعة مع الخطأ الذي لا يظهر مع رفع الاحتمالات
و بطء مقبول مع دقة في التنفيذ "


لم ترد على جزئية "كيف قام الليست بالاظهار الصحيح"

احتساب الأخطاء لا يصح بهذا المنطق خصوصا و انت تناقش كود اسرع عشرات و مئات المرات من كل ما طرح او تم شرحه
و هدمت نظريات لها سنين

و إلا و بنفس المنطق فان السطر التالى فى اكوادك خطأ
msg = Table.Concat(MyTable, " , ", 1, TABLE_ALL);

و ان الصواب
msg = Table.Concat(MyTable, " - ", 1, TABLE_ALL);

اما من ناحية البطء المقبول
فعذرا البطء له نسب للقبول
اما ان نتجاوز عن دوال ترفع زمن التنفيذ للأس 2 فهذا طبعا غير مقبول
و بصفة عامة
الكود يحاسب على كفائته و سرعته فى احتساب النتائج
و ليس بعدم خبرة المستخدم فى اظهار النتائج او سوء انتقاء عناصر غير مناسبة فى الاظهار أو حتى وضع بارامترات غير مناسبة:abc_088:

عبود عبود
15-02-2017, 09:46 AM
الإنشغال وراء عدم إستكمال النقاش معكم ....... أتمنى لكم التوفيق

:abc_138:

ثامر أبو بلقيس
15-02-2017, 02:22 PM
كما ذكرت لك في النهاية هي أكواد و اراء و نقاش حول أكواد لا غير
قد أكون فيها مخطيء و تمنيته لنفسي ... و قد أكون مصيبا في بعض ما قلت و لست
مظطرا لفرضه كأسلوب موفق بإذن الله ... لك مني أجمل تحية . :abc_138:
----------------------------------------------------------------------------
أنتظر باقي التمرينات بشغف لأستفيد أولا و قد أفيد :abc_138:

المـهاجر
15-02-2017, 03:22 PM
من الخطأ الاعتقاد بسهولة و بساطة المصفوفات بعد ربطها بالديالوج بوكس
هى كائنات بالغة التعقيد خصوصا بعد ربطها بالديالوج بوكس
و كما ذكرت انك تعتقد بوجود خطأ بالدالة لمجرد عدم اظهار الديالوج بشكل متوقع

فسر لنا لماذا يتغير أسماء و عدد ازرار و شكل و ايقونات الديالوج بوكس بعد وضع التالى فى زر؟؟
Dialog.Message("Notice" , unpack{10,20,30});

Dialog.Message("Notice", unpack{10,50,90});

Dialog.Message("Notice", unpack{10,50});


و ايضا فسر لنا لماذا لا يظهر هذا الزر اى رسائل ؟؟
Dialog.Message("Notice" , unpack{15,25,35});

Dialog.Message("Notice", unpack{15,55,95});

Dialog.Message("Notice", unpack{15,55});


برغم احتوائه على كود مطابق للسابق مع تغيير قيم المصفوفة
هل دالة اللوا القياسية unpack بها bug
كيف تعاملت معها الأوتوبلاى على هذا النحو و غيرت من مكونات نافذة المسج نفسها ؟
هل لديك تفسير ؟
أنا لدى على الأقل نظرية فى ذلك و هى
المصفوفات + الديالوج + اللوا = خطأ متوقع بنسبة 90 %

المـهاجر
15-02-2017, 05:30 PM
الأن بعد ان اثبتنا قصور اللوا فى عرض المصفوفات فى رسائل
فهذا يعتبر دليل سلبى
الآن مع الدليل الايجابى
سنثبت هنا ان الكود سليم 100 % و سننفى شبهة وجود اى خطأ بالبرنامج
و سنعرض كافة العناصر و كذلك العناصر الغير مكررة
و سنعرض النواتج برسالة بعد تكوينها
طبعا بعد معالجة اوجه القصور فى Table.Concat و عمل Re indexing يدوي لمصفوفة النواتج
-- Mohager Prevent Table Duplicate--
function Add_Unique(TableName,Element)
if TableName[Element]== nil then
TableName[Element] = Element
end
end

ListBox.DeleteItem("ListBox1", -1);
ListBox.DeleteItem("ListBox2", -1);
MyTable = {}

for i = 1,6 do
rnd = Math.Random(1, 6);
ListBox.AddItem("ListBox2", rnd, "");
Add_Unique(MyTable,rnd)
end
-- Re indexing
MyTableCompact = {}
for a,z in pairs(MyTable) do
Table.Insert(MyTableCompact, 1, z);
end

for a,z in pairs(MyTableCompact) do
ListBox.AddItem("ListBox1", z, "");
end

msg = Table.Concat(MyTableCompact, " , ", 1, TABLE_ALL);
Dialog.Message("Notice", msg, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
دون اى تأثير على السرعة التى سيعمل بها الكود و التى تصل لعشرات و مئات اضعاف سرعة الأكواد المعتادة
و أيضا دون استخدام تكرار فى دالة الكشف :abc_051:
تحطيم كامل لكافة المفاهيم العتيقة التى لا تعود الا بالبطء :abc_051:

http://c.top4top.net/p_4112hmfk1.jpg

الآن حلقوا فى سماء السرعة مع الملف المفتوح المرفق
تمنياتى بمشاهدة ممتعة

شكرا لكل من شارك فى المناقشة
الى اللقاء
:abc_152: :abc_152: :abc_152:
:abc_152::abc_152:
:abc_152:

ثامر أبو بلقيس
15-02-2017, 11:05 PM
من الخطأ الاعتقاد بسهولة و بساطة المصفوفات بعد ربطها بالديالوج بوكس
هى كائنات بالغة التعقيد خصوصا بعد ربطها بالديالوج بوكس
و كما ذكرت انك تعتقد بوجود خطأ بالدالة لمجرد عدم اظهار الديالوج بشكل متوقع

فسر لنا لماذا يتغير أسماء و عدد ازرار و شكل و ايقونات الديالوج بوكس بعد وضع التالى فى زر؟؟
dialog.message("notice" , unpack{10,20,30});

dialog.message("notice", unpack{10,50,90});

dialog.message("notice", unpack{10,50});


و ايضا فسر لنا لماذا لا يظهر هذا الزر اى رسائل ؟؟
dialog.message("notice" , unpack{15,25,35});

dialog.message("notice", unpack{15,55,95});

dialog.message("notice", unpack{15,55});


برغم احتوائه على كود مطابق للسابق مع تغيير قيم المصفوفة
هل دالة اللوا القياسية unpack بها bug
كيف تعاملت معها الأوتوبلاى على هذا النحو و غيرت من مكونات نافذة المسج نفسها ؟
هل لديك تفسير ؟
أنا لدى على الأقل نظرية فى ذلك و هى
المصفوفات + الديالوج + اللوا = خطأ متوقع بنسبة 90 %

بحكم أن السؤال يبدو أنه موجه لي سأجيبكم
فلدي تظرية بسيطة هي للحصول على نتائج مرغوبة يجب التعامل مع أكواد اللوا بالشكل الصحيح

وعليه تفسيري ببساطة وبكلمة واحدة " لوكاليها " ستظهر النتائج في كل الرسائل و بالشكل الصحيح المعتاد
موفق

المـهاجر
16-02-2017, 04:40 AM
وبكلمة واحدة " لوكاليها " ستظهر النتائج في كل الرسائل و بالشكل الصحيح المعتاد


لا اعرف اين الخطأ ؟؟ شغلت الكود و قلت كلمة " لوكاليها " و لم يحدث اى تغيير.. ربما لها طريقة نطق معينة
:abc_152: :abc_152: :abc_152:
:abc_152::abc_152:
:abc_152:

شكرا لكل من شارك فى المناقشة
الى اللقاء
:abc_152: :abc_152: :abc_152:
:abc_152::abc_152:
:abc_152:

ثامر أبو بلقيس
16-02-2017, 07:39 AM
لا اعرف اين الخطأ ؟؟ شغلت الكود و قلت كلمة " لوكاليها " و لم يحدث اى تغيير.. ربما لها طريقة نطق معينة
:abc_152: :abc_152: :abc_152:
:abc_152::abc_152:
:abc_152:

شكرا لكل من شارك فى المناقشة
الى اللقاء
:abc_152: :abc_152: :abc_152:
:abc_152::abc_152:
:abc_152:

حسنا لا تشغل بالك بتلك المفردة كثيرا
و حاول الاستفادة من الكتابة الصحيحة عند التعامل مع الأكواد
----------------------- 1 -----------------------------
p1 = unpack{10,20,30}
Dialog.Message("p1" ,p1);
--------------------------------------------------------
p2 = unpack{10,50,90}
Dialog.Message("p2",p2 );
--------------------------------------------------------
p3 = unpack{10,50}
Dialog.Message("p3", p3);
--------------------- 2 ---------------------------------
p4 =unpack{15,25,35}
Dialog.Message("p4" , p4);
--------------------------------------------------------
p5 = unpack{15,55,95}
Dialog.Message("p5",p5 );
--------------------------------------------------------
p5 = unpack{15,55}
Dialog.Message("p6", p5);
--------------------------------------------------------

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

فسر لنا ما حدث و اين هي الأاخطاء ؟
موفق

المـهاجر
16-02-2017, 09:16 AM
و حاول الاستفادة من الكتابة الصحيحة عند التعامل مع الأكواد


طبعا سأحاول


فسر لنا ما حدث و اين هي الأاخطاء ؟
موفق

سأتكلم عن الدالة التى طرحتها لك و سأخبرك بالخطأ الذى لم تجيب عنه
dialog.message("notice" , unpack{10,20,30});
الخطأ هو ان دالة الأوتوبلاى قامت بفك المصفوفة (التى هى اصلا متموضعة بالبارامتر الثانى فى دالة الديالوج مسج)
ثم قامت بإستخدام عناصر المصفوفة كبارامتر ثالث و رابع و خامس لدالة الديالوج مسج
و الذين تم حذفهم من الدالة الأصلية (https://www.indigorose.com/webhelp/tu/Program_Reference/Actions/Dialog.Message.htm)
number Dialog.Message (


string Title,

string Text,

number Type = MB_OK,

number Icon = MB_ICONINFORMATION,

number DefaultButton = MB_DEFBUTTON1 )

عبود عبود
16-02-2017, 11:47 AM
طبعا سأحاول



سأتكلم عن الدالة التى طرحتها لك و سأخبرك بالخطأ الذى لم تجيب عنه
dialog.message("notice" , unpack{10,20,30});
الخطأ هو ان دالة الأوتوبلاى قامت بفك المصفوفة (التى هى اصلا متموضعة بالبارامتر الثانى فى دالة الديالوج مسج)
ثم قامت بإستخدام عناصر المصفوفة كبارامتر ثالث و رابع و خامس لدالة الديالوج مسج
و الذين تم حذفهم من الدالة الأصلية (https://www.indigorose.com/webhelp/tu/program_reference/actions/dialog.message.htm)
number dialog.message (


string title,

string text,

number type = mb_ok,

number icon = mb_iconinformation,

number defaultbutton = mb_defbutton1 )

كلام سليم 100% لذلك التعامل الصحيح من البداية ومعرفة كيفية إستخدام أى دالة وطريقة تعاملها مع البارامترات الخاصة بها يمنع وقوع الأخطاء ففى النهاية تعلمون جميعا أن الأتوبلاى عموما هو عبارة عن مجموعة دوال يمكن إستدعاؤها نظرا للبرمجة المسبقة لها فى ملف الدل الخاص بالبرنامج "الأتوبلاى"
وعلى ذلك تكون الأخطاء من المبرمج الذى يتعامل مع برنامج الأتوبلاى نظرا لعدم الإلتزام من البداية بالقواعد

عبود عبود
16-02-2017, 12:03 PM
أما عن الكود الأساسى محور الموضوع والذى وضعته أنت أستاذ "المهاجر" فمن وجهة نظرى تكمن السرعة فى تنفيذة فى إستخدام الفانكشن من البداية
نعلم جميعا أن الوظيفة تم تنفيذها أولا قبل تنفيذ التكرار ومن ثم فهى أسرعت كثيرا الكود "كود التكرار" نظرا لأن البرنامج نفذ بطبيعة الحال الوظيفة وخاصة أن الوظيفة مجهولة البارامترات ولكن معلومة النتيجة " نتيجة التنفيذ " عند إدخال القيم لها فى التكرار نفسة وعلى ذلك فإن كل ما يتم فى التكرار هو إستبدال مدخلات فقط فى الوظيفة " فهنا تأتى السرعة فى التنفيذ "
:abc_051: وجهة نظرى التحليلية

ثامر أبو بلقيس
16-02-2017, 12:56 PM
طبعا سأحاول



سأتكلم عن الدالة التى طرحتها لك و سأخبرك بالخطأ الذى لم تجيب عنه
dialog.message("notice" , unpack{10,20,30});
الخطأ هو ان دالة الأوتوبلاى قامت بفك المصفوفة (التى هى اصلا متموضعة بالبارامتر الثانى فى دالة الديالوج مسج)
ثم قامت بإستخدام عناصر المصفوفة كبارامتر ثالث و رابع و خامس لدالة الديالوج مسج
و الذين تم حذفهم من الدالة الأصلية (https://www.indigorose.com/webhelp/tu/Program_Reference/Actions/Dialog.Message.htm)
number Dialog.Message (


string Title,

string Text,

number Type = MB_OK,

number Icon = MB_ICONINFORMATION,

number DefaultButton = MB_DEFBUTTON1 )

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

بينما أنا أجبت عن الذي يجب أن يحدث بعد التنفيذ الصحيح

لذلك راجع تساؤلك قبل ايهام القاريء بأني لم أجيب فالقضية ليست تذاكي أنت كتبت كود لا يعطي نتائج
أعدت لك كتابته و أعطت النتائج إذن الخلل في كتابة المبرمج الذي كتب الكود
و إذ كان المنطق يسير على هذا النحو فكل رسائل الخطأ سنعتبرها خللا في أي برنامج و بأي لغة كان
خلفية كلامي الافادة و الاستفادة موفق :abc_138:

المـهاجر
16-02-2017, 01:05 PM
كلام سليم 100% لذلك التعامل الصحيح من البداية ومعرفة كيفية إستخدام أى دالة وطريقة تعاملها مع البارامترات الخاصة بها يمنع وقوع الأخطاء
اكواد المشاركة 51 تلتزم بقواعد الأوتوبلاى
هنا Bug
لا يفترض بدالة المسج توزيع عناصر مصفوفة البارامتر الثانى على باقى البارامترات من تلقاء نفسها

المـهاجر
16-02-2017, 01:21 PM
بينما أنا أجبت عن الذي يجب أن يحدث بعد التنفيذ الصحيح


شكرا لاجابتك على ما لم اسأل عنه :abc_152:
و راجع ردى على مشاركة استاذ عبود

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

انت تدافع عن Bug الشركة نفسها لا تنكره :abc_088:
https://forums.indigorose.com/forum/autoplay-media-studio-8-5/autoplay-media-studio-8-discussion/36110-why-this-code-runs-faster
و لخلل فى اظهار الكود بموقع الشركة
التساؤل هناك كان عن كودين
الكود الأول تم دمج المصفوفة ب "-" و الكود الثانى تم دمج المصفوفة ب " - "
فهل دافع احد ؟؟

عموما هذا يخرج تماما عن موضوع التمرين و مناقشة الكود بموضوعية
فمن غير المنطقى ان نترك الكود و نركز على حالة وحيدة و علامة خاصة
مع العلم اننى حللت المشكل الخاص بالرسالة بكود اعتقد انه حاسم
http://www.abc4web.net/vb/showpost.php?p=309722&postcount=52
و طبعا لم اتلقى اى تعليق

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

المـهاجر
16-02-2017, 01:27 PM
أما عن الكود الأساسى محور الموضوع والذى وضعته أنت أستاذ "المهاجر" فمن وجهة نظرى تكمن السرعة فى تنفيذة فى إستخدام الفانكشن من البداية
نعلم جميعا أن الوظيفة تم تنفيذها أولا قبل تنفيذ التكرار ومن ثم فهى أسرعت كثيرا الكود "كود التكرار" نظرا لأن البرنامج نفذ بطبيعة الحال الوظيفة وخاصة أن الوظيفة مجهولة البارامترات ولكن معلومة النتيجة " نتيجة التنفيذ " عند إدخال القيم لها فى التكرار نفسة وعلى ذلك فإن كل ما يتم فى التكرار هو إستبدال مدخلات فقط فى الوظيفة " فهنا تأتى السرعة فى التنفيذ "
:abc_051: وجهة نظرى التحليلية

استاذ عبود
ذكرت لكم مرارا انكم جميعا تستخدمون حلقتين أحدهما زائدة للبحث داخل عناصر المصفوفة
هل تذكر الكود الذى طرحته لى
حسنا
راقب الآن كيف سيعمل نفس الكود بعد ازالة 8 اسطر من اصل 15
و اجراء بعض التعديلات الخاصة بإزالة التدابير الخاصة بعداد الاندكس الخاص بالمصفوفة
abood = {};
for i=1,6 do
result = Math.Random(1, 6);
--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[s] then
-- break
--end
--end
end
end
فهمت قصدى ؟؟
هناك حلقة زائدة لا محالة
و ليس مجرد فصل عملية الكشف فى فانكشن
و السرعة تزيد بزيادة أسية (رفع لأس) و ليس بنسبة مئوية
تحياتى
:abc_152:

عبود عبود
16-02-2017, 02:27 PM
كلام سليم 100% لذلك التعامل الصحيح من البداية ومعرفة كيفية إستخدام أى دالة وطريقة تعاملها مع البارامترات الخاصة بها يمنع وقوع الأخطاء
اكواد المشاركة 51 تلتزم بقواعد الأوتوبلاى
هنا Bug
لا يفترض بدالة المسج توزيع عناصر مصفوفة البارامتر الثانى على باقى البارامترات من تلقاء نفسها



هذا ما علقت علية بأنه صحيح وتمام وقدمت له بعض التوضيح بخصوص دالة unpack فى هذا الموضوع http://www.abc4web.net/vb/showthread.php?t=27661

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

كلامك سليم 100%



استاذ عبود
ذكرت لكم مرارا انكم جميعا تستخدمون حلقتين أحدهما زائدة للبحث داخل عناصر المصفوفة
هل تذكر الكود الذى طرحته لى
حسنا
راقب الآن كيف سيعمل نفس الكود بعد ازالة 8 اسطر من اصل 15
و اجراء بعض التعديلات الخاصة بإزالة التدابير الخاصة بعداد الاندكس الخاص بالمصفوفة
abood = {};
for i=1,6 do
result = Math.Random(1, 6);
--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[s] then
-- break
--end
--end
end
end
فهمت قصدى ؟؟
هناك حلقة زائدة لا محالة
و ليس مجرد فصل عملية الكشف فى فانكشن
و السرعة تزيد بزيادة أسية (رفع لأس) و ليس بنسبة مئوية
تحياتى
:abc_152:

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

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


:abc_152:

المـهاجر
16-02-2017, 04:06 PM
فهمتك جيدا ولكن أنت هنا سوف تدخل فى المصفوفة على سبيل المثال الرقم الذى تم توليدة فى أول دورة للتكرار هو 6
المصفوفة فارغة تذكر جيدا ...... إذن سوف تخاطب بالشرط إف " abood[result] == nil " .... إذا لم يجد العنصر السادس فى المصفوفة الفارغة أصلا حتى الآن يقوم بإدخال هذا العنصر ؟

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

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

ما قيمة الاندكس ؟؟ Element
ما قيمة العنصر ؟؟ Element
أليسا هما نفس المتغير و نفس القيمة ؟؟
إذن وجود القيمة 6 = وجود العنصر السادس (وجهان لنفس العملة)

سأرد الأن على سؤالك
لنفترض اننا فى الدورة الأولى من حلقة توليد العشوائى و التى انتجت القيمة 6
لنقم بالتعويض ب 6
if TableName[6]== nil then
TableName[6] = 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 فقط و لا يتطلب حلقة ( جميل جدا جدا)
توظيف المعلومتين لحل المشكلة : قمت بجعل قيمة العنصر = نفس قيمة الاندكس
ببساطة خدعنا المصفوفة و جعلنا الاندكس = العنصر و ذلك لإخضاعها للبحث بلا حلقة
مسكينة جدا هذه المصفوفة الضحية :abc_088: .... :abc_087:اوهمناها اننا نبحث عن الاندكس بينما نتيجة البحث ستشير الى وجود او عدم وجود العنصر
يحق لها طلب تعويض و التعويض جاهز و هو دالة Reindex لإعادة الاندكس لترقيم مسلسل بدون فراغات
( عدم تسلسل اندكس المصفوفة أزعج دالة الكونكيت و أظهرت Bug المسج .. لابد من Reindex )

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

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

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

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

:abc_152::abc_152::abc_152:
:abc_152::abc_152:
:abc_152:

عبود عبود
16-02-2017, 04:29 PM
سأرد عليك مرة أخرى إن شاء الله حوالى الساعة 10 أو 11 بتوقيت القاهرة "مصر"

فرح صالحي
16-02-2017, 05:52 PM
لذلك ذكرت سابقا


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

ما قيمة الاندكس ؟؟ Element
ما قيمة العنصر ؟؟ Element
أليسا هما نفس المتغير و نفس القيمة ؟؟
إذن وجود القيمة 6 = وجود العنصر السادس (وجهان لنفس العملة)

سأرد الأن على سؤالك
لنفترض اننا فى الدورة الأولى من حلقة توليد العشوائى و التى انتجت القيمة 6
لنقم بالتعويض ب 6
if TableName[6]== nil then
TableName[6] = 6

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

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

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

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

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

:abc_152::abc_152::abc_152:
:abc_152::abc_152:
:abc_152:

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

المـهاجر
17-02-2017, 04:18 AM
شرح قيم جدا بارك الله فيك وفي علمك
:abc_152::abc_152::abc_152:

شكرا استاذ فرح
موفق
:abc_152:

عبود عبود
17-02-2017, 09:31 PM
جميل جدا الحل المقدم منك ولكن إذا إستعلمنا عن عدد عناصر المصفوفة سوف نجدها 0 نظرا لإحتوائها على أماكن فارغة لم يتم ملئها بالعناصر نظرا للإدخال العشوائى لها " حل غير تقليدى ولكن جميل "

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


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

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

:abc_012: ولا يمكن بإستعمال دالة التكرار العادية :


--
for i=1, #MyTable do
ListBox.AddItem("ListBox1", MyTable[i], "");
end

المـهاجر
18-02-2017, 04:21 AM
جميل جدا الحل المقدم منك ولكن إذا إستعلمنا عن عدد عناصر المصفوفة سوف نجدها 0 نظرا لإحتوائها على أماكن فارغة لم يتم ملئها بالعناصر نظرا للإدخال العشوائى لها " حل غير تقليدى ولكن جميل "


بداية لا توجد اى اماكن فارغة فى المصفوفة
فقط أندكسات العناصر غير مرتبة
مثلا تجد الاندكسات 6 و 5 و 1 كما فى المثال السابق متصلة بلا اى فراغات و لكنها غير مرتبة
ستكون هناك قفزات للاندكس لكن لا توجد فراغات حقيقية


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


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

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

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

عبود عبود
18-02-2017, 04:38 PM
من قال ذلك ؟؟ يمكنك استخدام اى تكرار

فقط قم بعد المصفوفة بالدالة القياسية 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


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

المـهاجر
18-02-2017, 06:45 PM
بالنسبة للنقطة دى لماذا Table.Count ولا تعطى نتيجة صحيحة مع # أريد أن أستفيد من علمك بهذا الشيئ ما هو الفرق بينهما

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

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


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

تتشابة 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://www.abc4web.net/vb/showpost.php?p=309722&postcount=52
عند عمل Reindex يتم معالجة الانتهاك السابق و ترجع المصفوفة للشكل القانونى و كأن المخالفة لم تحدث
و يرجع الترقيم الى صيغة الترقيم التصاعدى الطبيعى 1 2 3 4 التى يفهمها محرك اللوا و يتعامل معها بسلاسة

ملحوظة
لم افهم لماذا تستعلم عن هذا الكود
--
for a,z in pairs(MyTable) do
ListBox.AddItem("ListBox1", a, "");
end

موفق

عبود عبود
18-02-2017, 09:21 PM
شكرا للإفادة :abc_138: