اذهب إلى المحتوى

مصطفى القباني

الأعضاء
  • المساهمات

    89
  • تاريخ الانضمام

  • تاريخ آخر زيارة

كل منشورات العضو مصطفى القباني

  1. لاحظ أن عند كون قيمة الرقم 2 وكذلك الفاكتور 2، لن يتم الدخول في الloop الداخلية من الأساس، لأن الشرط في الloop هو: for (let factor = 2; factor < number; factor++) الشرط هنا أن يكون factor أقل من number، وهو غير متحقق، لذلك لن يتم الدخول في الloop الداخلية في الحالة التي ذكرتها، وسيتم عمل console.log للرقم 2 على أنه prime، لأن قيمة isPrime مازالت true.
  2. تحياتي بالنسبة لdiff هي أداة لتوضيح الفرق بين ملفين، ويتم إستدعائها كالآتي: diff filename1 filename2 ويمكن إضافة -u عند إستدعائها كالآتي: diff -u filename1 filename2 في كلا الحالتين يتم توضيح الإختلاف بين الملفين، ولكن يكون التنسيق مختلف، فعند إضافة ال-u يتم طباعة الإختلاف بشكل يسمى بالunified format وهي فقط طريقة مختلفة لتوضيح الإختلاف بين الملفين. مثال توضيحي، إذا كان لدينا ملفين first_file.txt ومحتوياته هي: first line second line third line وملف آخر اسمه second_file.txt ومحتوياته هي: first line second line عند إستخدام diff first_file.txt second_file.txt يكون الناتج هو: وعند إستخدام diff -u first_file.txt second_file.txt يكون الناتج هو: بالنسبة لvimdiff، فإن vim هو text editor، يوفر الكثير من الأدوات التي تسهل على المبرمجين، إحدى هذه الأدوات هي أداة vimdiff وهي تستخدم أيضاً لتوضيح الإختلاف بين الملفات. يتم إستدعائها كالآتي: vimdiff first_file.txt second_file.txt ويكون المخرجات هي: بالنسبة لإشارة < و إشارة > ، يتم إستخدامهم لإعادة توجيه المخرجات والمدخلات. مثلا عند إستخدام الأمر الآتي مع diff: diff first_file.txt second_file.txt > diff.txt يتم إعادة توجيه المخرجات إلى الملف diff.txt يمكنك القراءة عن إعادة التوجيه في موسوعة حسوب من هنا. بالنسبة للregex في المثال: re.search(r"^[a-zA-Z] ", "this is a sentence with spaces.") الregex string المطلوب البحث عنه أوله ^ أي أن يجب أن يطابق الحرف التالي البداية، ثم حرف واحد من الأبجدية a-zA-Z ثم مسافة. ستكون نتيجة البحث السابق فارغة، لأن الجملة التي يتم البحث فيها أولها ليس حرف متبوع بمسافة. بالنسبة ل: re.search(r"py[a-z] *n", "Python Porgramming."): يتم البحث عن الحرفين py متبوعين بحرف من الأبجدية من a-z متبوعة بمسافة إختيارية أو أكثر متبوعة بحرف n. أيضاً ستكون نتيجة البحيث فارغة لأن ما يتم البحث عنه غير موجود بالstring. ربما كان القصد هو الآتي: re.search(r"Py[a-z]*n", "Python Porgramming.") وقتها ستكون نتيجة البحث هي Python لأن بالفعل Py جائت متبوعة بحروف من الأبجدية بعدد صفر أو أكثر من مرة، متبوعة بحرف n. بالنسبة ل: re.search(r"o+L+", "goldfish.") يتم البحث عن الحرف o مرة واحدة أو أكثر متبوع بحرف L كابيتال مرة واحدة أو أكثر، وستكون نتيجة البحث فارغة لأنه لا يوجد مطابقة. لكن إذا تم تغيير حرف الL إلى l ستتم المطابقة لol بالنسبة ل: re.findall(r"[a-zA-Z]{5} ", "a scary ghost appeared") يتم البحث عن عدد 5 حروف من حروف الأبجدية سواء الكابيتال أو السمول متبوعة بمسافة، بالتالي يتم إرجاع ghost و scary. بالتوفيق.
  3. يمكن عمل المطلوب بإستخدام الlist comprehension كالتالي: l = ['p','q'] n = 5 answer = [letter + str(i) for i in range(1,n+1) for letter in l] print(answer) الlist comprehension أو تكوين القوائم، هي طريقة لتكوين lists في بايثون بطريقة كتابة مختصرة. يمكنك القراءة أكثر عن list comprehension في موسوعة حسوب من هنا.
  4. يمكن التحقق عن طريق الكود التالي: lst1 = [3,5,6,8,7] lst2 = [3,6] def is_in(lst1,lst2): for element in lst2: if element not in lst1: return False return True print(is_in(lst1,lst2)) قمنا بتعريف الدالة is_in والتي تقوم بالرجوع مبكراً بالقيمة False في حالة أن أحد قيم القائمة الثانية غير موجود في القائمة الأولى. وتقوم بإرجاع True إذا تم المرور على كل العناصر.
  5. بالنسبة ل sys.argv يمكنك فهم ما تقوم بعمله من خلال الجزء الأول من هذا الرد. و $1 هنا هو نفس الإستخدام بالنسبة للbash script. هذه هي طريقة الوصول إلى ما تم تمريره من مدخلات عند إستدعاء الscript. فمثلاً إذا أردت عمل script تقوم بتعديل اسم ملف، وتريد أن تستخدمها بأن تستدعيها وتمرر لها اسم الملف القديم واسم الملف الجديد، أي أنك تريد إستدعائها كالآتي: rename.sh old_name new_name هنا تم تمرير old_name وnew_name للسكريبت، وعند كتابة الكود للوصول إليهم يمكن الوصول إليهم كالآتي: x = $1 y = $2 وسيكون قيمة x مساوية لأول مدخل معطى للسكريبت أي سيكون "old_name" وستكون قيمة y مساوية للمعطى الثاني وهو new_name.
  6. تحياتي السطر الأول: #!/bin/bash تعرف العلامة #! باسم ال'shabang' وتستخدم في أنظمة التشغيل linux لتحديد البرنامج الذي سيقوم بتشغيل الscript، ويتم تمرير الscript كمدخلات إلى هذا البرنامج. في هذه الحالة عند تشغيل الملف الذي لدينا، سيقوم نظام التشغيل بإستخدام /bin/bash وإعطاء الكود الموجود في الscript كinput لهذا البرنامج. ومثلاً إذا كان الshabang متبوعاً ب/bin/python سيقوم نظام التشغيل بتشغيل الscript داخل بايثون. n=0 تم تعريف متغير n ومساوته بالصفر. command=$1 يعرف $1 باسم الpositional parameters وهو ما تم تمريره إلى السكريبت، وهو مشابه لsys.argv في بايثون. على سبيل المثال إذا كان لديك script بهذا الشكل واسمها script.sh: command=$1 command2=$2 echo $command echo $command2 وقمت بإستدعاءها كالآتي: script.sh arg1 arg2 سيتم طباعة arg1 arg2 وهو ما تم تمريرهم إلى الscript. بالتالي في الكود الخاص بك قمنا بوضع أول قيمة تم تمريرها عند إستدعاء الscript في المتغير command. while ! $command && [ $n -le 5 ]; do يتم عمل loop تقوم بالإستمرار في حالتين، لفهم الحالتين يجب توضيح الآتي: ! $command عند كتابة ! متبوعاً بأمر، يتم تنفيذ آخر أمر تم تنفيذه من الhistory. مثلا: !ls سيقوم بتنفيذ آخر أمر ls موجود بالhistory. أيضاً هناك نقطة هامة لفهم عمل الloop، وهو في نظام تشغيل لينكس، الأمر الناجح يقوم بإرجاع القيمة 0 ، بينما الأمر الغير ناجح يرجع قيمة لا تساوي الصفر. لذلك عند إستخدام أمر ما كشرط في الloop، فإن الloop يتم الخروج منها عند تنفيذ الأمر بنجاح، بينما تستمر الloop إذا كان الأمر غير ناجح. [ $n -le 5 ] هنا le تعني less than or equal، أي أن الشرط هنا أن تكون n أقل من أو تساوي 5. sleep $n ((n=n+1)) echo "Retry #$n" done; الأمر sleep يقوم بعمل إنتظار لعدد معين من الثواني. إذا الكود ككل يقوم بعمل الآتي: يتم تمرير أمر ما إلى الscript، ويتم تخزين هذا الأمر في متغير يدعى command، ويتم تعريف متغير n ومساوته بالصفر. ثم يتم عمل loop يتم الخروج منها إذا تم تنفيذ الأمر بنجاح، ويتم الإستمرار فيها بينما الأمر به خطأ وn أقل من أول تساوي 5. وفي اللوب يتم التأخير بعدد n من الثواني ، ثم زيادة n، وطباعة الجملة Retry.
  7. تحياتي المطلوب هو تعريف الmethods للصنف Line. يمكن عمل المطلوب بوضع التالي في ملف Line.cpp : #include <cmath> #include "Line.h" Line::Line(double x1, double y1, double x2, double y2) { Line::x1 = x1; Line::x2 = x2; Line::y1 = y1; Line::y2 = y2; } double Line::getStartX() { return x1; } double Line::getStartY() { return y1; } double Line::getEndX() { return x2; } double Line::getEndY() { return y2; } double Line::getSlope() { return (y2 - y1) / (x2 - x1); } bool Line::isVertical() { return ((x2 - x1) == 0); } bool Line::isHorizontal() { return ((y2 - y1) == 0); } bool Line::isThroughOrigin() { return (x1 * (y2 - y1) == y1 * (x2 - x1)); } void Line::mirror(int axis) { double slope = getSlope(); double new_slope = -slope; if (isVertical() && axis >= 0) y2 = y1 - (y2 - y1); else if (isHorizontal() && axis < 0) x2 = x1 - (x2 - x1); else { if (axis >= 0) y2 = y1 + new_slope * (x2 - x1); else x2 = x1 + ((y2 - y1) / new_slope); } } شرح الدوال: بالنسبة للLine::Line هو الconstructor ويأخذ x1 و y1 وx2 وy2. بالنسبة ل getStartX getStartY getEndX getEndY يقومو بإرجاع النقاط الأربعة x1 y1 x2 y2 بالترتيب. بالنسبة لgetSlope تقوم بإرجاع ميل الخط المستقيم، ويتم حسابه من معادلة الميل: بالنسبة ل isVertical isHorizontal تقوم بالتحقق إذا كان الخط أفقي أو رأسي. ويتم التحقق من ذلك من خلال الكشف إذا كان x2 -x1 مساوي للصفر في حالة الكشف عن إذا كان الخط رأسي، وإذا كان y2 - y1 مساوي للصفر في حالة إذا كان الخط أفقي. بالنسبة ل isThroughOrigin تقوم بالتحقق إذا كان الخط يمر بنقطة الأصل (0،0)، ويتم ذلك عن طريق التحقق إذا كان (x1 * (y2 - y1) == y1 * (x2 - x1)) . بالنسبة ل mirror تأخذ متغير axis وتقوم بعمل إنعكاس للخط حول المحور الأفقي إذا كانت axis أكبر من أو تساوي للصفر، أو المحور الرأسي إذا كانت axis أقل من الصفر. وحسب المطلوب فإن الإنعكاس لا يغير نقطة البداية x1 y1 ولكن يغير نقطة النهاية فقط، مع ملاحظة أن إذا كان الإنعكاس حول المحور الأفقي فإن x1 y1 x2 لا يتغيروا، ويتغير فقط y2. وبالمثل إذا كان الإنعكاس حول المحور الرأسي فإن x1 y1 y2 لا يتغيروا، ويتغير فقط x2. ولاحظ أيضاً أنه عند عمل الإنعكاس، فإن الميل للخط المستقيم يتغير للسالب، مثلاً إذا كان ميل الخط 5 يصبح -5 وهكذا. وبالتالي يمكن معرفة النقطة الناقصة بالتعويض في معادلة الميل مع إضافة إشارة سالبة للميل وبالمثل لحساب x2. هناك نقطتين أخرتين يجب مراعاتهم في هذه الدالة، وهي أن التعويض في معادلة الميل سيعطي خطأ في حالة أن الخط أفقي أو رأسي، بسبب أن ميل الخط الأفقي = 0 ، والرأسي ميله لا نهاية، بالتالي يتم حساب نقطة النهاية بدون التعويض في القانون ولكن بإستخدام : y2 = y1 - (y2 - y1); في حالة الخط الرأسي. و باستخدام: x2 = x1 - (x2 - x1); في حالة الخط الافقي. بالتوفيق.
  8. يمكن عمل المطلوب كالآتي: #include <iostream> using namespace std; void Multiply(const int[], const int[][3], int[], int); int main(){ int n; cin >> n; int v_array[n]; int m_array[n][3]; int o_array[3]; for (int i=0; i<n; i++) cin >> v_array[i]; for (int i=0; i<n; i++) for(int j=0; j<3; j++) cin >> m_array[i][j]; Multiply(v_array,m_array,o_array,n); for(int j=0; j<3; j++) cout<<o_array[j]<<" "; return 0; } void Multiply(const int v_arr[], const int m_arr[][3], int o_arr[], int size){ int current_sum; for (int i=0; i<3; i++){ current_sum = 0; for(int j=0;j<size;j++){ current_sum += v_arr[j] * m_arr[j][i]; } o_arr[i] = current_sum; } } المطلوب هو تعريف دالة Multiply والتي تقوم بضرب متجه من الحجم 1 * ن في مصفوفة من الحجم ن * 3. شرط الضرب للمصفوفات في هذه الحالة دائماً متحقق، وشرط الضرب هو أن عدد أعمدة المصفوفة الأولى تساوي عدد صفوف المصفوفة الثانية. وهو دائماً متحقق لأن حجم المتجه هو 1 * ن أي أن عدد أعمدته تساوي ن ، وحجم المصفوفة هو ن*3 ، أي أن عدد الصفوف تساوي ن. بالتالي عدد أعمدة المتجه الأول مساوي لعدد صفوف المصفوفة، بالتالي يمكن ضربهم. تتم عملية الضرب في loop التالية بضرب المتجه في كل عمود للمصفوفة، وينتج عن عملية الضرب العنصر المناظر في المتجه الناتج. int current_sum; for (int i=0; i<3; i++){ current_sum = 0; for(int j=0;j<size;j++){ current_sum += v_arr[j] * m_arr[j][i]; } o_arr[i] = current_sum; } يمكنك تجربة الكود كامل من هنا.
  9. يمكن عمل المطلوب كالآتي: #include <iostream> using namespace std; int minimumNumberOfSteps(int n, int count){ if (n==1){ return count; } else if(n%3 == 0){ return minimumNumberOfSteps(n/3, count+1); } else if(n%2 == 0){ return minimumNumberOfSteps(n/2, count+1); } else{ return minimumNumberOfSteps(n-1, count+1); } } int main() { int n; cout<<"Please enter n"; cin >> n; int answer = minimumNumberOfSteps(n,0); cout<< answer << endl; return 0; } في الدالة المعرفة تستخدم الrecursion مثل المطلوب وتأخذ متغيرين هما العدد n، وعدد الخطوات التي تم عملها count حتى الآن، وتطبق الأربع حالات المعطاه وهي: إذا كانت قيمة n مساوية للواحد نقوم بإرجاع عدد الخطوات التي تم عملها للوصول. إذا كانت n تقبل القسمة على ثلاثة، نقوم بإستدعاء الدالة مع إستبدال n بn/3 وإضافة واحد لعدد الخطوات count. إذا كانت n تقبل القسمة على اثنان أي انها عدد زوجي، نقوم بإستدعاء الدالة مع إستبدال n بn/2 وإضافة واحد لعدد الخطوات count. إذا كانت n لا تقبل القسمة على 2 أو ثلاثة، نقوم بإستدعاء الدالة مع إستبدال n بn-1 وزيادة واحد لعدد الخطوات count. يمكنك تجربة الكود من هنا.
  10. بالنسبة لsys.argv هي الطريقة التي يتم الوصول إلى الarguments المعطاة للبايثون script. على سبيل المثال إذا كان لديك script به الكود الآتي وقمت بحفظه في ملف script.py: import sys for arg in sys.argv: print(arg) وقمت بإستدعاءه عن طريق الcommand line كالآتي: python script.py arg1 arg2 arg3 سيكون المخرج هو: script.py arg1 arg2 arg3 وهو ما تم تمريره في الcommand line. أما بالنسبة ل: if __name__ == '__main__': تستخدم في الملفات التي يراد إستخدامها بطريقتين، الأولى هي كبرنامج مستقل، والثانية إستدعائها في ملف آخر. مثلاً إذا كان لديك الملف example.py وبه الآتي: if __name__=='__main__': print('im running as the main program') def helper(a): return 2*a هذا الملف إذا تم تشغيله من خلال الcommand line سيقوم بطباعة 'im running as the main program'، أما إذا تم إستدعاءه داخل ملف آخر مثلا: import example print(example.helper(2)) فلن يتم طباعة الجملة، ولكن يمكن إستخدام الدوال والمتغيرات المعرفة بداخله، وبهذه الطريقة يمكن إستخدام الملف بطريقتين، بكونه البرنامج الرئيسي، أو إستخدامه كملف يتم إستدعاءه وإستخدام المتغيرات المعرفة بداخله. وهذه التفرقة تتم عن طريق الكشف على المتغير __name__ إذا كان مساوي ل'__main__' أم لا.
  11. تحياتي، هذه المصطلحات تخص إختبار البرمجيات، وهي أساليب يتم إستخدامها للتأكد من سلامة البرامج المكتوبة من الأخطاء بشتى أنواعها، والتأكد من تأديتها للوظائف المرغوبة. manual testing: الإختبار اليدوي، وهي القيام بإختبار وظائف البرنامج أو الموقع أو التطبيق بطريقة يدوية. automated testing: هو عمل الإختبارات بصورة برمجية، بحيث لا يتم إجراء الإختبار بصورة يدوية، ولكن عن طريق برنامج يكون لديه المخرج المتوقع، وإذا حاد البرنامج عن هذا المخرج يعتبر ان البرنامج فشل في الإختبار. test case: هي حالات الإختبار، ويتم تقسيم الإختبارات سواء اليدوية أو الautomated إلى حالات إختبار، يتم فحص كل وظيفة فيها على حدى. unit tests: إختبارات الوحدات، والوحدة هي أصغر جزء يمكن إختباره من البرنامج. edge cases: الحالات الطرفية, وهي الحالات التي تحدث في الحالات القصوى، مثل إختبار المدخلات الضخمة، أو متناهية الصغر. test suite: وهي حزمة من الإختبارات، يتم إجراءها معاً للتأكد من مطابقة البرنامج لمجموعة من المواصفات. black box : ويتم فيها إجراء الإختبار بدون النظر إلى مكونات البرنامج، ولكن عن طريق المدخلات والمخرجات فقط. white box: ويتم فيها فحص مكونات البرنامج من الداخل. integration test: وهي إختبارات يتم فيها التأكد من عمل أجزاء البرنامج المختلفة بصورة متوافقة، وهي قد تظهر أخطاء لا يظهرها إختبارات الوحدة unit tests. regression tests: إختبارات الإنحدار، وهي إختبارات غرضها التأكد من أن الخاصية الجديدة المضافة للبرنامج لم تتسبب في كسر بعض الخواص الموجودة في البرنامج. smoke test: وهي إختبارات تسأل أسئلة بسيطة، وفشلها يؤدي لرفض البرنامج. مثل: هل البرنامج يقوم بالفتح؟ هل الضغط على الزر يعمل؟ load tests: وهي إختبارات تقوم بعمل ضغط على النظام لدراسته تحت هذا الضغط، مثلاً إرسال عدد كبير جداً من الطلبات إلى موقع ما، ودراسة متى يتوقف عن العمل. test driven developments وهي أسلوب من البرمجة يتم فيه كتابة حالات الإختبار قبل البدء في كتابة الكود، وثم كتابة الكود بغرض المرور من هذه الإختبارات. assertion error يحدث عند عدم تطابق نوع من المتغيرات مع النوع المتوقع، مثلاً دالة تتوقع أن تستقبل متغير من النوع integer ولكنها استقبلت string isalnum() دالة في لغة الc، والكلمة إختصار ل is alpha numeric وهي دالة تكشف إذا كان المعطى لها هو من الأرقام او من الحروف الأبجدية. raising errors وهي المصطلح البرمجي المستخدم لحدوث الأخطاء.
  12. تمام جدا ملاحظاتي هي الآتي: في جزء النبذة، أعتقد أنه من الأفضل التركيز على ما ترغبين عمله في الموقع، وهو الترجمة والتحرير، لذلك بعض النقاط لا داعي لها مثل الإدارة والتسويق. كما أن هناك بعض الأخطاء الكتابية وهي قد تعطي إنطباع سيئ لصاحب المشروع عند فتح صفحتك. بعض الأخطاء هي: microsift office micrisoft office الصحيح هو : microsoft office أيضاً الهمزات في: فاذا استطيع انجاز باتقان اداب مراعاة تلك التفاصيل الصغيرة تعطي إنطباع جيد. أيضاً لاحظت أن العروض التي تكتبيها هي نفسها في كل مرة مع تعديلات طفيفة، من الأفضل كتابة كل عرض بطريقة موجهة للمشروع، مع توضيح فهمك للمطلوب ولماذا سيكون من الصحيح إختيارك من بين المتقدمين الآخرين. أيضاً في معرض الأعمال يمكنك التركيز أكثر على ما قمت بترجمته، وحذف الأشياء الغير متعلقة بذلك، مع مراعاة وضع صور جذابة للعمل.
  13. هل يمكنك وضع الرابط لملفك على مستقل؟ سأقوم بالإطلاع على ملفك والعروض الموضوعة وإخبارك برأيي.
  14. تستخدم هذه الوسيلة للتحقق من إذا كان الطلب المرسل إلى الصفحة مصدره برنامج أم مستخدم بالفعل. إذا لم يتم هذا التحقق، يمكن بالتالي أن يتم إرسال عدد كبير جدا من الطلبات إلى الموقع، آلاف وربما ملايين الطلبات، وبسبب عدم التحقق من هوية المستخدم، يمكن إذا ملئ قاعدة بيانات الموقع بمستخدمين وهميين أو أي إساءة إستخدام أخرى. ويتم أيضاً هذا التحقق كوسيلة دفاعية من المواقع للحد من جمع البيانات web scraping، بحيث يتم التوقف عن عرض الموقع لحين الإجابة عن سؤال معين للتحقق من إذا كان المستخدم شخص أم برنامج وظيفته جمع البيانات المعروضة بالموقع.
  15. بالنسبة لجزئية الconstructor هو يستخدم عند تعريف class ما، وهو ما يتم إستدعائه كل مرة يتم إنشاء object من هذا الclass، ويتم فيه وضع الأكواد لتهيئة الobject الجديد من هذا الclass. لإعطاء مثال لنقل أننا نريد أن نعرف class يدعى A يتم ذلك كالآتي: class A: def __init__(self): print("I'm in constructor") في لغة بايثون يكون ذلك هو شكل الconstructor، لابد أن يدعى __init__ ويجب أن يأخذ self كأول argument . يمكنك التحقق من أن الconstructor يتم إستدعاؤه في كل مرة بإنشاء أحد الobjects: first_obj = A() second_obj = A() ستجد أنه يتم طباعة الجملة الموجودة داخل الconstructor.
  16. يمكن إضافة كلمة تستخدم فقط عند ظهور كلمة لم يرها المودل من قبل، عادة تسمى هذه الكلمة UNK ويتم إستبدال أي كلمة لم يتدرب عليها المودل بها.
  17. يمكن أيضاً تبسيط المطلوب رياضياً عن طريق أخذ 1/2 عامل مشترك، وإستخدام قانون مجموع الأعداد من 1 إلى n، فيصبح المجموع: ويصبح الكود كالآتي: #include <iostream> using namespace std; int main () { int n; float total = 0; cout << "Enter n: "; cin >> n; cout << (float)n*(n+1)/4; } يمكنك تجربته من هنا.
  18. تمام البيانات موجودة في شكل متسلسل وهذا صحيح، بالتالي تكون الدقة العالية التي حققها المودل هي دليل على حدوث الoverfitting. يمكنك معالجة هذا بتصغير حجم المودل فمثلا يمكنك تقليل حجم الembedding layer أو حجم الLSTM layer. يمكنك القراءة أكثر عن ظاهرة الoverfitting من هنا.
  19. هل يمكنك أن ترفق بعض البيانات المستخدمة للتدريب؟ أنا أعتقد أن المشكلة هي في شكل البيانات، لأن قوة LSTM تظهر عند إستخدامها على الsequences أو البيانات المتتابعة أو المتسلسلة، وإستخدامها لعمل تصنيف للكلمة بدون مدخلات متسلسلة سيحدث overfitting.
  20. يبدو أن الmodel لديك به مشكلة الoverfitting. أهم علامات الoverfitting هو أن يحقق المودل دقة عالية جداً على بيانات التدريب ولكنه يعطي نتائج سيئة على بيانات الإختبار. أنا أتوقع أن الدقة 99% هي على بيانات التدريب، فما هي الدقة على بيانات الإختبار؟ أيضاً هل تقوم بتطبيق الLSTM على مستوى الحرف أم على مستوى الكلمة؟ بسبب أن كل input لديك هو عبارة عن كلمة واحدة فقط، لن يكون إستخدام الLSTM على مستوى الكلمة مناسب، ومن الصحيح إستخدامها على مستوى الحرف. أيضاً أرى أن إضافة التشكيل على حروف الكلمة لابد منه إن أردت أعلى دقة ممكنة، لأنها من أهم الطرق التي يمكنك التمييز بين الاسماء والأفعال. ما المقصود بالمخرج هنا؟ هل تقوم بعمل generation لكلمات؟
  21. للأسف لا يمكن تطبيقه على التاريخ الهجري بسبب أن هذه الدوال مخصصة لإسترجاع التاريخ الميلادي.
  22. نعم يمكنك إضافتها إلى ملف الhtml قبل غلق الbody، أو يمكنك إضافتها في ملف منفصل. الكود بعد التنسيق: <!DOCTYPE html> <html dir="rtl" lang="ar"> <head> <meta charset="UTF-8"> <meta name="description" content="تجربة"> <meta name="keywords" content="HTML, CSS, JavaScript"> <meta name="author" content="تجربة"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>درس 1</title> <link rel="stylesheet" type="text/css" href="css/bootstrap.css" /> </head> <body> <center> <img src="/images/logo.jpg" alt="centered image" /> </center> <div class="container"> <div class="row col-md-6 col-md-offset-3"> <div class="panel panel-primary"> <div class="panel-heading text-center"> <label for="start">Start date:</label> <input type="date" id="start" name="trip-start" value="2018-07-22" min="2018-01-01" max="2018-12-31"> <input type="submit" class="btn btn-primary text-right" /> </div> <div class="panel-footer text-right"> <small>شكرا لكم</small> </div> </div> </div> </div> <script> var inputElement = document.querySelector('input[type="date"]'); var getCurrentDate = function (monthOffset) { today = new Date(); var dd = today.getDate(); var mm = today.getMonth() + 1; //As January is 0. if (monthOffset) { mm = mm + monthOffset; } var yyyy = today.getFullYear(); if (dd < 10) dd = '0' + dd; if (mm < 10) mm = '0' + mm; return (yyyy + '-' + mm + '-' + dd); }; var currentDate = getCurrentDate(); var maxDate = getCurrentDate(3); inputElement.value = currentDate; inputElement.min = currentDate; inputElement.max = maxDate; </script> </body> </html>
  23. يمكنك عمل الآتي عن طريق الjavascript كالتالي: <script> var inputElement = document.querySelector('input[type="date"]'); var getCurrentDate = function (monthOffset) { today = new Date(); var dd = today.getDate(); var mm = today.getMonth() + 1; //As January is 0. if (monthOffset) { mm = mm + monthOffset; } var yyyy = today.getFullYear(); if (dd < 10) dd = '0' + dd; if (mm < 10) mm = '0' + mm; return (yyyy + '-' + mm + '-' + dd); }; var currentDate = getCurrentDate(); var maxDate = getCurrentDate(3); inputElement.value = currentDate; inputElement.min = currentDate; inputElement.max = maxDate; </script> قم بإضافة هذا الوسم بعد وسم الinput وقبل نهاية وسم الbody، وسيقوم بجعل الcurrent والmin بالتاريخ الحالي، والmax بعد ثلاثة أشهر. شرح الكود: var inputElement = document.querySelector('input[type="date"]'); قمنا بإختيار الوسم input الذي نوعه date ووضعه داخل المتغير inputElement، وسنقوم بالتعديل على خواصه. var getCurrentDate = function (monthOffset) { today = new Date(); var dd = today.getDate(); var mm = today.getMonth() + 1; //As January is 0. if (monthOffset) { mm = mm + monthOffset; } var yyyy = today.getFullYear(); if (dd < 10) dd = '0' + dd; if (mm < 10) mm = '0' + mm; return (yyyy + '-' + mm + '-' + dd); }; قمنا بتعريف دالة وظيفتها أن ترجع لنا التاريخ الحالي، نقوم بالحصول على التاريخ الحالي عن طريق new Date() وهو يرجع لنا تاريخ اليوم، وقمنا بوضعه داخل المتغير today. قمنا بإستخدام getDate و getMonth و getFullYear للحصول على اليوم والشهر والسنة، وقمنا بإرجاع التاريخ في الشكل المطلوب وهو على الشكل yyy-mm-dd. var currentDate = getCurrentDate(); var maxDate = getCurrentDate(3); inputElement.value = currentDate; inputElement.min = currentDate; inputElement.max = maxDate; وفي النهاية قمنا بإستخدام هذه الدالة للحصول على التاريخ الحالي، والتاريخ الحالي مضاف إليه ثلاثة أشهر، وقمنا بتعديل الخواص value و min و max للوسم.
  24. إذا كان السؤال هو بالشكل المطلوب في الصورة المرفقة، يمكن حساب المجموع كالآتي: أولا تعريف دالة لحساب المضروب factorial: int factorial(int n){ if (n==2){ return 2; } if (n==1){ return 1; } return n*factorial(n-1); } ثانيا حساب دالة تقوم بحساب الأس: int exponential(int number,int exponent){ int product = 1; for (int i=0; i <exponent; i++){ product = product * number; } return product; } ثم عمل loop يتم فيها إستخدام الدالتين لحساب المجموع، إلى الحد n المدخل من المستخدم: int main() { int n; cout << "enter N"; cin >> n; float sum=0; for(int i=1; i<=n; i++){ sum = sum + (float)(exponential(i,i)/(float)factorial(2*i)); } cout<<"sum" << sum; } يمكنك تجربة الكود بالكامل من هنا.
  25. هناك مشكلة بالأقواس، بالإضافة أن الدالة main يجب أن ترجع int وليس void. الكود بعد التصحيح: #include <iostream> using namespace std; int main() { int i; char letter; cout<< "Enter a letter: "; cin >> i; if (i>96 && i<123){ i-=32; char letter = (char)i; cout<< letter << endl; } else{ cout<< "it's not a letter" <<endl; } system("pause"); } شرح الكود: يقوم المستخدم بإدخال رقم، ثم يتم التأكد من أن الرقم أكبر من 96 وأقل من 123، إذا كان يقع في هذا المدى يتم تحويل الرقم إلى الحرف المقابل في جدول الASCII، عن طريق عمل casting إلى النوع char. أما إذا كان الرقم المدخل لا يقع في المدى بين 96 و 123 يتم طباعة "it's not a letter". يمكنك تجربة الكود الصحيح مع بعض المدخلات من هنا. بالتوفيق
×
×
  • أضف...