أبارك للفائز الجائزة وأنا استفد بأن اطلعت على السؤال والأجوبة وإن لم أشارككم..
فلسطين الزاهية بألوان الحب والسلام
ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها
تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين
أبارك للفائز الجائزة وأنا استفد بأن اطلعت على السؤال والأجوبة وإن لم أشارككم..
فلسطين الزاهية بألوان الحب والسلام
ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها
تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين
فالنتجاوز هذا السؤال أخواني فقد أنهاه أستاذنا الكبير رغيد بالضربة القاضية، ولكنني كنت آمل من أخي crazy-man أن يجبر بخاطري بجائزة الترضية على الأقل بسبب سرعتي في إجابته :angry:
كما أسلفت، سأغيب عنكم لمدة عشرة أيام منذ الغد، ولكنني أعدكم بأن أحاول أن أدخل وأشارككم هذه الدروس الرائعة ولكن عن طريق كمبيوتر لن يكون عليه الفيجوال ستديو... سأحاول ذلكلأن السؤال القادم سيطرحه أخونا وأستاذنا رغيد.
اقتباسالمهم إنت هربان على فين أوعى تكون رايح اليابان
نحن في اليابان يا نحرواي وأنا أهرب منها إليكم حبيبي، أهرب منها ومن غربة كتبت علينا... والعشرة الأيام ستكون لي في بيت زوجتي حيث سآخذها هناك لكونها في آخر أيام حملها (أطعمنا وإياكم الذرية الصالحة).
أرجوك أخي رغيد بأن تضع سؤالك فنحن إنتهينا من سؤال هذا الإسبوع.
بحفظ الله جميعاً.
Learn Japanese :>>> http://www.nouben.com/
ما شاء الله
رزقك الله الذرية الصالحة التي تقر بها عينك (يا أبا محمد :D )
اعتذر بشدة لcrazy man ......
نسيت تماماً وضع سؤالك ..
و بالمناسبة أوجه الشكر الجزيل لرغيد الرائع على هذا المجهود الأكثر من رائع هنا..
من ديوان الشاعر السي شاربي "معتز شمس"اقتباسالـ VB هى الأساس ... بتبرمج بيها بالاحساسولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس
راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص
الـ VB هى التراث ... للذكور والايناث :D
الـ VB لغة عريقه ... حتى اسأل Anwarica
السلام عليكم
رزقك الله الذرية الصالحة HMS .
لكن نريد صورة للمولد , :rolleyes:
" اللهم لاسهل إلا ماجعلته سهلاً وأنت تجعل الحزن إذا شئت سهلاً "

