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

سمير عبود

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

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

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

  • عدد الأيام التي تصدر بها

    34

كل منشورات العضو سمير عبود

  1. مرحباً مروان، السبب أن المتغير result عبارة عن كائن و عندما تقوم بفحص المتغير في الشرط: <?php if($result){ // code } فإن الشرط مُحقق في كل الأحوال. الحل هناك عدة طرق من بينها: <?php // here prev code $stmt = $conn->prepare("SELECT * from users where name = ?"); // prepare the query $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); // get the mysqli result if ($result->num_rows > 0) { echo "success"; } else { die("Invalid Username or Password Please Try Again"); } او <?php // prev code $stmt = $conn->prepare("SELECT * from users where name = ?"); // prepare the query $stmt->bind_param('s', $name); $stmt->execute(); if ($stmt->fetch()) { echo "success"; } else { die("Invalid Username or Password Please Try Again"); } فالخطأ كله في الشرط. بالتوفيق.
  2. مرحباً عبد الواحد، أنصحك بمتابعة المسار الجديد لأن به معلومات جديدة و مفيدة لك خصوصاً أن في هذا المسار استخدمنا آخر إصدار ، بالإضافة إلى أن المشروع التطبيقي المدرج في المسار يشمل و يضم معظم المفاهيم التي ستتعلمها خلال المسار ، إضافة إلى استخدام برنامج laragon الذي سيساعدك كثيرا في التطوير فيمكنك من خلاله التغيير بين خادم Apache إلى خادم nginx و التحكم في إصدارات الphp بسهولة إضافة إلى أنه يهيء لك الخادم الافتراضي بنفسه فبمجرد إنشائك للمشروع بإسم مثلاً cms ستتمكن من تجربته إنطلاقا من الرابط cms.test عوضاً عن عمل هذه النقطة يدوياً و العديد من الميزات الأخرى، و يأتي معه كل من برنامج heidisql و cmder أنا شخصياً أستعمل هذه البرامج في التطوير و ساعدتني كثيرا بالتوفيق.
  3. مرحباً علي، نعم لقد تم تحديث المسار، و اقصد به مسار أساسيات إطار العمل لارافيل و تم شرح كافة النقاط الأساسية في الإطار وتم العمل أيضا على آخر إصدار موجود حاليا وهو 8.x لكن النقاط العريضة في الإطار نفسه تبقا نفسها و إنما الإصدارات تأتي بتحديثات طفيفة و إضافات لا تؤثر على عملك بالإطار و تستطيع تعلمها بعد فهمك للأساسيات. بقية المسارات لم يتم تحديثها و أظن أن فريق الأكاديمية يعمل على تحديث المسارات المهمة و أخص بالذكر المسار الأول أما المسارات العملية و التطبيقية فمسار إنشاء متجر للكتب تم إضافته منذ فترة قصيرة و لا يحتاج إلى تحديث بالإضافة إلى مسار إنشاء restful API تم تحديثه منذ فترة قليلة لذلك فالفريق لا يوفر طاقاته في تحديث المسارات و إنما يعمل جاهدا لتوفير مادة تعليمية جيدة لطلاب الأكاديمية أتمنى لك التوفيق.
  4. نعم هذا ما انصحك به، لكن في نفس الوقت قم بالإطلاع على المشاريع المعروضة، و محاولة عملها بغية التطبيق على ما تعلمته إن أردت ذلك و الإهتمام بحسابك على المنصة.
  5. مرحباً أحمد، لم أفهم سؤالك جيدا إذا كنت تريد برنامج تكتب عليه برامج بلغة c أو لغة c++ بإمكانك إستخدام برنامج Code Blocks ما تحتاج إلى فهمه أن لغة سي تحتاج إلى برنامج ثاني إسمه مترجم (compiler) و مهمته هي تحويل الشيفرات من لغة سي إلى لغة آلة لتنفيذها و من أشهرها : GCC Visual ++c على العموم بإمكانك تنصيب محرر نصوص أو أكواد ثم تنصيب المترجم لوحده لكن برنامج code Blocks يوفر الإثنين و هو عبارة عن بيئة عمل متكاملة مفتوحة المصدر، ويتم إستخدام المترجم GCC من خلال المشروع MinGW لترجمة أكواد السي، ويعتبر خيار جيد للبرمجة بلغة الس ويمكنك تحميل الحزمة البرمجية الخاصة بـ Code Blocks من خلال الموقع الخاص به ثم تختار نظام التشغيل الذي تستخدمه حاليا، وتختار الإصدار الذي ينتهي بـ mingw-setup، وهو الإصدار الذي يحتوي على المترجم GCC. بالتوفيق.
  6. مرحباً خالد، انا لا انصحك بدخول مجال العمل الحر حاليا و إنما بالتركيز أكثر على إكتساب أكبر قدر من الخبرة و إنجاز أكبر عدد من المشاريع لبناء معرض أعمالك و ذلك لجذب العملاء لتشغيلك، بإمكانك البدأ في الإهتمام بحسابك الشخصي على منصة مستقل و ذلك بوضع المهارات التي تمتلكها و وضع المشاريع التي قد أنهيتها مع رابط للتصفح المباشر إن أمكن بالإضافة إلى وضع نبذة تعريفية عنك و ذلك لجذب العملاء و طمأنتهم بإكتسابك للخبرات. بإمكانك متابعة المشاريع التي تتقاطع مع المهارات التي اكتسبتها مثل تصميم صفحات الهبوط و ذلك بعد إنهائك للدورة فهي مطلوبة بكثرة و محاولة إنجازها بينك و بين نفسك و في هذا المرحلة سيتطور مستواك بالإعتماد على نفسك و إنجاز مشاريع حقيقية إن وجدت انك قادر على إنجاز مشاريع بهذا الشكل يمكنك حينها التقديم و في هذه المرحلة هناك بعض المقالات على الأكاديمية و على مدونة مستقل أنصحك بالإطلاع عليها لأنها ستعرفك على مجال العمل الحر و كيفية إقناع عملائك و ما إلى ذلك ككتابة عرض يجذب نظرة العميل، الإهتمام بمعرض الأعمال ... إضافة إلى أنه إذا قمت بمتابعة دورة الphp و إطار لارافيل و فهمت و تعلمت إنجاز المشاريع بنفسك ستكون قد كسبت مهارة مطلوبة بكثرة لأن العديد من المشاريع تطلب إطار لارافيل ليس فقط على مستوى العمل الحر و إنما العديد من الشركات أيضاً لذلك إن أصبحت محترف في إنجاز مشاريع بإطار عمل لارافيل ستكون قد قطعت شوطاً كبيرا في حصولك على مشاريع على منصات العمل الحر. بالتوفيق.
  7. مرحباً بك، في الحقيقة تعليمة switch تعمل بشكل صحيح و ذلك لأن أي قيمة يتم إرجاعها في المتغير num عبارة عن سلسلة نصية (string) و بالتالي لم تُطابق أي حالة من الحالات الموجودة (cases) في تعليمة switch. إضافة إلى ذلك لا توجد تعليمة default فإذا لم تتحقق أي حالة من الحالات سيتم تنفيذها: default: message.innerHTML = "anything"; break; بإمكانك تحويل النوع من string إلى int بحيث مثلا: حالياً إذا أدخل المُستخدم 2 فإن القيمة التي ستُخزن في المُتغير num ستكون "2" لكن يُمكننا تحويلها إلى 2 عن طريق إستخدام الدالة parseInt كما هو موضح أدناه: var num = parseInt(document.getElementById("number").value); ليُصبح الكود في النهاية بهذا الشكل: function f1() { "use strict"; var num = parseInt(document.getElementById("number").value); var result = num * 600; var message = document.getElementById("m"); switch (num) { case 1 : message.innerHTML = "1/1/2020"; break; case 2 : message.innerHTML = "2/2/2020"; break; case 3 : message.innerHTML = "3/3/2020"; break; case 4 : message.innerHTML = "4/4/2020"; break; case 5 : message.innerHTML = "5/5/2020"; break; default: message.innerHTML = "anything"; break; } } بالتوفيق.
  8. مرحباً خالد، دورة تطوير واجهات المستخدم المقدمة من أكاديمية حسوب تتمحور فقط حول الواجهة الأمامية (front-end) و التقنيات المستخدمة في هذا الجزء و تهتم أيضا بالجانب التطبيقي له و لا توجد بها مسارات خاصة بجانب مخدم الويب (back-end) لكن توجد دورات تهتم بهذا الجانب الا و هي دورة تطوير تطبيقات الويب بإستعمال لغة PHP دورة تطوير تطبيقات الويب بإستعمال لغة Ruby بما أنك مشترك في أحد الدورات فسوف تستطيع الوصول إلى المسارات الأولى من هذه الدورات و بقية دورات الأكاديمية أما لمشاهدة كل مسارات الدورة فيجب الإشتراك فيها، بإمكانك أخذ فكرة مبدئة قبل الإشتراك في أي دورة و ذلك من خلال مشاهدة المسار الأول و بعدها بإمكانك أخذ قرار مناسب لك. بالتوفيق.
  9. مرحباً بك، بإمكانك أيضاً إستخدام الطريقة التعاودية فكما تعلم أن: n! = n * (n - 1)! و سيكون البرنامج بهذا الشكل: fprintf('%d! = %d\n', 6, fact(6)); % output: 6! = 720 function x = fact(n) if n<=1 % شرط التوقف x = 1; % نُعيد 1 else x = n * fact(n-1) ; % الدالة تُنادي على نفسها end بإمكانك تجربة البرنامج من خلال هذا الرابط: هنا ثم إضغط Run شرح: بما أن n = 6 فعند دخول الدالة (fact(6: فإن الشرط لن يتحقق و بالتالي سيتم تنفيذ جزء و إلا و بالتالي (x = 6 * fact(5 و هنا سيتم إستدعاء الدالة fact ثانيةً: 5 لن يُحقق الشرط و بالتالي سيتم إرجاع fact(4) * 5 و بالتالي سيُصبح 6 * 5 * (fact(4 و هكذا إلى أن نصل إلى 1 الذي يُحقق الشرط و هنُا سيتم إرجاع 1 و بالتالي x سيُصبح 6 * 5 * 4 * 3 * 2 * 1 اي: x = 6 * 5 * 4 * 3 * 2 * 1 = 720 و هكذا بالنسبة لأي عدد آخر، بالتوفيق.
  10. مرحباً بك، بعد ان تقوم بإنهاء و فهم كافة مسارات الدورة و دروسها بالإضافة إلى القيام بالتطبيقات العملية و المشاريع الموجودة في المسارات ستقوم بالتواصل مع مركز مساعدة حسوب لطلب الشهادة و قد يتم تحويلك إلى جهة مختصة قد تطلب منك روابط للمشاريع التي أنشأتها خلال الدورة لمعاينة مستواك ثم قد يطللبو منك حساب Skype الخاص بك على حسب الوضعية لتحديد موعد للإختبار و سيختبرونك على حسب نوع الدورة قد يسألونك أسئلة نظرية لكي يتأكدو من أنك استفدت و فهمت دروس الدورة و قد يُطلب منك إنجاز مشروع أو ما شابه يتعلق بمحتوى الدورة و كل هذا لقياس مستواك و إثبات قدراتك و هل تستحق فعلاً الشهادة ام لا، إن تمكنت من إجتياز الإمتحان سيتم منحك الشهادة لكن إن لم تنجح ستحصل على فرص أخرى لتطوير مستواك من خلال مراجعة الدروس و إعادة المحاولة. ركز بشكل كبير على فهم الدروس كثيرا و لا تجعل همك مُتركزا على الشهادة أو إتمام الدورة فقط لأن الهدف الأول لإشتراكك في الدورة ليس الشهادة و إنما محتوى الدورة و فهم الدروس. بخصوص أسئلة الإمتحان فهي تتعلق بما تم تلقينه لك من خلال الدروس قد تكون الأسئلة نظرية أو تطبيقية أو الإثنين معاً. اتمنى لك التوفيق.
  11. مرحباً بك، بإمكانك متابعة منصة بعيد فشركة حسوب تنشر عليها العديد من الوظائف في مختلف المجالات للعمل معهم ضمن الفريق و تقوم بالتقديم على الوظيفة من خلال إرسال سيرتك الذاتية و الإجابة على بعض الأسئلة من خلال تقديم عرضك لهم و إن وجدو أنك الشخص المناسب لذلك المنصب سيتواصلون معك لإجراء مقابلة و إن جرت الأمور على ما يرام ووجدو أنك ستُقدم إضافة لهم و انك الشخص الذي يبحثون عنه سيقومون بتوظيفك. بالتوفيق.
  12. بإمكانك البدأ إنطلاقا من الشرح أعلاه و إذا واجهتك أي مشكلة يمكنك حينها الإستفسار عنها و سنساعدك
  13. يتم إضافة هذه التعليقات لمُساعدة مُحرر الأكواد و عدم إعطاء تحذيرات متعلقة بهذه الأشياء على سبيل المثال لو كتبنا في برنامج Brackets: console.log('hello'); سيُعطي البرنامج الإنذار أو التحذير التالي: أي أنه لم يتعرف على console لكن الكود سيعمل في المتصفح بشكل جيد و سيطبع hello، لكن لتلافي هذا الإنذار يُمكن كتابة: window.console.log('hello'); و سيختفي الإنذار، أو يُمكننا إضافة التعليق التالي: /*global console*/ في بداية الملف. فكما تلاحظي هذه الأسطر فقط لمُساعدة المُحرر. هذا يعتمد على الحالة التي تواجهك و على الشيء الذي تريدين القيام به مثلا إذا كان لدينا: <div class="test">A</div> <div class="test">B</div> <div>C</div> <div class="test">D</div> <div class="test">E</div> و نريد تغيير النص لكل div يحمل الصنف test إلى "asma" سنقوم ب: window.onload = function () { document.querySelectorAll("div.test").forEach(elm => elm.innerText = "asma") } بالتوفيق.
  14. مرحباً بك، لم يتغير شيء لأنه لا يوجد في المستند أي عُنصر يحمل المُعرف test حتى يتغير النص الموجود داخل الdiv يجب إضافة الid المطلوب كما هو موضح أدناه: <div class="test" id="test">C</div> أو بإمكانك تغيير طريقة تحديد العُنصر عن طريق إسم الصنف: window.onload = function () { document.getElementsByClassName("test")[0].innerHTML = "asma"; } التابع getElementsByClassName يأخذ كمعامل إسم الصنف و يُرجع مصفوفة تضم كل العناصر التي تملك صنف التنسيقات المطلوب. هناك عدة توابع أخرى يُمكنك إستخدامها ك querySelector getElementsByTagName بالتوفيق.
  15. مرحباً بك، لعمل هذا الشيء تحتاج إلى إنشاء جدول تُخزن فيه تفضيلات كل مستخدم مبدئيا فإن الأعمدة التي يمكننا وضعها في الجدول هي كالآتي: id مُعرف التفضيلة user_id مُعرف المُستخدم صاحب التفضيلة و يمكن أيضا إنشاء مفتاح ثانوي يربط هذا العمود بجدول المستخدمين model_type: من النوع النصي لتفريق نوع التفضيلة إن كانت كتاب أو مقال أو منتج أو أي شيء آخر model_id: مُعرف الشيء الذي قام المستخدم بتفضيله فإن كان كتاب فسيتم تخزين مُعرف الكتاب فيه بإمكانك إضافة أعمدة أخرى مثلا لحفظ تاريخ إضافة التفضيلة و غيرها. عندما يختار المُستخدم إضافة منتج للمفضلة فإنه يجب عليك إنشاء إستعلام لإضافة سجل جديد في جدول التفضيلات بحيث يكون: user_id هو مُعرف المستخدم الذي يحاول إضافة المنتج للمفضلة model_type سيكون إسم الصنف و في هذه الحالة سيكون Product model_id سيكون معرف المنتج الذي يحاول المستخدم إضافته للمفضلة و عند عرض السجلات الموجودة في مفضلة المستخدم الخاصة بالمنتجات مثلاً تحتاج إلى عمل إستعلام تحدد فيه تفضيلات المستخدم و بإستخدام (joins) يمكنك دمج جدول المنتجات مع جدول التفضيلات لجلب ما قام المستخدم بتفضيله من منتجات. بالتوفيق.
  16. و عليكم السلام و رحمة الله و بركاته، أظن أن المُشكلة التي تُواجهها متعلقة بحساب البايبال يُمكنك مراسلة الدعم الفني في بايبال لمعالجتها لأنه قد تحدث بعض الأمور تجعل النظام الخاص بِبايبال يَحُد من بعض خصائص الحساب إلى حين التأكد ، فقط قم بمُراسلة الدعم الفني لبايبال و اشرح لهم المُشكلة و سيقومون بتنشيط حسابك قد حدثت لي مُشكلة مشابهة و عندما راسلت الدعم الفني لمُستقل أخبروني أن المُشكلة ليست من طرفهم بل من طرف بايبال و عندما راسلت بايبال قالو انهم عاينو الحساب الخاص بي و قد صار الحساب بإمكانه الإرسال و الإستقبال بشكل عادي و عندما حاولت الإرسال مُجددا تم الإرسال بشكل طبيعي، لذلك حاول التواصل مع الطرفين و ستُحل المُشكلة في أقرب وقت. بالتوفيق.
  17. مرحباً بك، الخطأ الذي يظهر هو كالتالي: cannot convert 'int (*)[3]' to 'int**' ما يعني أن الدالة print المفروض تستقبل وسيط من النوع **int لكن ما تم تمريره هو int (*)[3] و هو نوع المُتغير mm بطبيعة الحال يجب توحيد الأنواع حتى لا تحدث أخطاء هناك طريقتين إما بتعديل نوع الوسيط او المُعامل أو تعديل نوع المتُغير الذي تم تمريره كوسيط الطريقة الأولى بإمكانك تعديل الدالة print للشكل التالي: int* print(int (*arr)[3], int m, int n) { for(i = 0; i < 3; i++) for(j = 0; j < n; j++) return (*(arr+i) + j); } بالإضافة إلى تعديل السطر التالي: int** p = print(mm, m, n); إلى int* p = print(mm, m, n); لأن ما تُرجعه الدالة print هو مؤشر(pointer) و ليس مؤشر على مؤشر(pointer to pointer) بإمكانك تجربة الطريقة من خلال هذا : الرابط الطريقة الثانية تعديل نوع المُتغير الذي تم تمريره كوسيط بهذا الشكل: int main() { int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int m = 3, n = 3; int *mm[3]; for (int i = 0; i < 3; ++i) { mm[i] = arr[i]; } int* p = print(mm, m, n); for(i = 0; i < 3; i++) for(j = 0; j < n; j++) cout << (*(p+i) + j); return 0; } بإمكانك تجربة هذه الطريقة من خلال هذا : الرابط بالتوفيق.
  18. مرحباً @Taha NEKHLI عملية الConcatenation تُستخدم بين السلاسل النصية (strings) لذلك إن أردت جمع متغير نصي مع متغير عددي سيُعطي خطأ و لتجاوز هذا الخطأ نقوم بتحويل قيمة المتغير العددي إلى قيمة نصية و ذلك بإستخدام الدالة str بهذا الشكل: a = 15 b = "Taha" print(str(a) + b) # output: 15Taha الدالة input التي تستخدمها تُستعمل لقراءة ما يقوم المُستخدم بإدخاله من خلال لوحة المفاتيح و تستقبل المدخلات على هيئة سلسلة نصية مثلاً إذا أردنا طباعة رسالة للمستخدم تُفيد بإدخال عُمره و رسالة أُخرى تُفيد بإدخال إسمه ثم نطبع له رسالة تضم الإسم و العمر معاً سيكون البرنامج بالشكل التالي: a = input("Enter age: ") b = input("Enter Name: ") print("Hello " + b + ", Your age is: " + a) سيكون الناتج بهذا الشكل: بالتوفيق.
  19. مرحباً @Enas Wawy بإمكانك إلقاء نظرة على السؤال التالي: فهو نفس السؤال مع تغيير في أسماء الكلاسات فقط. بالتوفيق.
  20. مرحباً بك، عندما بحثت عن الأمر وجدت أنه متعلق بإصدار c++ المُستخدم في جهازك بالإضافة إلى الcompiler فالإصدار أقل من 11 سيُسبب لك بعض الأخطاء في حين إذا كان 11 أو أكثر لن تحدث لك أي أخطاء وسيشتغل البرنامج بشكل جيد، إذا اردت تشغيل البرنامج على جهازك بالإصدار الموجود حالياً بإمكانك عمل بعض التغييرات على كل من الميثود Print التي تكتب في الملف بالشكل التالي: void Print(string file) { ofstream f; f.open (file.c_str()); // تغيير هذا السطر f << "The Name is : " << name << endl; f << "Total is : " << Total << endl; f << "TVs: " << endl; for(int i=0;i<2;i++){ f << "TVs[" << i << "] = (Number = " << TVs[i].getNo() << ", Price = " << TVs[i].getPrice() << ")" << endl; } f.close(); } بالإضافة إلى أن الدالة to_string لن تعمل على الإصدار أيضا فيجب تغيير الطريقة إلى شكل آخر و هذه الدالة main: int main() { Invoice* x[2]; //customer y; for(int i=0; i<2;i++){ char name[20]; char filename[20]; sprintf(name, "Invoice %d", i); x[i] = new Invoice(name); sprintf(filename, "output%d.txt", i); x[i]->Print(filename); x[i]->getMin(); cout<<"********************************"<<endl; } return 0; } و هذا الكود ككل: #include <iostream> #include <fstream> using namespace std; /*---------------------------------------------------*/ class Customer{ protected: string name; public: Customer(string name = "Unknown"){ this->name = name; } string getName(){ return name; } void setName(string name = "Unknown"){ this->name = name; } }; /*---------------------------------------------------*/ class TV{ private: int no; public: float price; TV(){ cout << "The TV Number is : " << endl; cin >> no; cout << "The TV Price is : " << endl; cin >> price; } float getPrice(){ return price; } int getNo(){ return no; } void setPrice(float p){ price = p; } }; /*---------------------------------------------------*/ class Invoice : protected Customer{ private: float Total = 0; public: TV TVs[2]; void ReadPrice(){ for(int i=0;i<2;i++){ cout << "TVs[" << i << "] = (Number = " << TVs[i].getNo() << ", Price = " << TVs[i].getPrice() << ")" << endl; } }; int getTotal(){ return Total; } Invoice(string name) : Customer(name){ for(int i=0;i<2;i++){ Total += TVs[i].price; } } void Print(){ cout << "The Name is : " << name << endl; cout << "Total is : " << Total << endl; cout << "TVs: " << endl; this->ReadPrice(); } void Print(string file) { ofstream f; f.open (file.c_str()); f << "The Name is : " << name << endl; f << "Total is : " << Total << endl; f << "TVs: " << endl; for(int i=0;i<2;i++){ f << "TVs[" << i << "] = (Number = " << TVs[i].getNo() << ", Price = " << TVs[i].getPrice() << ")" << endl; } f.close(); } int getMin(){ float min; min = TVs[0].price; for(int i=0 ;i < 2; i++){ if (TVs[i].price < min) min = TVs[i].price; } cout<<"The minimum :" << min <<endl; return min; } }; /*---------------------------------------------------*/ int main() { Invoice* x[2]; //customer y; for(int i=0; i<2;i++){ char name[20]; char filename[20]; sprintf(name, "Invoice %d", i); x[i] = new Invoice(name); sprintf(filename, "output%d.txt", i); x[i]->Print(filename); x[i]->getMin(); cout<<"********************************"<<endl; } return 0; } جربت كلتا الطريقتين على جهازي و اشتغل بشكل جيد، إذا لم ينجح معك بإمكانك تحديث إصدار c++ بالإضافة إلى الcompiler إلى آخر نُسخة بإمكانك إستخدام برنامج code blocks و تحميل الملف الذي يأتي معه compiler ثم تنصيبه على جهازك. بالتوفيق.
  21. مرحباً @هبة حمدان سبب عدم تغير القيمة الإفتراضية للإسم وهو أن نمط الوراثة في هذه الحالة protected أي أن الدوال و المتغيرات في الكلاس الأب المُعرفة على أنها public ستُصبح protected في الكلاس الإبن و بالتالي فإن الدالة setName ستُصبح محمية أي أنه لا يُمكنك إستخدامها في الدالة الرئيسية main بإمكانك تمرير الإسم من خلال بناء الكلاس Customer بهذا الشكل: class Customer{ protected: string name; public: Customer(string name = "Unknown"){ this->name = name; } string getName(){ return name; } void setName(string name = "Unknown"){ this->name = name; } }; و بالتالي عند إنشاء كائن من الصنف Customer يمكننا تحديد الإسم له، أيضا سنقوم بتوريث البناء للكلاس Invoice و تكون الطريقة كما هي موضحة أدناه: class Invoice : protected Customer{ private: float Total = 0; public: TV TVs[2]; Invoice(string name) : Customer(name){ for(int i=0;i<2;i++){ Total += TVs[i].price; } } } و في الدالة الرئيسية main يُمكننا عمل التالي: int main() { Invoice* x[2]; for(int i=0; i<2;i++){ x[i] = new Invoice("Invoice " + to_string(i)); // قمنا بتحديد الإسم هنا x[i]->Print(); x[i]->getMin(); cout<<"********************************"<<endl; } return 0; } بخصوص هذا الجزء إعادة التحميل أو overloading تسمح لنا بتعريف دوال تحمل نفس الإسم لكن بمُعاملات مُختلفة لِنقم بإعادة تحميل الدالة Print بهذا الشكل: void Print(string file) { ofstream f; f.open (file); f << "The Name is : " << name << endl; f << "Total is : " << Total << endl; f << "TVs: " << endl; for(int i=0;i<2;i++){ f << "TVs[" << i << "] = (Number = " << TVs[i].getNo() << ", Price = " << TVs[i].getPrice() << ")" << endl; } f.close(); } و هنا قمنا بإنشاء ملف بإسم قيمة المُعامل المُمرر و قمنا بملئه بجميع المتغيرات المحلية و الموروثة و في الأخير قمنا بإغلاق الملف. ليُصبح الكود بالكامل بهذا الشكل: #include <iostream> #include <fstream> using namespace std; /*---------------------------------------------------*/ class Customer{ protected: string name; public: Customer(string name = "Unknown"){ this->name = name; } string getName(){ return name; } void setName(string name = "Unknown"){ this->name = name; } }; /*---------------------------------------------------*/ class TV{ private: int no; public: float price; TV(){ cout << "The TV Number is : " << endl; cin >> no; cout << "The TV Price is : " << endl; cin >> price; } float getPrice(){ return price; } int getNo(){ return no; } void setPrice(float p){ price = p; } }; /*---------------------------------------------------*/ class Invoice : protected Customer{ private: float Total = 0; public: TV TVs[2]; void ReadPrice(){ for(int i=0;i<2;i++){ cout << "TVs[" << i << "] = (Number = " << TVs[i].getNo() << ", Price = " << TVs[i].getPrice() << ")" << endl; } }; int getTotal(){ return Total; } Invoice(string name) : Customer(name){ for(int i=0;i<2;i++){ Total += TVs[i].price; } } void Print(){ cout << "The Name is : " << name << endl; cout << "Total is : " << Total << endl; cout << "TVs: " << endl; this->ReadPrice(); } void Print(string file) { ofstream f; f.open (file); f << "The Name is : " << name << endl; f << "Total is : " << Total << endl; f << "TVs: " << endl; for(int i=0;i<2;i++){ f << "TVs[" << i << "] = (Number = " << TVs[i].getNo() << ", Price = " << TVs[i].getPrice() << ")" << endl; } f.close(); } int getMin(){ float min; min = TVs[0].price; for(int i=0 ;i < 2; i++){ if (TVs[i].price < min) min = TVs[i].price; } cout<<"The minimum :" << min <<endl; return min; } }; /*---------------------------------------------------*/ int main() { Invoice* x[2]; //customer y; for(int i=0; i<2;i++){ x[i] = new Invoice("Invoice " + to_string(i)); string filename = "output" + to_string(i) + ".txt"; x[i]->Print(filename); x[i]->getMin(); cout<<"********************************"<<endl; } return 0; } بإمكانك تجربة المثال من خلال هذا الرابط: هنا بالتوفيق.
  22. مرحباً @Mari Carmen هنا يطلب منك تغيير النص الموجود في الوسم h1 في حالة ملأ حقل الإدخال و الضغط على زر insert header هنا يطلب منك تغيير لون الخلفية للصفحة في حالة تحديد لون و الضغط على زر Apply إذا ضغط المُستخدم على أي فقرة يتغير لون خلفيتها إلى الأصفر. إذا ضغط المُستخدم مرتين على اي فقرة يتم إخفاؤها. إذا ضغط المُستخدم على زر show all paragraphs يتم إظهار كافة الفقرات في الصفحة. و هذه الإجابة على كل الأسئلة بالتفصيل: document.addEventListener("DOMContentLoaded", function() { // الإنتظار لحين تحميل كافة عناصر الصفحة let header = document.querySelector('h1'), // أول عنصر يحمل الوسم h1 allParagraph = document.querySelectorAll("p"), // جلب كافة الفقرات colorInput = document.querySelector("input[type=color]"); /* الإجابة على السؤال الأول تحديد كافة العناصر input التي تحمل القيمة Insert header و من أجل كل عنصر نضيف مستمع لحدث الضغط نجلب حقل الإدخال السابق للزر الذي تم الضغط عليه و نُعاين عدد محارف النص المًدخل إذا كان أكبر من 5 نُغير نص الوسم h1 و في الأخير نُفرغ الحقل. */ document.querySelectorAll("input[value='Insert header']").forEach(elm => { elm.addEventListener('click', function() { let headerInput = this.previousElementSibling; if (headerInput.value.length > 5) { // إذا كان عدد محارف النص المدخل أكبر من 5 header.innerText = headerInput.value; // نقوم بتغيير النص لعنوان الصفحة headerInput.value = ''; // إفراغ حقل الإدخل. } }) }); /* الإجابة على السؤال الثاني تحديد زر تغيير لون الخلفية إضافة مُستمع لحدث الضغط تغيير لون الخلفية للون الذي تم تحديده في حقل اللون */ document.querySelector("input[value='Apply to background']").addEventListener('click', function () {// إضافة مُستمع لحدث النقر على زر تغيير لون الخلفية document.body.style.backgroundColor = colorInput.value; //تغيير لون الخلفية }); /* الإجابة على السؤال الثالث عمل حلقة على كل عناصر الفقرة من أجل كل فقرة نضيق مُستمع لحدث الضغط تغيير لون خلفية الفقرة التي تم الضغط عليها إلى الأصفر تغيير لون خلفية الفقرات الأشقاء للون الأبيض */ allParagraph.forEach( p => { p.addEventListener('click', function () { this.style.backgroundColor = "yellow"; // تغيير لون خلفية الفقرة التي تم الضغط عليها // جعل لون خلفية بقية الفقرات أبيض allParagraph.forEach(item => { if (item != p) item.style.backgroundColor = "white"; }) }) }); /* الإجابة على السؤال الرابع عمل حلقة على كل عناصر الفقرة من أجل كل فقرة نضيق مُستمع لحدث الضغط المُزدوج إخفاء الفقرة المعنية */ allParagraph.forEach( p => { p.addEventListener('dblclick', function () { this.style.display = 'none'; // إخفاء الفقرة التي تم الضغط عليها مرتين }) }); /* الإجابة على السؤال الخامس تحديد زر إظهار الفقرات إضافة مُستمع لحدث الضغط عمل حلقة على كل فقرات الصفحة إظهار كل فقرة */ document.querySelector("input[value='Show paragraphs']").addEventListener('click', function () { allParagraph.forEach( p => { p.style.display = 'block'; }) }); }); بإمكانك تجربة الشيفرات من خلال موقع codepen من: هنا بالتوفيق.
  23. مرحباً بك، يُشير الخطأ إلى أن الدالة albiraq_copyright المُستعملة في الملف footer.php الموجود ضمن مُجلد القالب albiraq غير مُعرفة و ذلك في السطر 37 من نفس الملف تأكد أنها مكتوبة بنفس الإسم الذي تم تعريفها به و تأكد أنها موجودة و مُعرفة ضمن ملفات القالب. مبدئياً قم بإزالتها و ضع مكانها نص شكلي للتأكد من أنها تُسبب المُشكلة و بعد التأكد من ذلك إبحث عن مكان تعريفها ثم قم بتضمين الملف المُعرفة فيه كي تُصبح مرئية للملف الذي يُسبب الخطأ، هذا ما يُمكنني إستخلاصه من نص الخطأ لكن حتى نصل لحل المُشكلة يجب أن نكون على دراية بهيكلية الملفات و رؤية الأكواد.
  24. مرحباً @AbdulAziz ALsafi قبل سنوات كان عمل جافاسكرت ينحصر فقط على إضافة تفاعلية لصفحات الويب مع المُستخدم فهي تتعامل مع شجرة DOM بشكل جيد و يتم تنفيذ الأكواد المكتوبة بها من خلال المُتصفح و لا غنى عنها في هذا الموضوع لكن في السنوات الأخيرة قام أحد المُبرمجين بإنشاء بيئة تطويرية مُتعددة إعتمادا على مُحرك جوجل V8 سُميت ب node.js تسمح بتنفيذ أكواد و شيفرات جافاسكربت خارج المُتصفح الذي أعطى اللغة بُعداً آخر وأصبحت تُستخدم في مجالات أخرى غير المُتصفح كالتعامل مع الخوادم و غيرها، لذلك فكإجابة عن سؤالك يعتمد هذا على نوعية الأفكار التي تريد تطبيقها و جافاسكربت لاغنى عنها خصوصاً في الواجهة الأمامية بإمكانك الدمج في ما بينها حيث تستخدم جافاسكربت في الواجهة الأمامية و php في الواجهة الخلفية أو إستخدام فقط لغة جافاسكربت في كل من الواجهة الأمامية و الخلفية و تعتمد على node.js بالإضافة إلى أنه تم تطوير العديد من أطر العمل كَ express.js، أو nest.js او adonis.js او MeteorJS و غيرها التي سهلت التعامل مع node.js لبناء تطبيقات جانب الخادم فعالة و قابلة للتحجيم. و الأمر في الأخير يعود لك و يتعلق بماهية و نوعية الأفكار التي تريد عملها بالإضافة إلى المعرفة و الخبرات التي تمتلكها. بالتوفيق.
  25. مرحباً بك، SLA و هو إختصار ل (Service Level Agreement) أو عقد مُستوى الخدمة هو إتفاق بين طرفين أحدهما يكون مزود خدمة والآخر يكون العميل أو المستفيد من هذه الخدمة، بموجبه يتفق الطرفان على مستوى الخدمة المقدمة ويختلف عقد مستوى الخدمة عن عقد الخدمات، فهو لا يعني مجرد الاتفاق على تقديم خدمة بل أن موضوعه الأساسي هو مستوى أداء هذه الخدمة و سرعتها و جودتها. يتضمن العقد أيضاً التعويضات والجزاءات التي تترتب على الإخلال أو التقصير في أداء الخدمة. SLOs و هو إختصار ل (Service-level objective) و هو عنصر أساسي في اتفاقية مستوى الخدمة (SLA) بين مقدم الخدمة والعميل. يتم الاتفاق على SLO كوسيلة لقياس أداء مزود الخدمة ويتم تحديدها كطريقة لتجنب النزاعات بين الطرفين على أساس سوء الفهم. SLOs هي خصائص محددة قابلة للقياس لاتفاقية مستوى الخدمة مثل التوافر أو الإنتاجية أو التردد أو وقت الاستجابة أو الجودة. تهدف SLOs إلى تحديد الخدمة المتوقعة بين المزود والعميل وتختلف اعتمادًا على إلحاح الخدمة والموارد والميزانية. توفر SLOs وسيلة كمية لتحديد مستوى الخدمة التي يمكن أن يتوقعها العميل من الموفر. paging: في أنظمة تشغيل الحاسب هو مخطط لإدارة ذاكرة الحاسب، حيث يقوم الحاسب بتخزين البيانات واسترجاعها من وحدة التخزين الثانوية لاستخدامها في الذاكرة الرئيسية. في هذا المخطط، يسترجع نظام التشغيل البيانات من وحدة التخزين الثانوية في كتل من نفس الحجم تسمى الصفحات. يعد التصحيف جزءًا مهمًا من عمليات تشغيل الذاكرة الافتراضية في أنظمة التشغيل الحديثة، وذلك باستخدام وحدة التخزين الثانوية للسماح للبرامج بتجاوز حجم الذاكرة الفعلية المتوفرة. للتبسيط، الذاكرة الرئيسية تسمى "ذاكرة عشوائية" ووحدة التخزين الثانوية تسمى "القرص الصلب". و paging alert هو إنذار أو تنبيه يتعامل به نظام التصحيف a pull model and push model هما الاستراتيجيتان الترويجيتان المطبقتان لإيصال المنتج إلى السوق المستهدفة فعند تواجد استراتيجية الدفع تتمثل الفكرة في دفع منتج الشركة إلى العملاء من خلال توعيتهم بذلك عند الشراء ، وتعتمد استراتيجية الجذب على فكرة كيفية الحصول على العملاء وجعلهم ينجذبون للمنتج ، وتختلف كل من استراتيجية الدفع والجذب في الطريقة التي يتم بها التعامل مع المستهلكين . فالدفع هو تلك الاستراتيجية التي تستخدم فيها كل خبرات التسويق لدفع المنتج أو الخدمة إلى سوق المبيعات ، وهو ما يؤدي إلى رواج حركة المنتجات ، والخدمات ، والمعلومات ونقلها من خلال الوسطاء إلى المستهلك النهائي ، وفي هذه الاستراتيجية ، تقوم الشركة بتقديم منتجاتها إلى العملاء الذين ليسوا على علم بها ، ولا يسعون إليها. في حين أن الجذب يطلق على استراتيجية العمل التي تهدف إلى توليد الاهتمام ، أو الطلب على منتج معين ، أو خدمة معينة للجمهور المستهدف بطريقة ما. بالتوفيق.
×
×
  • أضف...