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

مشاهدة النسخة كاملة : تمرين : عدد الكلمات في متغير


ثامر أبو بلقيس
15-11-2014, 12:30 PM
السلام عليكم ورحمة الله وبركاته
بغية التنشيط و التعلم لا غير .... تمت محاولات متعلقة بحساب
عدد الكلمات في متغير جيدة
لكن بها بعض الأخطاء الطفيفة جدا .... شارك بكود يفي بالغرض مع
التركيز على دعم اللغة العربية
وبين التنوع في حلول تحكمها التجربة .. ستكون هنااك حلول ذات فائدة
----------------------------------------
شارك في بناء كود :abc_138: موفق :abc_138:

ثامر أبو بلقيس
16-11-2014, 09:12 PM
--- اذ كانت الدعوة للتعلم من بعض و استثمار الوقت
غير مناسب طرحا .... لابأس أن يلقى كذلك هذا الموضوع الحذف
بدون انزعاج ---- تقديري:abc_138:

عبود عبود
17-11-2014, 12:39 AM
--- اذ كانت الدعوة للتعلم من بعض و استثمار الوقت
غير مناسب طرحا .... لابأس أن يلقى كذلك هذا الموضوع الحذف
بدون انزعاج ---- تقديري:abc_138:

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

ثامر أبو بلقيس
17-11-2014, 11:42 AM
للأمانة : لا تقصير و لا تهديد لا من ادارة و لا من عضو
مشكور أخي :abc_138:

صفا الفليج
17-11-2014, 06:17 PM
السلام عليكم

هذا إصدار أوّليّ للعمليّة، المحاولة بدائيّة للغاية لكنّها تفي بالغرض، يمكن تحويل شِفرة الحساب إلى دالة لتسهيل العمل :)
نصّ الدّوال العموميّة (حصلت على دالة DelimitedStringToTable من www.indigorose.com/forums/threads/20141):

function DelimitedStringToTable(DelimitedString, Delimiter)
tbReturn = {}
local strWorking
local nPos = nil
local strData
local nTableIndex = 1
local nDelimiterLength = String.Length(Delimiter)
if (nDelimiterLength < 1) then
tbReturn[nTableIndex] = DelimitedString
return tbReturn
end
strWorking = DelimitedString
nPos = String.Find(strWorking, Delimiter)
while (nPos ~= -1) do
strData = String.Left(strWorking, nPos -1)
tbReturn[nTableIndex] = strData
nTableIndex = nTableIndex + 1
local nLength = String.Length(strWorking)
strWorking = String.Right(strWorking, nLength - (nPos + (nDelimiterLength -1)))
nPos = String.Find(strWorking, Delimiter)
end
if (strWorking ~= "") then
tbReturn[nTableIndex] = strWorking
end
return tbReturn
end

arabicCharactersString = 'اأإآىبتةثجحخدذرزسشصضطظعغ قكلمنهوؤيئء'..'؟!.،؛’"\''..'ًٌٍَُِّْ'

شِفرة الزرّ/الحدث/أيًّا كان:
arabicText=Input.GetText('arabicText')

newArabicText=DelimitedStringToTable(arabicText, ' ')

numberOfArabicWords=0
for j,word in pairs(newArabicText) do
wordLength=String.Length(word);
wordIsOK=true
for x=1, wordLength do
searchLetter=String.Find(arabicCharactersString,St ring.Mid(word,x,1))
if searchLetter == -1 then
wordIsOK=false
break
end
if wordIsOK ~= true then
break
end
end
if wordIsOK == true then
numberOfArabicWords = numberOfArabicWords +1
end
end
Dialog.Message('خرجت النتيجة أخيرًا!','عدد الكلمات العربية هو '..numberOfArabicWords)

تحيّاتي

ثامر أبو بلقيس
17-11-2014, 06:23 PM
ما شاء الله :abc_138: جاري التجربة
و محاولة المشاركة بكود تقديري :abc_138:

ثامر أبو بلقيس
17-11-2014, 06:31 PM
السلام عليكم ورحمة الله وبركاته
عند وجود اسم بجانبه رقم
مثلا
ثامر2014
لماذا احتسب عدد الكلمات 0

صفا الفليج
17-11-2014, 06:40 PM
السلام عليكم ورحمة الله وبركاته
عند وجود اسم بجانبه رقم
مثلا
ثامر2014
لماذا احتسب عدد الكلمات 0

لأنّ الكلمة حسب عمل البرنامج هي التي تسبقها مسافة وتليها مسافة، يمكنك إضافة الأرقام من 0 إلى 9 إلى سلسلة المحارف في الدّوال العموميّة.
وأيضًا لأنّ "ثامر2014" خاطئة كتابيًا أساسًا، مَن هذا الذي عندما يناديه أحد في الشارع يضيف 2014 وهو يناديه؟ :d

ثامر أبو بلقيس
17-11-2014, 06:45 PM
السلام عليكم ورحمة الله وبركاته

نعم فعلت ذلك و نجح الامر و حسب 1

لكن عند وجود مساافة بادئة مثلا :
ثامر2014

يحسب 2

صفا الفليج
17-11-2014, 06:51 PM
السلام عليكم ورحمة الله وبركاته

نعم فعلت ذلك و نجح الامر و حسب 1

لكن عند وجود مساافة بادئة مثلا :
ثامر2014

يحسب 2

حسنًا، عدّل على الشِفرة لتزيل المسافات البادئة والمسافات المتكررة (استبدل كل مسافتين بمسافة)
استخدم الدالة Mid و TrimLeft مع حلقة while
؛)