-------------------
MSN Messenger : nontop@gmail.com
Happy coding
-------------------
بسم الله الرحمن الرحيم
أخي العزيز Undo ما في مشكل المهم طرح السؤال و أجيب عليه و عمت الفائدة و الحمد لله بفضل أستادنا رغيد
اما بالنسبة للأخ هارون فنطلب من الله عز و جل أن يرزقه ولدا او بنتا تقر عينه به
و أنا لن أستطيع مشاركتكم في الأسئلة المقبلة لأن الدراسة بدأت و أنا أدرس في مديتة غير المدينة التي أسكن فيها و لا يوجد عندي فيجوال دوت نت :s
بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله وبركاته
الأخوة جميعاً اعتذر وبشدة عن الغياب غير المتعمد نتيجة للإنشغال و اتمنى اللتماس العذر منكم جميعاً ... اريد اولاً ان ابين ان اجابة الأخ هارون هي إجابة موفقة بإذن الله و انه الوحيد الذي اجاب على السؤال وكما اسلفت مشاركتي هي مجرد مناقشات بينما تحفظ حقوق الفوز في المنافسة لبقية الشباب ... و لا انسى هنا ان اسأل الله تعالى أن يعيدك الى ارضك عزيزي هارون سالماً غانم بإذنه تعالى و ان يرزقك الذرية الصالحة وجعلك وذريتك من مقيمي الصلاة بإذنه تعالى :
{ رَبِّ اجْعَلْنِي مُقِيمَ الصَّلاَةِ وَمِن ذُرِّيَّتِي رَبَّنَا وَتَقَبَّلْ دُعَاء }
وبما ان وضع السؤال مطلوب مني و لايحظرني الآن الكثير ... غير اني اتذكر سؤال طرحه احد الاشخاص علي قديماً وهو :
نريد ان نعمل دالة صيغتها بهذا الشكل :
Function Repeat(ByVal Word As String, ByVal Count As Integer) As String End Function
بحيث انك اذا استدعيت الدالة بالشكل التالي :
Dim S As String
S = Repeat("Rgheed", 5)يكون الناتج هو :
S = "Rgheed0,Rgheed1,Rgheed2,Rgheed3,Rgheed4,Rgheed5"
و اذا استدعيتها بالشكل :
Dim S As String
S = Repeat("Rgheed", 10000)يكون الناتج هو :
S = "Rgheed0,Rgheed1,Rgheed2,Rgheed3, ........ ,Rgheed9998,Rgheed9999,Rgheed10000"
أي انه يبدا الترقيم من 0 و إلى الرقم الذي حددته بالمدخل Count فتقوم الدالة بارجاع سلسلة نصية بها تكرار للكلمة Word ملحوقة برقم متسلسل ينتهي بما حددته انت.
الغرض من السؤال ليس الفوز بالقدر الذي نهدف فيه الى تحسين اداء شفراتنا بحيث تقوم بالعمل باسرع وقت ممكن لاحظ ان طول الشفرة لايهمنا في شيء بالقدر الذي يهمنا فيه سرعة الاداء كما انا استخدام جميع الطرق مسموح به المهم هو الخروج بدالة تكون سريعة الى اقصى حد ممكن خاصة اذا استخدمنا ارقام كبيرة للمدخل Count.
اجابتان او ثلاث ثم نقوم بتحليل الكود مع بعضنا البعض بإذن الله تعالى.
اتمنى للجميع التوفيق .
السلام عليكم و رحمة الله وبركاته
مواضيع برمجية تقنية جديدة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج للبحث في الملفات ومحتواياتها (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
مواضيع برمجية تقنية قديمة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
السلام عليكم ..
تحياتي الى جميع الاخوه .. و حياك الله اخي رغيد .. هذه محاولتي لحل السؤال الذي طرحته (مع العلم ان هذا رابع يوم لي منذ ان بدأت بتعلم VB.Net ) .. :)
بنت اليمن ،،
لا اله الا الله .. محمد رسول الله
(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)
يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين
السلام عليكم
هاتات دالتان لا أظن أنهما سترقيان إلى مستوى الحل
Function Repeat(ByVal Word As String, ByVal Count As Integer) As String If Count < 1 Or Word = "" Then Return "Can Not Repeat !!" Exit Function End If Dim RetVal As String Dim MyList As ArrayList = ArrayList.Repeat(Word, Count) Dim Idx As Integer = 0 Dim MyEnumerator As Collections.IEnumerator = MyList.GetEnumerator() While MyEnumerator.MoveNext() Idx += 1 RetVal += MyEnumerator.Current & Idx & "," End While RetVal = RetVal.Substring(0, RetVal.Length - 1) Return RetVal End Function
Function Repeat(ByVal Word As String, ByVal Count As Integer) As String If Count < 1 Or Word = "" Then Return "Can Not Repeat !!" Exit Function End If Dim RetVal As String For i As Integer = 1 To Count RetVal += Word & i & "," Next RetVal = RetVal.Substring(0, RetVal.Length - 1) Return RetVal End Function
وفق الله الجميع
بسم الله الرحمن الرحيم
أهلا بك أستاذ رغيد و قد سعدنا لطرحك السؤال لكن يبدو أني دخلت متأخرا و رغم ذلك فأنا لم أقرأ أيا من الأجوبة المطروحة قبل محاولتي حل السؤال و هذه أجابتي :
Function Repeat(ByVal Word As String, ByVal Count As Integer) As String Dim I As Integer For I = 0 To Count Repeat = Repeat & Word & I & "|" Next End Function
و شكرا :D
تم تعديل هذه المشاركة بواسطة crazy-man في 23 فبراير 2005 في 18:24
السلام عليكم ,,
اخي crazy-man ... لقد كان حالي مقارب جداً لحلك .. و لكن خذ بالك انه في كودك سوف يطبع في اخر مرة | (اي بعد اخر مرة يطبع فيها الكلمة ،،)....
بنت اليمن ،،
لا اله الا الله .. محمد رسول الله
(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)
يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين
أخواني، وكما وعدتكم سأكون معكم بقدر المستطاع،ولكن للأسف لا أملك الفيجوال ستديو على جهازي الحالي حتى أجرب إقتراحي:
ألا نستطيع إستخدام StringBuilder في حل المسألة؟ إظن بأن ذلك سيخلق كوداً سريعا.
أختي "بنت اليمن"، يا أهلاً وسهلاً بك في عالم الفيجوال بيسك نيت، هل يعمل الفيجوال ستديو معك بشكل جيد؟؟ أغبطك على مشاركتك (التي لم أراها)، أنا في اليوم الرابع على ما أظن كنت أحاول أن أبدا مشروع جديد (كانت تلك معضلة بالنسبة لي)، والمعضلة الثانية كانت كيف أغير لون ال Label...
Learn Japanese :>>> http://www.nouben.com/
أختي بنت اليمن مرحبا بكي بين مبرمجي الدوت نت :D
بالنسبة لكودك في الحقيقة لم يتسنى لي فتحه و سوف احاول ذلك قريبا أما ملاحظتك فهي في محلها لكن أنا أظن أن ذلك لن يؤثر على الكود و يمكن تلافيه بكود لا يتجاوز السطر و شكرا
السلام عليكم ،،
اخي HMS اشكرك على الترحيب (هذا شيء فعلاً مشجع :) ) .. و نعم يعمل الفيجوال ستديو بشكل ممتاز و لم يسبب لي اي بطء في الجهاز (لقد كنت اخطط لان اقطع جزء من راتب الشهر المقبل لشراء شريحة رام لكن الله لطف :wacko: ) ....
اقتباسأغبطك على مشاركتك (التي لم أراها)، أنا في اليوم الرابع على ما أظن كنت أحاول أن أبدا مشروع جديد (كانت تلك معضلة بالنسبة لي)، والمعضلة الثانية كانت كيف أغير لون ال Label...
كلمات متواضعة جداً منك اخي الخبير .. و لكن دعني افرح بها الآن و افكر بأن لا اصاب بالغرور لاحقاً (h) .. (السر يكمن اني كنت مستخدمة لـ VB على مدى اكثر من عام ...) ،،
اخي crazy-man ..
.. اشكرك فعلاً على الترحيب ،، و بالنسبة للمشكلة فلقد تجاوزتها بإستخدام 3 اسطر .. ما رأيك ان ترى الكود اولاً ثم نرى كيف من الممكن نجعله افضل ؟؟؟ .. فهو يشبه على حد كبير ما قمت بطرحه ..اقتباسمرحبا بكي بين مبرمجي الدوت نت
بنت اليمن ،،
لا اله الا الله .. محمد رسول الله
(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)
يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين
السلام عليكم ..
لقد عملت تعديل بسيط على الكود ، و سيكون شكل الدالة على النحو التالي :
Function RepeatString(ByVal word As String, ByVal count As Integer) As String Dim i As Integer For i = 0 To count RepeatString = RepeatString + word + CStr(i) RepeatString = IIf(i <> count, RepeatString + ",", RepeatString) Next End Function
و اليكم البرنامج مرفق مرة اخرى بعد التعديل ،،
بنت اليمن ،،
لا اله الا الله .. محمد رسول الله
(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)
يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين
السلام عليكم
صباح الخير ،
HMS لا تنسى الطلب B)
بنت اليمن اهلا وسهلا بك ، ما شاء الله بداية جيدة :lol:
وهذا الكود ولكن على عجالة
Function Repeat(ByVal Word As String, ByVal Count As Integer) As String If Word = "" Or Count < 0 Then Return "Error" Else Dim i As Integer Dim s As String = Word Word = "" For i = 0 To Count - 1 Word &= s & i & "," Next Return Word & s & i End If End Function
وعليكم السلام ورحمه الله
تم تعديل هذه المشاركة بواسطة Non-top في 24 فبراير 2005 في 06:13
" اللهم لاسهل إلا ماجعلته سهلاً وأنت تجعل الحزن إذا شئت سهلاً "

-------------------
MSN Messenger : nontop@gmail.com
Happy coding
-------------------
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته ...
أولاً : أريد أن أشيد بهذه الجهود التي تبذلونها والتي تحفز الأعضاء على التفكير في الحل المناسب للسؤال المطروح ..
ثانيًا :
أتمنى أن أكون قد أصبت في حل السؤال الذي طرحه الأستاذ رغيد ...
وهذا هو كود الدالة المتواضعة التي خطرت ببالي قبل قليل :
Function Repeat(ByVal word As String, ByVal count As Integer) As String If count <= 0 OrElse word = vbNullString Then Exit Function Dim strString(count - 1) As String Dim Pos As Long For Pos = 0 To count - 1 strString(Pos) = word & Pos + 1 Next Return Join(strString, ",") End Function
والسلام عليكم ورحمة الله وبركاته
وصلى الله على نبينا محمد وعلى آله وصحبه أجمعين
سبحان الله وبحمده ... سبحان الله العظيم
أين الأستاذ رغيد الطيب ؟
بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله وبركاته
اعتذر من الجميع عن تأخير كوني إنشغلت قليلا ... و اما بالنسبة للأكواد التي وضعها الأخوة فهيا جميعاً رائعة وتستحق الشكر و الإشادة بها ... وعلى الرغم من كوني لم اجرب فحص اداء كل هذه الاكواد غير اني يمكنني ان اقول ان اسرعها سيكون بإذن الله تعالى هما مقترحا الاخ العزيز هارون و المبرمج احمد و هما متكافئان نسبيا ... و هما الاجابتان اللتان فكرت فيهما عند وضع السؤال و طريقة الاخ أحمد هي الطريقة التي كنت اعتمدها عند إستخدامي للـ VB6 و اما طريقة هارون فهي التي ينبغي أن يستخدمها مبرمجي الـ NET. عند التعامل من إنشاء سلاسل نصية كبيرة ... ولكي يرى بقية الاخوة كيف يمكن ان نستخدم الـ StringBuilder الأخ هارون HMS في أن اضع تصور بسيط لإستخدام الأمر في دالتنا المنشودة :
Function RepeatStr(ByVal Word As String, ByVal Count As Integer) As String Dim sb As New System.Text.StringBuilder Dim st As String For I As Integer = 0 To Count sb.Append( Word + I.ToString + "," ) Next st = sb.ToString Return st.Substring(0, st.Length - 1) End Function
و بالنسبة لكود الأخ العزيز أحمد هو ايضاً يمثل تصور سريع للحل ( يوجد بعض الاخطاء الاملائية في الدالة يمكن إزالتها )... و تعد هاتان الإجابتان سليمتان .... و السؤال الآن الذي اتمنى ان يجيب عليه الجميع .. هو لماذا هاتان الدالتين سريعتين للغاية مقارنة بالدوال الاخرى الموضوعة كحل ؟ ... طبعاً الفرق في سرعة بين هاتين الدالتين من جهة وبقية الحلول المطروحة سيكون هائل جداً ( لم اختبر بعد ) غير ان هذا واضح جداً من اكواد الدالتين .. فما السبب في ذلك ؟
على العموم اضع الإجابة في الغد بإذن الله ... و اما بالنسبة لكود الأخت بنت اليمن فإني اتوقع ان يكون ابطىء الحلول ( و ليست ملامة ابداً خاصة و انني لم اكن استطيع ان اكتب جملة واحدة مفيدة في ايامي الاولى مع اللغة الجديدة ) ... و لأنني لا اشك في اننا كنا و لا نزال متعلمين في هذه اللغة فمن الجميل ان نتبادل الاراء و المقترحات هنا ..
و اقترح هنا لتسريع شفرة الاخت الفاضلة هو إزالة الشرط من داخل الدوران وذلك ان الدالة ستكون مجبرة على اجراء الاختبار في كل دورة بينما الفرصة الوحيدة للشرط كي يتنفذ هو في آخر دورة و بالتالي فجميع الاختبارات السابقة للشرط تكون غير مجدية ... و يمكن ان يزاح الشرط الى خارج الدوران و بالتالي ينفد مرة واحد فقط لإزالة الفاصلة الأخيرة ( الغير مرغوب فيها ) ... كما اني انصح بعدم إستخدام اكثر من إشارة مساوة لنفس المتغير داخل كل دوران وذلك ان عدد المرات التي سيتم فيها تعيين قيمة جديدة للمتغير النصي سيتضاعف بتضاعف عدد إشرة المساوة (=) في الدروان وكل ذلك يعود سلباً على الاداء العام للدالة خاصة مع ازدياد القيمة Count ... و اتمنى بالفعل للجميع برمجة جميلة مع الـ Visual Basic .NET
السلام عليكم و رحمة الله وبركاته
مواضيع برمجية تقنية جديدة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج للبحث في الملفات ومحتواياتها (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
مواضيع برمجية تقنية قديمة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
وعليكم السلام ورحمة الله وبركاته
الأستاذ الفاضل رغيد
هل رأيت حلي المقدم وهو (أحد حلين)
Function Repeat(ByVal Word As String, ByVal Count As Integer) As String If Count < 1 Or Word = "" Then Return "Can Not Repeat !!" Exit Function End If Dim RetVal As String For i As Integer = 1 To Count RetVal += Word & i & "," Next RetVal = RetVal.Substring(0, RetVal.Length - 1) Return RetVal End Function
وبالرغم من احترامي الشديد
ولكن لي تساؤل
هل معنى هذا كلامك أن هذه العبارة
sb.Append( Word + I.ToString + "," )
أسرع من هذه
RetVal += Word & i & ","
لأن هذا هو الفرق الوحيد
إن لم يكن هناك فروق أخرى كتعريف متغيرات أكثر يمكن الاستغناء عنها فنحن هنا لم نستفد من ال StringBuilder في شيء أكثر من جعله مخزن مساوٍ تماماً لما يفعله ال String
جزاكم الله خيراً
بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله وبركاته
أخي العزيز النحراوي ... اصبت في عزيزي في كلامك بكون الفرق جداً جداً بسيط بين شفرتك و شفرة الاستاذ هارون كما تصورتها انا ( و اتمنى منه ان يقوم بوضع تصوره الفعلي إن كان يقصد طريقة أخرى في إستخدام الـ StringBuilder غير التي وضعتها انا بالنيابة عنه )
و كما قلت اخي الحبيب في كلا الكودين ( كودك و كود الاستاذ هارون ) الاختلاف فقط المخزن فهو يستخدم StringBuilder و انت تستخدم String غير أن إستخدام الـ StringBuilder سيجعله كما اتصور انا الآن ( و الله سبحانه أعلى و أعلم ) اسرع الحلول المطروحة.
و بإذن الله اعود مساءً واضع شرح وافي و مقارنة حقيقة بين جميع الأفكار المطروحة بإذن الله عزيزي ... فلا تحرمني دعائك اخي
السلام عليكم و رحمة الله وبركاته
مواضيع برمجية تقنية جديدة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج للبحث في الملفات ومحتواياتها (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
مواضيع برمجية تقنية قديمة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
السلام عليكم ،،
تحية طيبة اخي رغيد .. و اشكرك فعلاً على ملاحظتك التي هي في محلها فعلاً :
اقتباسهو إزالة الشرط من داخل الدوران وذلك ان الدالة ستكون مجبرة على اجراء الاختبار في كل دورة بينما الفرصة الوحيدة للشرط كي يتنفذ هو في آخر دورة و بالتالي فجميع الاختبارات السابقة للشرط تكون غير مجدية ...
فعلاً كلامك صحيح .. و عليه فإني سوف امرر الحلقة الى count-1 اي عدد المرات المطلوب تكرارها .. و بعد الخروج من الحلقة سوف اكرر اخر مرة الكلمة المطلوبة ... بدون استخدام اي شروط ..
لكن .. اعتقد انه لابد من شرح الفرق بين الـ String و الـ StringBuilder .. لاني من رأي الاخ محمد انه لا فرق و بين ما طرحنا و بين ما استخدمته في الـ StringBulider ..
عموماً تجربة مفيدة جداً .. و ارجوا ان لا نتوقف عن طرح مثل هذه الاسئلة الاسبوعية :) ..
تحياتي للجميع ،،
بنت اليمن ،،
لا اله الا الله .. محمد رسول الله
(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)
يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين
بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله وبركاته
الاخوة جميعا ... يبدو انني بالفعل اصبحت اتأخر كثيراً و لي فيكم رجاء بإللتماس العذر لأخيكم.
اولاً و قبل كل شيء اريد ان انقل شيء بسيط بدأت اشعر به وهو اني اصبحت ابدو وكأنني صاحب خبرة تخولني ان انتقذ شفرات الآخرين ! .. غير أني يعلم الله ربما اكون اقلكم علما و اجهلكم بخفايا السطور ... و لهذا انا هنا استزيد الله من فضله بعونكم بإذن الله تعالى، فأتعلم منكم ما جهلت و انقل اليكم ما علمت.
فالله الله بفهم حقيقة مناقشتنا و كون ما اقول اكثر عرضه للخطأ مما تقولون ... فلا يأخذن مني احداً في نفسه ... و لايحسبن اني اعيب ما كتبه من سطور برمجية ... فما هي إلا تلمحيات اطرحها لما رأيت منكم رغبة ... و انا اقل من اقيم احداً من الحاظرين.
و لتوضيح جوهر الفرق بين الاكواد المطروحة سنقوم بتقسيمها إلى اربع اصناف تبدو واضحة وهي :
الصنف الأول هو إستخدام StringBuilder وهو اسرعها للاخ العزيز هارون.
و الثاني هو إستخدام Join لمبرمجنا أحمد.
ثم إستخدام الـ String وهو الحل الذي اختاره معظمنا ( crazy و nonTop و محمد و بنت اليمن ).
و اخيراً إستخدام الـ ArrayList للعزيز النحراوي.
احب ان ابدأ بالحل التقليدي Normal وهو بإستخدام الـ String كمخزن مؤقت للناتج في كل دورة .. يعتبر هذا الحل هو حل كامل يجيب على السؤال و لا غبار عليه بإذن الله تعالى ... هو الحل الطبيعي الذي سنفكر فيه جميعنا عند الإجابة على تسؤال كهذا ... غير أننا نبحث عن تحسين الأداء العام للدالة الناتجة.
و من هنا يمكن القول انه يصلح للإجابة على السؤال غير انه لن يكون الأفضل ! ... فالسبب يعود إلى فهم الطريقة التي يتعامل معها المترجم JIT في كل دورة ... لاحظ معي الكود التالي :
Dim S As String For I As Integer = 1 To 100 S += "Test" + I.ToString + "," Next
في الدورة الاولى للكود السابق و عندما يكون الـ I=1 فإن الناتج سكيون ",S="Test1 وبالتالي فهو بطول 6 حروف ثم يلي ذلك في الدورة الثانية يكون ناتج العبارة :
"Test" + I.ToString + ","
هو سلسلة نصية جديدة ينشأها المترجم ثم يقوم بإضافتها الى المتغير السابق S نتيجة للسطر :
S += "Test" + I.ToString + ","
و بالتالي فإن هناك عمليتان تمت الاولى هي إنشاء السلسة النصية الجديدة و الثانية هي إضافتها إلى السلسلة تبعنا المسماه S وهذه العملية تتكرر بعدد الدورات التي سنقوم بها.
تكرار عملية الإنشاء و الإضافة المتكررة الى المتغير S لاتشكل أي خطر في الدروات الاولية نتيجة لحجم المتغير S الصغير مبدئياً ... و لكن المشكلة تكمن في الحالات التي يكون فيها عدد الدروات كبيراً خاصة مع التزايد المطرد لطول المتغير S حيث انه يزداد عدد المرات الي سيقوم فيها المعالج بإنشاء السلسلة النصية الجديدة ثم عملية إضافة إلى المتغير S الذي قد يصل طوله إلى عشرات او مئات الالوف من الاحرف ! ... وهذا لعدد كبير من المرات ... وهنا يزداد الضغط على المعالج فيعود ذلك سلباً على الاداء العام للدالة .... و يمكن اختبار ذلك في البرنامج المرفق في الإسفل بإذن الله.
وهنا تبرز فكرة العزيز النحراوي في الإعتماد على الـ ArrayList و كونها تحتوي على الطريقة Repeat التي استغلها إستغلال ممتاز في جعلها تقوم بعملية إنشاء نسخ مكررة من الكلمة Word بالشكل التالي :
Function RepeatMN1(ByVal Word As String, ByVal Count As Integer) As String Dim RetVal As String Dim MyList As ArrayList = ArrayList.Repeat(Word, Count) Dim Idx As Integer = 0 Dim MyEnumerator As Collections.IEnumerator = MyList.GetEnumerator() While MyEnumerator.MoveNext() RetVal += MyEnumerator.Current & Idx & "," Idx += 1 End While RetVal = RetVal.Substring(0, RetVal.Length - 1) Return RetVal End Function
وهذه الطريقة كانت ستفيد كثيراً اذا لم يكن من المطلوب هو إضافة ارقام متبوعة بفاصلة إلى كل كلمة لأنها ستقينا من الدخول في اي اوامر دوران ... ولكن المشكلة هي اننا ما زلنا بحاجة إلى بناء سلسلة نصية كاملة مكونة من كل كلمة خزنها في المتغير myList و بالتالي سنظطر للدوران فيه لإستخراج الكلمات التي خزنها مسبقا ثم نعود فنستخدم الـمتغير RetVal الذي هو من النوع String مرة اخرى وهذا سيضيف جهد مرة اخرى الى المعالج حيث سوف يضطر الى إنشاء سلاسل نصية جديدة و إسنادها الى المتغير RetVal مع تزايد حجمه المستمر ... بالإضافة الى المساحة المحجوزة للمتغير myList . و بالتالي فسوف تكون هذه الدالة بطيئة نسبياً.
غير انني يمكنني ان اضيف للفائدة و بما اننا ذكرنا الـ ArrayList بأنه يمكن ان نقوم بالدوران خلالها بالطرق الإعتيادية ( و التي ستكون أسرع قليلا ) بإستخدام For Each مثلا بالشكل التالي :
Function RepeatMN1(ByVal Word As String, ByVal Count As Integer) As String Dim RetVal As String Dim MyList As ArrayList = ArrayList.Repeat(Word, Count) Dim Idx As Integer = 0 For Each Item As String In MyList RetVal += Item + Idx.ToString + "," Idx += 1 Next RetVal = RetVal.Substring(0, RetVal.Length - 1) Return RetVal End Function
او بإستخدام الـ FOR فقط كالتالي :
Function RepeatMN1(ByVal Word As String, ByVal Count As Integer) As String Dim RetVal As String Dim MyList As ArrayList = ArrayList.Repeat(Word, Count) Dim Idx As Integer = 0 For Idx = 0 To MyList.Count - 1 RetVal += MyList(Idx) + Idx.ToString + "," Next RetVal = RetVal.Substring(0, RetVal.Length - 1) Return RetVal End Function
وما نخرج به هنا أن إضافة الـ ArrayList كان سيكون مفيداً جداً إن لم نرغب في إضافة ارقام الى الـ Word و لكن في حالتنا هذه فيمكننا ان نستغني عنها لتخفيف الضغط على الذاكرة غير المستغلة فيها و لتسريع الاداء قليلا فيصبح الحل كما جاء في الطريقة الثانية التي وضعتها اخي العزيز محمد.
و يمكننا الآن ان ننتقل للحل الرائع الذي طرحه اخونا العزيز المبرمج أحمد و نتعرف على الكيفية التي يخلصنا فيها من الضغط الكبير على المعالج .. وهو بعد تعديله قليلا ليتناسب مع المطلوب من السؤال :
Function RepeatAP1(ByVal Word As String, ByVal Count As Integer) As String Dim Arr(Count) As String Dim Str As String For Pos As Integer = 0 To Count Arr(Pos) = Word + Pos.ToString Next Str = Join(Arr, ",") Return Str.Substring(0, Str.Length - 1) End Function
هذا الحل مفيد جداً و كنت اعتمده بشكل كبير في الـ VB6 و السبب هو انه يقوم منذ بدأ العملية بحجز مساحة محددة من الذاكرة للمصفوفة :
Dim Arr(Count) As String
وهذا يريح المعالج من الإضافة المستمرة و المرهقة للحجم الكبير للمتغير S القديم ( الذي إستخدمناه في بداية نقاشنا ) حيث ان الإضافة التعديل ستكون لمتغيرات نصية صغيرة هي عناصر المصفوفة ثم وبعد هذه العمليات الغير مرهقة نسبياً يتم تجميع العناصر كلها ضربة واحدة في المتغير Str في السطر :
Str = Join(Arr, ",")
ويعني هذا انه تخلص من العمليات المتكررة على متغير ينمو حجمه بإطراد في كل دورة لعدد كبيرة من المرات ... و استبدلها بعمليات إنشاء لمتغيرات صغيرة مع معالجة واحدة كبيرة لإنشاء المتغير Str ... وهذا يؤدي الى خفظ الوقت المستهلك بشكل قد لا يتوقعه الكثيرين و يكفيني ان اقول انه خفض الوقت المستغرق في تكوين سلسلة للكلمة "Rgheed" لعدد 10000 مرة .... من زمن لا يقل عن 10 ثواني في احسن الظروف ( بالنسبة للدوال الاخرى ) الى وقت لا يتجاوز الـ 50 ملي ثانية أي حوالي 0.05 من الثانية .... و سيكون الفارق اكبر و التحسين اعظم اذا جربنا ارقام اكبر من 10000 مرة .
و الآن و بعد أن إنتقلنا بحمد الله تعالى الى برمجة الـ NET. فقد تم تزويد اللغة بالكائن StringBuilder وهو في فضاء الاسماء System.Text.StringBuilder ... ومن إسمه ( منشىء السلاسل النصية ) يمكننا إستنتاج وظيفته ... حيث انه يسرع عمليه إنشاء السلاسل النصية بشكل اكثر من كبير حيث يتحوي على مجموعة من الوظائف مثل Append و Insert وRemove و Replace وغيرها لإجراء العمليات المختلفة على النصوص دون أن يتم إنشاء كائن من النوع String اصلاً إلا مرة واحدة بعد إنتهائك من جميع العمليات التي تريدها على النص و ذلك عن طريق الأمر ToString وعندها فقط يتم خلق كائن من النوع String .... و عليه فإن كود كالتالي :
Function RepeatHMS(ByVal Word As String, ByVal Count As Integer) As String Dim SB As New System.Text.StringBuilder For I As Integer = 1 To Count SB.Append(Word + I.ToString + ",") Next Dim ST As String = SB.ToString Return ST.Substring(0, ST.Length - 1) End Function
يمكنه ان يسرع العلمية اكثر مما قد تتصور .. وذلك بسبب أن السطر :
SB.Append(Word + I.ToString + ",")
لايقوم بإسناد قيمة لمتغير نصي و إنما يقوم بتكوين السلسلة النصية الصغيرة المتكونة من مزج المتغيرات Word و I.ToString و الفاصلة ... ثم إضافتها الى المساحة التخزينية للكائن StringBuilder المسمى SB وهو عبارة عن مواضع في الذاكرة و ليس كائن String .. وهذا هو السر في سرعة الاداء.. و ينبغي للجميع التفكير الجدي في إستخدامه و التعود عليه خاصة عند الحاجة إلى إنشاء سلاسل نصية كبيرة.
طبعاً الاداء هنا اكثر من رائع و يكفيني ان اقول انه يمكن تكوين سلاسل كبيرة جداً بإداء معقول جداً جربت انا حوالي مليون دورة فأتمها في بضع ثواني لم تتجاوز الاربع بينما لا يمكنني التفكير حتى بتجربة هذا مع الطرق التقليدية سابقة الذكر و التي تعدى العشر ثواني بعدد دورات لم يتجاوز الـ 10000 دورة ! .... و لتسهيل عملية الأختبار وضعت على البرنامج البسيط المرفق و الموضوع في الشكل ادناه كي يسهل على الراغب في رؤية التأثيرات المختلفة واختبار الارقام التي تحلو له :
و قبل ان اذهب يمكنني ان اضيف انه يمكن تسريع العمل قليلا بتحديد حجم ( او مساحة ) المتغير النصي الذي نتوقع إنشائه عن بداية تعريف الـ StringBuilder بالشكل التالي :
بدلا عن Dim sb As New System.Text.StringBuilder() نستخدم Dim sb As New System.Text.StringBuilder( YOUR SIZE )
لاحظ العبارة YOUR SIZE و المقصود بها الحجم التي تتوقعه للمتغير النصي الذي تريد إنشائه ..... و لأنه في حالتنا هذه لا يمكنا توقع حجم المتغير النصي بطريقة مباشرة وسريعة ( خاصة وان حجم المتغير I يزداد بإستمرار ) فيمكننا على الاقل ان نعطي حجم افتراضي اولي يكون اكبر ولو بقليل من الحجم الاقصى الذي نتوقعه للمتغير .... يمكنني الان التفكير في معادلة مثل :
Dim max As Integer = (Word.Length + CInt(Floor(Log10(Count - 1))) + 2) * (Count + 1) Dim sb As New System.Text.StringBuilder(max + 1)
حيث ان المتغير max سيحتوي إن لم يكن إستنتاجي السريع السابق مخطئاً على القيمة العظمى للنص الناتج و الذي تعتمد على طول الكلمة Word وعدد مرات التكرار Count المطلوبة ... و على الرغم من أن هذا سوف يزيد سرعة الدالة بضعة عشرات من الملي ثانية إلا انه سيكون مفيداً عل ايه حال ان نذكره ... واذا رغب احد الحاظرين في تكوين كود يمكنه ان يحسب الطول الفعلي للنص الناتج قبل ان يقوم بتكوين النص فعلياً فإني على استعداد لذلك بإذن الله تعالى.
اي ان اقتراحي سيكون هو :
Private Function RepeatRTA(ByVal Word As String, ByVal Count As Integer) As String
Dim max As Integer = (Word.Length + CInt(Floor(Log10(Count - 1))) + 2) * (Count + 1)
Dim sb As New System.Text.StringBuilder(max + 1)
For I As Integer = 0 To Count
sb.Append(Word)
sb.Append(I.ToString)
sb.Append(","c)
Next
Dim st As String = sb.ToString
Return st.Substring(0, st.Length - 1)
End Functionثلاثة اقتراحات اخرى يمكنني اضافتهما هنا الاولى هي إستبدال السطر :
SB.Append(Word + I.ToString + ",")
بسطور مثل :
sb.Append(Word)
sb.Append(I.ToString)
sb.Append(","c)و الفائدة هنا تكمن في كوننا سنتخلص من إجبار المعالج على إنشاء سلسلة نصية في كل دروة ناتجة من مزج المتغيرات :
Word + I.ToString + ","
و سنجعله يقوم بإضافة المتغيرات كما هي بالترتيب الى المخزن المؤقت ( StringBuilder ) ... و بالتالي فإن الدالة ستصبح :
Private Function RepeatRTA(ByVal Word As String, ByVal Count As Integer) As String
Dim max As Integer = (Word.Length + CInt(Floor(Log10(Count - 1))) + 2) * (Count + 1)
Dim sb As New System.Text.StringBuilder(max + 1)
For I As Integer = 0 To Count
sb.Append(Word)
sb.Append(I.ToString)
sb.Append(","c)
Next
Dim st As String = sb.ToString
Return st.Substring(0, st.Length - 1)
End Functionوهذا التعديل قام فقط بإختصار عشرات الملي ثانية في دورات مقدارها مليون دورة ! ...
و الإقتراح الثاني : يكمن في محاولة التخلص من إجبار المعالج على إنشاء المتغير النصي الكبير في آخر الدالة و المسمى st بحيث نعدل الدالة كالتالي :
Private Function RepeatRTA(ByVal Word As String, ByVal Count As Integer) As String
Dim max As Integer = (Word.Length + CInt(Floor(Log10(Count - 1))) + 2) * (Count + 1)
Dim sb As New System.Text.StringBuilder(max + 1)
For I As Integer = 0 To Count - 1
sb.Append(Word)
sb.Append(I.ToString)
sb.Append(","c)
Next
sb.Append(Word)
sb.Append(Count.ToString)
Return sb.ToString
End Functionلاحظ ان جعلنا للدورات تنتهي بـ Count-1 ومن ثم إضافة الدورة الاخيرة جعلنا نتخلص من إنشاء متغير إضافي و من ثم إستخدام الـ SubString لإستبعاد الفاصلة غير المرغوب فيها منه ... وهذا الاقتراح ايضاً اضاف اختصاراً طفيفاً جدا للزمن المستغرق في الدالة ..
و الإقتراح الاخير يكمن في تقليل عدد مرات استدعاء الامر Append و الذي يتم إستدعائه لثلاث مرات في كل دورة و يمكن جعلها استدعائين فقط دون الحاجة إلى إنشاء متغير نصي جديد في كل دورة وذلك عن طريق إضافة الفاصلة إلى مقدمة المتغير Word ضمنياً و بدء الدروان بالواد بدلاً من الصفر كما يلي :
Private Function RepeatRTA(ByVal Word As String, ByVal Count As Integer) As String Dim max As Integer = (Word.Length + CInt(Floor(Log10(Count - 1))) + 2) * (Count + 1) Dim sb As New System.Text.StringBuilder(max + 1) sb.Append(Word + "0") Word = "," + Word For I As Integer = 1 To Count - 1 sb.Append(Word) sb.Append(I.ToString) Next sb.Append(Word) sb.Append(Count.ToString) Return sb.ToString End Function
اظن انني بالغت كثيراً في عمليات الاختصار التي لم تحقق مجتمعة سوى زيادة سرعة الدالة بمقدار ثانية ونصف فقط لعدد من الدورات مقدارة مليون دورة ... و الحقيقة ان الغرض لم يكن هذه الزيادة الطفيفة بالقدر الذي سعيت فيه لتوضيح ما الامور التي ينبغي التركيز عليها في الحالات التي يكون فيها تحسين الاداء العام ضرورة من الضرورات.
و يمكنك تجربة جميع الحلول في البرنامج المرفق بالإضافة إلى المقترحات التي ناقشناها هنا ... مع التنبيه لعدم تجربة اقرام كبيرة مع الدوال غير التي تظهر حولها دوائر حمراء في الصورة ... نتيجة لان الجهاز قد يعلق خاصة اذا كانت سرعته و ذاكرة الرام فيه محدودة كجهازي الشخصي.
اعتذر عن الإطالة و السلام عليكم و رحمة الله وبركاته
مواضيع برمجية تقنية جديدة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج للبحث في الملفات ومحتواياتها (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
مواضيع برمجية تقنية قديمة
----------------------------------------------------------------------------------------------------------------------------------------------
• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)
----------------------------------------------------------------------------------------------------------------------------------------------
• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)
----------------------------------------------------------------------------------------------------------------------------------------------
وعليكم السلام ورحمة الله وبركاته
أولاً : نبارك للفائز أخينا أحمد ، ثم أخينا هارون (لأنني أعتبره وضع فكرة فقط أما أحمد فقام بالتنفيذ)
ثانياً : نذكر الإخوة أن من سيضع السؤال القادم هو الفائز ، وأظنكم ترون معي أنه أخونا أحمد
ثالثاً : ورابعاً : وخامساً و.....
جزاك الله خيراً أستاذنا الفاضل رغيد نحسب والله حسيبك ولا نزكي عل الله أحداً أن لديك موهبة من الله في تتبع الأمور وتوضيحها وإجلاء الغبار من عليها
فبارك الله لك أخي الكريم
ناتي للموضوع : بالفعل بعد الشرح السابق يتبين لي أن الكود الذي وضعته لا يصلح لهذه المسابقة ، وأصدقكم القول لقد كان في نفسي شيء ، فأنا أول ما قرأت السؤال فكرت وقلت الحل البديهي هو عمل دورة وتخزين القيم في متغير نصي ، ثم قلت لنفسي ما الذي يبطيء عمل البرنامج عند تنفيذ هذه الفكرة ، فوجدت أنها الدورة ، وهنا فكرت في تجربة ArrayList وبعد تجربة بسيطة تبين لي ما قاله أخونا الحبيب رغيد
اقتباسوما نخرج به هنا أن إضافة الـ ArrayList كان سيكون مفيداً جداً إن لم نرغب في إضافة ارقام الى الـ Word و لكن في حالتنا هذه فيمكننا ان نستغني عنها لتخفيف الضغط على الذاكرة غير المستغلة فيها و لتسريع الاداء قليلا
ولكني أحببت وضع الكود رغم أني أعلم أنه دون المستوى (قلت زيادة الخير خيرين :) )
ثم فكرت ما الحل الأمثل إذاً ففكرت في الطريقة الأولى وأيضاً فكرت في StringBuilder ولكن ولجهلي الشديد ظننت أن الامر متساوٍ ...
وهذا هو الخطأ القاتل للمبرمج ليس على مستوى هذه المسألة ولكن عموماً ، فالمبرمج لا يجب ان يظن بل يجب أن يجرب وهذا ما لم أفعله
والحمد لله .. فقد استفدت كثيراً من حلول إخواني الأحبة فجزاهم الله خيراً
هل أخبركم بأمر :rolleyes: (سر)
هذا الموضوع خاصة أشعر فيه بروح الإخوة بيني وبين إخواني
أطلت عليكم ، وفقكم الله تعالى والسلام عليكم ورحمة الله
شرح متميز اخي رغيد ،، و اعتقد الآن ان الفائدة عمت ،،و انه تم تحقيق الهدف من هذه الموضوع (وضع الحلول و المناقشة للوصول الى الحل الافضل) ، مبروك للفائزين :) و انا في انتظار سؤال الاسبوع القادم ...
بنت اليمن ،،
لا اله الا الله .. محمد رسول الله
(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)
يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين
هذا الموضوع مغلق.
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…