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

طارق جهاد

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

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

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

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

    17

كل منشورات العضو طارق جهاد

  1. اخي الكريم بحسب سؤالك، فإنه يتم حفظ OrderMaster ولا يتم OrderDetails وعلى اعتبار OrderDetails هي قائمة المنتجات، بالتالي الاحتمال الاول للمشكلة، هو بعدم وصول قائمة المنتجات هذه إلى ميثود الحفظ addorder لذلك يجب أن نتتبع سير البيانات من لحظة الضغط على زر الحفظ وحتى الوصول إلى لحفظة الحفظ الى قاعدة البيانات. 1. عند الحفظ قم بطباعة محتوى الاوبجت المرسل ضمن data: JSON.stringyfy...، اولا قم بتخزين هذه القيمة ضمن متغير ضمن اطبعها باستخدام console.log الان يجب ان يظهر الأوبجكت (الذي يمثل الطلب وتفاصيله) كاملا ضمن Console الخاصة بالمتصفح 2. في حال كانت النقطة الأولى خاطئة، حاول البحث عن اخطاء املائية او منطقية ضمن كود جافا سكربت حتى يظهر الاوبجكت بالشكل الكامل 3. في حال كانت النقطة الاولى صحيحة، ننتقل للنقطة الثانية، وهي التأكد من الاوبجت ordermasterdetail الموجود ضمن ميثود الحفظ، وهنا يجب عمل Debug والتأكد بأن الطلب يحمل بيانات الطلب نفسه وقائمة المنتجات (التفاصيل). 4. في حال كانت النقطة 3 خاطئة، فأنت بحاجة لتصحيح اعدادات JSON لديك ضمن ASP.NET Core 5. في حال كانت جميع النقاط سليمة، فالخطأ سيكون ضمن Entity Framework واعني هنا، اما نقص باحد الاعمدة او بالعلاقات بين الجداول. في جميع الاحول، اذا لم تنجح معك اي من النقاط السابقة، يمكننا متابعة الكود سوية بالتوفيق،،،
  2. في الغالب هم قاموا باضافة دالة التحويل للعربية، لان الاجهزة لديهم لا تدعم العربية. ولكن هذه مشكلة (او نقص) بالجهاز او نظام التشغيل، وليست بالموقع نفسه، بما ان الجهاز لديك يحوي على تعريفات اللغة العربية، بالتالي سيعمل لديك بدون الحاجة لتحويل النص للغة العربية.
  3. تقصد نسخ ولصق النص الانجليزي. طبعاً هذا مرفوض تماماً، ولا علاقة لظهور العناوين باللغة العربية بالمشكلة الظاهرة. يتضح تماماً ان هناك دالة تقوم باستبدال الحرف الانجليزي بعد كتابته مباشرة. طبعاً هذه لا تعتبر مشاكل ولا عقبات امام المطور اطلاقاً، ولكن مع كل احترامي هي قلة معرفة من قبل الشركة!
  4. لا اقصد جهاز المستخدم، في الفيديو يظهر بان جهاز المستخدم يدعم اللغتين العربية والانجليزية، لذلك المشكلة هي بدالة ضمن Javascript تقوم باستبدال الاحرف عند الكتابة، هذه يجب ازالتها
  5. هل يحوي ملف HTML على السطر؟ <meta charset="utf-8"> اذا كان جهاز الحاسوب لديك يدعم اللغة العربية، فلا حاجة لاكثر من تعريف محتويات ملف HTML بالترميز UTF-8
  6. وعليكم السلام ورحمة الله. لا اعتقد ان العملية بحاجة اية مكتبات او لواحق، على العكس، يوجد قسم من الكود بحاجة ازالة لديك. لاحظت من خلال الفيديو وعندما تكون لوحة المفاتيح على اللغة الانجليزية، فإن الحرف يظهر باللغة الانجليزية أولا ثم يتم استبداله بحرف عربي. لذلك يوجد كود javascript اضافي يجب ازالته او تعديله
  7. وعليكم السلام ورحمة الله. اعتقد انت تريد حفظ الطلب وتفاصيله مرة واحدة، والمشكلة ربما تكمن في تفاصيل الطلب تكون فارغة. على العموم المرفق لا يعمل!
  8. وعليكم السلام ورحمة الله. تختلف العملية بحسب حجم المشروع، وبحسب التقنية التي تعمل عليها. ولكن أضعف الإيمان هي استخدام كلاس واحد، ولكن دعني اوضح بعض النقاط، لتطوير طبقة الاتصال بقاعدة البيانات بالشكل الأفضل. 1. نقوم بتعريف الدوال (الميثودز) الخاصة بالقراءة والكتابة على قاعدة البيانات ضمن Interface وليكن اسمه IDataRepository 2. نقوم بإنشاء كلاس، بحيث يرث من الـ Interface السابق، الآن تصبح لدينا تطبيق هذا الـ Interface او بمعنى اخر كتابة الكود الخاص بالاتصال بقاعدة البيانات. 3. نقوم بتسمية الكلاس بإسم يوافق اسم التقنية او قاعدة البيانات التي نعمل عليها، لنفترض اننا نتعامل مع MySQL فيكون اسم الكلاس بالشكل التالي IMySqlRepository 4. ضمن اقسام التطبيق لا نتعامل مع الكلاس مباشرة، بل نتعامل مع الـ Interface، بحيث يكون التطبيق لدينا بمعزل عن التقنية المستخدمة للتعامل مع قاعدة البيانات، بالتالي مستقبلا يمكن استبدال تقنية MySQL ب SQL Server، عندها نقوم بإنشاء كلاس جديد ISqlRepository، أو قد نتعامل مع ملفات XML فنقوم بإنشاء كلاس جديد ايضا IXMLRepository، دون اي تعديل على باقي اقسام التطبيق. وكنصيحة أخيرة، انصحك بإنشاء أكثر من Repository بمعنى كل قسم ضمن مشروعك يجب أن يكون له Interface وكلاس خاص به. على سبيل المثال، لو فرضنا انك تقوم بتطوير تطبيق مشتريات عبر الانترنت. فيمكنك عندها: 1. إنشاء طبقة بيانات خاصة بقراءة المنتجات والبحث فيها (IProductRepository) 2. إنشاء طبقة بيانات خاصة بالطلبات وسلة الشراء (IOrderRepository) 3. إنشاء طبقة بيانات خاصة بالإدارة (IAdminRepository) طبعاً يمكنك إنشاء الطبقات بحسب حجم المشروع واقسامه، ولكن الفكرة هي بتقسيم المشروع إلى أقسام صغيرة قدر الإمكان، بحيث تسهل عملية التطوير أولاً، ويصبح بالإمكان التعديل على الجزئيات دون أن تتأثر باقي أقسام المشروع. سأرفق مثالاً عملياً بلغة سي شارب وقواعد بيانات SQL لاحقاً إن شاء الله بالتوفيق...
  9. يجب عليك تنزيل NodeJs https://nodejs.org/en/download/ ولا تنسى تنزيل Cordova بعدها: npm install -g cordova بالتوفيق،،،
  10. اخي الكريم المتغيران x في كلاس a وكلاس b هما متغيران منفصلان، بمعنى ان الكلاس b لم يقم بوراثة هذا المتغير من الكلاس الأب a. وذلك لانك قمت بإعادة تعريفه من جديد بالتالي هو غير مفهوم بالنسبة ل a حاول اسناد قيمة x ضمن constructor الخاص بالكلاس b
  11. يوجد عدة طرق بإمكانك استخدام ابسط طريقة وهي: 1. قراءة id المستخدمين بشكل غير مكرر. 2. قراءة الرسائل من جدول الرسائل بناءاً على النتيجة السابقة SELECT * FROM Messages WHERE UserId IN (SELECT DISTINCT UserId FROM Messages) بالتوفيق،،،
  12. اخي الكريم، اخبرتك باستخدام Retrofit بالرابط المرفق، يوجد بالرابط تفاصيل عمليات Post, Get, Put,Delete وغيرها.
  13. انت بحاجة لاستخدام Http Client لتتمكن من التواصل مع خدمات الويب. للاندرويد استخدم مكتبة Retrofit https://square.github.io/retrofit/ الإشعارات المتزامنة: Push Notifications انت بحاجة لاستخدام GCM Google Cloud Messaging وهي خدمة سحابية. حيث ستقوم بإنشاء مشروع على هذه المنصة، ثم تقوم هي بإرشادك لضبط الإعدادات، ضمن الاندرويد. الفكرة ببساطة، انك ستقوم بتسجيل جهازك او Installation Id الخاص بجهازك على هذه المنصة، بالتالي يصبح جهازك قادر على استقبال الاشعارات. وعند استقبالك للاشعار ضمن اندرويد بإمكانك معالجته باكثر من طريقة. بالتوفيق،،،
  14. وعليكم السلام ورحمة الله. اخي الكريم فكر بالمثال التالي: ليكن لدي نموذج لتسجيل المستخدمين ضمن تطبيق معين، ومن ضمن حقول هذا النموذج يوجد حقل تاريخ الميلاد والذي هو حقل اختياري وليس اجباري. بمعنى يمكن للمستخدم تحديد تاريخ ميلاده او عدم تحديده. الآن، لنفرض اسم الحقل هو BirthDate ونوعه بالتأكيد DateTime DateTime BirthDate; الآن لدينا حالتين: 1. قام احد المستخدمين بالتسجيل، وتحديد تاريخ ميلاده 1/1/1990، لاحقاً سيقوم التطبيق بحساب عمر المستخدم بناءً على تاريخ الميلاد فيكون عمره حالياً 29 عاماً. 2. قام احد المستخدمين بالتسجيل، ولم يحدد تاريخ ميلاده! لكن قاعدة البيانات ترفض ان يكون هذا الحقل فارغاً، لذلك ستقوم انت او السي شارب نفسها بإعطاء القيمة الافتراضية لهذا النوع DateTime وستكون 1/1/0001، لاحقا سيقوم التطبيق بحساب عمر المستخدم، فيكون عمره الحالي 2019 عاماً!!!، او ربما تقوم انت بافتراض قيمة معينة في حال لم يقما المستخدم بادخال القيمة، مثلاً، 1/1/1980، بالتالي سيكون عمر المستخدم 39 عاماً، لكن هذا غير صحيح، وسيظهر بشكل ان المستخدم قام بتحديد تاريخ ميلاده. بالتالي ستضطر لحل اخر وهو كالتالي: تقوم بتعريف متغير جديد من نوع bool وليكن اسمه IsBirthDateSelected، وفي حال قام المستخدم بتحديد تاريخ ميلاده تكون قيمة هذا المتغير True وعلى هذا الاساس سيقوم التطبيق باحتساب عمر المستخدم، واذا كانت False لن يقوم باحتساب عمر المستخدم!!! لكن ألا ترى أن هذه العملية مرهقة، خصوصاً اذا كان لديك عشر متغيرات اختيارية ضمن نموذج التسجيل هذا!، وربما في كامل التطبيق يكون لديك عشرات الحالات المشابه، وستضطر انت دائما لعمل تزامل بين قيمة BirthDate وقيمة IsBirthDateSelected، وهذا العمل كلياً هو زيادة بالكود لا اكثر، فقط لتقوم بالالتفاف على نقطة ان قيمة تاريخ الميلاد فارغة، وان الحقل BirthDate يتطلب وجود قيمة. اذا الحل الامثل هو بجعل الحقل BirthDate قادر على ان يحمل قيمة فارغة، اي Nullable، ضمن سي شارب هذا يتم ببساطة بتعريف المتغير بالشكل التالي: DateTime? BirthDate; لاحظ وضعنا اشارة الاستفهام بجانب النوع،اي اصبح قادرا على احتواء قيمة فارغة، الآن ضمن التطبيق، انت بحاجة لمعرفه اذا كان هذا الحقل يحوي قيمة أم لا، ويتم ذلك بواسطة: if( BirthDate.HasValue) { // Calculate Age DateTime BirthDate = new DateTime(); int age = ((DateTime.Now - BirthDate.Value).Days) / 365; } لاحظ اننا قمنا بالتحقق من ان الحقل يحوي على قيمة او لا أولاً، ثم داخل جملة If قمنا بالوصول لهذه القيمة عن طريق BirthDate.Value اعتقد بأن الصورة اصبحت واضحة. الآن قم بقياس هذا المثال على باقي الأنواع الأخرى مثل int، bool, double وغيرها. بالتوفيق،،،
  15. بالتأكيد اخي الكريم، يوجد تطبيقات عربية مثل كريم، وطلبات وغيرها، لكن المنافسة في الغرب اقوى بالتاكيد
  16. نعم اخي الكريم يمكنك اختراق المواقع الكبرى، ولكنك بحاجة لمعرفة توازي او تتفوق قليلا على مطوري هذه المواقع. بالتوفيق،،،
  17. أخي الكريم، الأعضاء هنا في الأكاديمية يحاولون المساعدة أو يبحثون عنها لذلك يرجى توضيح سؤالك بشكل جيد أولاً، وتجنب تكرار الأسئلة حتى نحافظ على الأسئلة بشكل منظم ومرتب يستفيد منه باقي الأعضاء. بالتوفيق،،،
  18. بالطبع ليست thread واحدة، كما ذكرت Thread Pool ضمن سيرفر IIS يحوي تقريبا على 5000 thread، يمكنها استقبال الطلبات، ولكن بدل ان تنشغل إحدى هذه thread بالقراءة مثلا من قاعدة البيانات، فإنها تسليم العملية ل Thread اخرى، يتولى نظام التشغيل بإنشائها واسناد كل ما تحتاجه من مصادر. بينما تعود ال thread الاساسية إلى Thread Pool وتكون جاهزة لأداء مهمات اخرى، طبعا كل الكلام السابق يتم ضمن اجزاء من الثانية، اضف إلى ذلك ان نظام التشغيل مسؤول عن تنظيم عمل هذه ال threads لذلك يطلق عليه ايضا اسم Scheduler وهو ايضا المسوؤل عن ترتيب هذه ال threads لإدخال للمعالج لتنفيذها، لذلك يسمى ايضا Dispatcher او الموزع. كل ما انت بحاجة معرفته، انه من الافضل توزيع المهام على threads بحيث يمكن تسمية التطبيق عندها Multi-Threading Application اذا عملت في برمجة تطبيقات الويندوز او سطح المكتب، وكان لديك عملية طويلة نسبيا مثل القراءة من قاعدة البيانات، ستجد ان الواجهة ستتجمد لحين انتهاء القراءة من قاعدة البيانات، والسبب هو ان التطبيق افتراضيا يملك thread واحد، هي المسوؤلة عن ادارة او تنفيذ التطبيق على CPU، بالتالي عندما تنشغل هذه thread بالقراءة من قاعدة البيانات، لا يعود بإمكانها إدارة الواجهة، لذلك تتجمد الواجهة. والحل بالطبع هو استخدام thread اخرى للقراءة من قاعدة البيانات، وإبقاء ال thread الاساسية مسؤولة عن عرض واجهات المستخدم فقط. بهذا الشكل يصبح التطبيق متجاوب Responsive ملاحظة: عندما تتجمد الواجهة كما ذكرنا، ليست المشكلة في المعالج او نظام التشغيل، لانك لو شاهدت Task Manager ستجد ان المعالج مستخدم بأقل من 10%، اذا باستطاعته تنفيذ العديد من threads الأخرى بنفس اللحظة، وهي مهتمك في انشاء هذه ال threads، ومهمة نظام التشغيل والمعالج في ترتيبها وتنفيذها. في علوم الحاسوب دائما يستخدم مصطلح Resources للدالة على استخدام الذاكرة واستخدام المعالج، بمعنى كل Thread لدينا يقوم نظام التشغيل بحجز مكان لها في الذاكرة وترتيب الية دخولها إلى CPU لتنفيذها، وهذا امر طبيعي ولا يؤدي إلى عطل في السيرفر، باستثناء كان الكود الذي يتم على تنفيذه هو من يستهلك مصادر الجهاز الاخرى، مثل كتابة كمية كبيرة من البيانات على الهارد يسك، هذا يؤدي إلى بطىء بعمل النظام بشكل عام. لكن في النهاية كل ما يحدث ضمن السيرفر او اي كمبيوتر، هو مرور منظم للتيار الكهربائي وخاصة ضمن المعالج. انت تقصد GPU وهو معالج خاص بالرسوميات، لأنها تستهلك من مصادر النظام، لذلك تم فصل عمل الرسوميات بمعالج مخصص لها. وإبقاء CPU لمعالجات العمليات الأخرى. في أنظمة مثل Linux server قد لا يكون هناك واجهة رسومية اطلاقا حتى لا يتم استهلاك مصادر الحاسوب بسبب رسوميات لا فائدة منها على السيرفر، لان المستخدم لا يتفاعل مباشرة مع السيرفر، لذلك يتم ادارة السيرفر عن طريق Shell او Command Prompts ايضا ضمن ويندوز سيرفر ستجد ان الواجهات ليست بالكفاءة الموجودة على الويندز العادي، لنفس السبب أيضا. اخيراً: كل هذا التعقيد لا يفيد كثير اثناء تطويرنا للتطبيقات، لان المسؤولية الكبرى تقع على عائق إدارة السيرفر. كل ما نحتاجة هو فهم عام لألية العمل، بالإضافة لإتباع التعمليات الخاصة بكل تقنية. فدائما يوجد حل لكل مشكلة، فحتى الشركات الكبرى مثل فيسبوك، لايمكن ان يقوم سيرفر واحد بتخديم كل هؤلاء المستخدمين، وإنما يتم توزيع الفيسبوك على مجوعة من السيرفرز. بالتوفيق،،،
  19. Remote Connection هو ببساطة اتصال بجهاز اخر، اي ليس Local Connection الأمر يعتمد على طبيعة او مكان وجود السيرفر ومكان وجود المستخدم في تطبيقات الويب، كل التطبيق تعمل ضمن بيئة local )ما لم يكن نظام موزع طبعاً( ويقوم بالرد على المستخدم. الآن لو كان الرد على المستخدم بشكل صفحة html وتحوي على كود جافا سكربت، مثلا ويقوم هذا الكود بارسال طلبات للسيرفر للتحقق من اي بيانات، او ارسال ajax request، بالطبع هذا لم يعد local وإنما remote ايضا لان السيرفر على جهاز والمستخدم على جهاز بالتوفيق،،،
  20. تجعله يتأخر وليست سبب بأن يتوقف بمعنى يتعطل! كل طلب يصل إلى السيرفر تقوم thread باستقبال هذا الطلب والبدء بمعالجته، يحوي السيرفر على ما يسمى ب thread pool، اي مجموعة من threads بانتظار استقبال الطلبات ومعالجتها، لإن إنشاء thread جديدة عن وصول كل طلب امر مكلف نسبياً، لذلك وجد مفهوم thread pool هذا. الآن، سيرفر مثل iis تقريبا يحوي على 5000 thread، تقوم thread بمعالجة الطلب والعودة لانتظار طلب جديد، بالتالي هناك حد معين لمعالجة الطلبات، خاصة اذا كانت المعالجة تتطلب وقت طويل نسبياً. لو فرضنا ان تم استهلاك جميع threads ضمن thread pool بنفس اللحظة، وكانت كل thread مشغولة بمعالجة طويلة نسيباً، هنا تصبح استجابة السيرفر بطيئة، لانه سيقوم بتسجيل الطلب بانتظار انتهاء احدى threads لمعالجته. لذلك هذه النقطة جوهرية جداً، وقد لا ينتبه لها البعض، الا لاحقاً عندما يصبح هناك ازدحام طلبات على التطبيق، لانه بالتأكيد الاستخدام العادي لا يشكل فرقاً كبيراً. الآن نأتي للشق الثاني من السؤال async، بالتأكيد هي الحل، لكن وبما اننا كنا نتكلم عن threads وبأن كل thread مسؤولة عن استقبال الطلب ومعالجته حتى النهاية، اذا تطبيقنا حاليا عبارة عن single threaded application والحل بأن يكون multi threaded application. وهكذا تصبح الية العمل تقوم thread باستقبال الطلب وتمريره مباشرة الى thread اخرى لتقوم بمعالجته، وتعود هي فورا لتخديم المستخدمين او الطلبات الجديدة دون انتظار معالجة الطلب، وإنما بمجر انتهاء معالجة الطلب، تقوم thread المخصصة للمعالجة باخبار ال thread الاساسية بأنها انتهت، لتقوم بدورها بالرد على المستخدم. شاهد هذا المثال من بيئة ASP.NET Core public class NewsController : Controller { [HttpGet("news")] public async Task<IActionResult> News() { // Request now received by thread 1 for example. NewsViewModel model = new NewsViewModel(); // Request is being processed by another thread // The main thread now go back to serve another request/user // When the processing is finish, the thread will be informed. // and continue after that await model.GetNews(); // This code will not executed, until thread 2 finish its job return View(model); } } لاحظ كيف ان thread اخرى تقوم بمعالجة الطلب، واخبارنا عند انتهاءها. بالتوفيق،،،
  21. وعليكم السلام ورحمة الله. انت بحاجة إلى Web Service )فكر بها كموقع الكتروني( هي التي تقوم بتخزين بيانات المستخدمين وصورهم والمعالجة الاخرى للبيانات. الآن انت بحاجة لربط تطبيق الجوال مع هذه الخدمة Web Service، بحيث يقوم تطبيق الجوال بارسال بيانات لها، وهي تقوم بتخزين بيانات المستخدم ورفع الصور ووو. يتم التواصل بين تطبيق الجوال وبين الخدمة Web Service عن طريق Web API. يمكن انشاء هذه الـ Web API بإحدا تقنيات Server Side مثل PHP, Java, ASP.NET, Python, Ruby وغيرها. ويمكنك طلبها هذه الخدمة من اي تطبيق سواء كان تطبيقات جوال، تطبيقات سطح مكتب، او حتى تطبيقات ويب اخرى. بالتوفيق،،،
  22. بامكانك العمل على بيئة Untiy لتطوير الألعاب باستخدام سي شارب https://www.devu.com/tutorials/unity
  23. وعليكم السلام ورحمة الله. اخي الكريم بداية لتكن المقارنة دائما بهدف اختيار المناسب بدل ان تكون بهدف تحديد الافضل والدخول بجدالات عقيمة. هناك مجموعة اسئلة قد تسألها لنفسك لتحدد اي مسار يناسبك اكثر. 1. كم هو الوقت المتاح لك لتعلم تقنية او تقنيات جديدة؟ أرغب بالبدء بأسرع وقت بمشاهدة تطبيقاتي تعمل على اجهزة العملاء فهذا سيطعني دافع اكبر للتعلم والمواصلة )اذهب مع الخيار الثاني( لا مشكلة لدي بالوقت، المهم ان تكون تطبيقاتي متوافقة 100 % مع معايير غوغل وابل ومايكروسوف، مهما طال الوقت )اذهب مع الخيار الأول( 2. هل لديك العزيمة الكافية لتعلم ثلاث تقنيات متتالية بهدف انشاء تطبيق )اضف لها الميزانية الكافية( نعم اريد ان اتعلم الاندرويد بلغة الجافا، ثم انتقل إلى بيئة مختلفة تماما ولغة برمجة مختلفة تماما وابدء بتعلم سوفت و Xcode وابدء من الصفر في تطوير نفس التطبيق الذي طورته ضمن اندرويد، ثم اعيد نفس الكرة مع ويندوز )اذهب مع الخيار الأول( لا أريد ان تقل عزيمتي اثناء تعلمي هذه التقنيات ومواجهة مشاكل كل تقنية بحيث اقف عند نقطة ولا استطيع المتابعة، ولكن ارغب باستثمار وقتي وتطوير تطبيقات بتقنية واحدة ومواجهة المشاكل مرة واحدة، بحيث استطيع الانطلاق وبعدها قد افكر بتعلم كل تقنية على حدة )اذهب مع الخيار الثاني( 3. ما هي طبيعة التطبيقات التي تود تطويرها هل هي تطبيقات ألعاب، معالجة صور وفيديو او تطبيقات خدمية كالمتاجر الالكترونية وغيرها؟ تطبيقات معالجة الفيديو والصوت والتطبيقات التي تعتمد كثيراً على هاردوير الموبايل نفسه )اذهب مع الخيار الأول( التطبيقات الخدمية وتطبيقات التواصل الاجتماعي وتطبيقات معالجة البيانات )اذهب مع الخيار الثاني( تابع باقي الأسئلة مع نفسك، وستحدد بعدها اي تقنية/تقنيات مناسبة اكثر لك في الوقت والمتطلبات والامكانيات الحالية لديك، وتأكد دائما بأن هذا الامر قابل للتغيير وليس قرآناً. فقد تقوم بتغيير رأيك عند نقطة معينة وقد تغير التقنيات المستخدمة بل وقد تغير ما لا يخطر ببالك حالياً. بالتوفيق،،،
  24. بإمكانك تجربة هذا الكود: static void Main(string[] args) { bool isExit = false; do { // Ask the user Console.WriteLine("Do you want to enter grades?"); Console.WriteLine("Yes: Enter subject name"); Console.WriteLine("No: Enter 1"); // Check input if it is subject name (continue) or 1 (exist) string input = Console.ReadLine(); int number; isExit = int.TryParse(input, out number); // Input =1, exit if (isExit) return; // Continue enter grades Console.Write("Enter students count:"); int count = int.Parse(Console.ReadLine()); int[] grades = new int[count]; int sum = 0; for (int i = 0; i < count; i++) { Console.Write("Enter student " + (i + 1) + " grade:"); grades[i] = int.Parse(Console.ReadLine()); sum += grades[i]; } Console.WriteLine("--- REPORT ---"); Console.WriteLine("Subject Name: " + input); Console.WriteLine("Students Count: " + count); Console.WriteLine("Average: " + (sum / count)); Console.WriteLine("---------------------------"); Console.WriteLine(); } while (!isExit); } بالتوفيق،،،
×
×
  • أضف...