ثامر أبو بلقيس
17-11-2014, 06:55 PM
لم أعرف أخي كيف أستعملها أي لم تصلني الفكرة :abc_138:

ثامر أبو بلقيس
17-11-2014, 07:08 PM
حسنا أخي صفا تبادلا للأفكار
سأضع مقترح
في البداية لوكان عندنا نص مكتوب مثلا في انبوت

ماذا سيعطينا هذا الكود ؟
for w in string.gmatch (Input.GetText("Input1"), "%S+") do
Dialog.Message("Notice",w);
end

سيستخلص المفردة واحدة واحدة أليس كذلك
نستعمل الحيلة و نعلن عن عدد المفردات
for w in string.gmatch (Input.GetText("Input1"), "%S+") do

Dialog.Message("Notice",#w);
end

بقليل من التفكير مجموع حروف كلمة مقسوم على نفس المجموع = 1
أي نبدأ في استخلاص عدد المفردات مباشرة ونعلن عنها بمجموع
F=""
for w in string.gmatch (Input.GetText("Input1"), "%S+") do
F=F..#w/#w
end
Dialog.Message("Notice",#F);

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

صفا الفليج
18-11-2014, 07:15 AM
بقليل من التفكير مجموع حروف كلمة مقسوم على نفس المجموع = 1
أي نبدأ في استخلاص عدد المفردات مباشرة ونعلن عنها بمجموع
F=""
for w in string.gmatch (Input.GetText("Input1"), "%S+") do
F=F..#w/#w
end
Dialog.Message("Notice",#F);

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

لأوّل وهلة ظننت أن string هي إضافة :\
معلوماتي عتيقة لذلك لم أستوعب ما هي، جميل استخدام أصل lua :)
يمكن الاستغناء عن دالة تقسيم السلسلة بهذه الطريقة.
حسنًا، ما رأيك بالاستغناء عن gmatch والاستيعاظ عنها بـ match؟
جرب هذا التعبير بدل %S+:
([؀-ۿݐ-ݿﭐ-﷽ﹰ-ﻼ]+)
(لا أدري أن كانت الأقواس ضرورية أم لا...)
لم أجرّبه صراحةً في AutoPlay لكنّي جرّبته في فاحصات التعابير النمطية.

تحياتي

صفا الفليج
19-11-2014, 08:49 PM
لأوّل وهلة ظننت أن string هي إضافة :\
معلوماتي عتيقة لذلك لم أستوعب ما هي، جميل استخدام أصل lua :)
يمكن الاستغناء عن دالة تقسيم السلسلة بهذه الطريقة.
حسنًا، ما رأيك بالاستغناء عن gmatch والاستيعاظ عنها بـ match؟
جرب هذا التعبير بدل %S+:
([؀-ۿݐ-ݿﭐ-﷽ﹰ-ﻼ]+)
(لا أدري أن كانت الأقواس ضرورية أم لا...)
لم أجرّبه صراحةً في AutoPlay لكنّي جرّبته في فاحصات التعابير النمطية.

تحياتي

بعد أن أعلمني الأخ ثامر على الخاص بأنّ المحرر لا يدعم المحارف هذه أتيت لأجلب حلا..

بدل '%S+' نضع:
'['..arabicCharactersString..']+'
ونجرّب...

ثامر أبو بلقيس
19-11-2014, 09:10 PM
أخي صفا هاته النوعية من الدوال تتعامل مع ريجكس


فشلي في تنفيذ ما تقترحه لا ينفي صحته

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

ثامر أبو بلقيس
19-11-2014, 09:30 PM
مع ملاحظة : تعديل الحل يكون بعد فشله
ولم أقرأ بعد نقدا و أقصد تغيير التعبير " %S+" هي مجرد فكرة لحل ... لذلك ما يفيدنا تنوع حلول واضحة
باستعمالات مختلفة مشكور أخي :abc_138:

صفا الفليج
19-11-2014, 09:45 PM
جرب هذا أخي ثامر:
Paragraph.SetText('Paragraph1','')
F=""
for w in string.gmatch (Input.GetText('arabicText'),'['..arabicCharactersString..']+') do
F=F..#w/#w
Paragraph.SetText('Paragraph1',Paragraph.GetText(' Paragraph1')..'\n'..#w..': '..w)
end
والـ arabicCharactersString هي:
arabicCharactersString = 'اأإآىبتةثجحخدذرزسشصضطظعغ قكلمنهوؤيئء'..'؟!.،؛’"\''..'ًٌٍَُِّْ'
أنتظرك :)

ثامر أبو بلقيس
19-11-2014, 10:12 PM
أحسنت أخي هذا الحل موجه لحساب عدد المفردات " اللغة العربية"

سأعيد كتابة ما تفضلت به للاستفادة منه :
arabicCharactersString = 'اأإآىبتةثجحخدذرزسشصضطظعغ قكلمنهوؤيئء'..'؟!.،؛’"\''..'ًٌٍَُِّْ'
F=""
for w in string.gmatch (Input.GetText("Input1"),'['..arabicCharactersString..']+') do
F=F..#w/#w
end
result = Dialog.Message("Notice",#F);

مع ملاحظات سأكتبها في أقرب فرصة حول هذا الاستخلاص
بارك الله فيك:abc_138:

minomars
25-01-2015, 12:39 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

ربيع
15-07-2015, 10:30 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .