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

لوحة المتصدرين

  1. محمد ربيع زليول

    • نقاط

      4

    • المساهمات

      800


  2. Nabil Tayeh

    Nabil Tayeh

    الأعضاء


    • نقاط

      4

    • المساهمات

      421


  3. Abdalrhman Mohamad Atassi

    Abdalrhman Mohamad Atassi

    الأعضاء


    • نقاط

      3

    • المساهمات

      229


  4. Flutter Dev

    Flutter Dev

    الأعضاء


    • نقاط

      3

    • المساهمات

      787


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 06/24/20 في كل الموقع

  1. 2 نقاط
  2. يمكنك تنفيذ البرامج الموجودة ضمن هذه السلسلة (كما وسبق أن ذكرنا في المقدّمة) بطريقتين مختلفتين: الأولى هي تحميل وتنصيب بيئة التطوير المجّانيّة Visual Studio 2015 Community من مايكروسوفت. توفّر هذه البيئة خدمات عظيمة للمطوّر وتسهّل عمليّة كتابة البرامج إلى حدّ كبير. ويمكنك الاستفادة من مزايا تنقيح الأخطاء debugging المتقدّمة التي يوفّرها المنقّح debugger المرفق ضمن هذه البيئة. يمكنك تحميل نسختك المجّانيّة من هنا. الطريقة الثانية هي في استخدام الموقع NET Fiddle. الذي يوفّر مزيّة تنفيذ البرامج التي تكتبها على خادم خاص به، ومن ثمّ يعرض لك خرج البرنامج، بدون أن تمتلك نظام تشغيل ويندوز حتى. البرنامج الأول سنبدأ بمثال عمليّ لنسبر سريعًا أغوار هذه اللغة. شغّل برنامج Visual Studio 2015 Community ثم من القائمة File اختر الأمر New > Project. من نافذة مشروع جديد New Project، اختر من القسم الأيسر #Visual C ومن القسم الأيمن اختر Console Application. اكتب HelloWorld ضمن حقل الاسم Name في القسم السفلي، ثم اضغط زر OK. انظر الشكل التوضيحي التالي: قد تبدو الصورة مختلفة بعض الشيء لديك بحسب إعدادات الإظهار التي اخترتها. سيعمل Visual Studio على إنشاء هذا التطبيق وفتح ملف مُجهّز خصيصًا لك اسمه Program.cs. امسح محتويات هذا الملف بالكامل ثم انسخ الشيفرة التالية ضمنه: 1 using System; 2 3 namespace HelloWorld 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 Console.WriteLine("Hello World!"); 10 } 11 } 12 } اضغط المفتاحين Ctrl+F5 معًا لتبدأ عملية بناء build البرنامج وتنفيذه لتحصل على العبارة Hello World! في خرج البرنامج (أو من القائمة Debug > Start Without Debugging). رغم أنّ البرنامج السابق بسيط جدًّا إلًا أنّه يحتوي على الكثير من المفاهيم الجديدة التي سنتناولها تباعًا في هذه السلسلة. يبدأ هذا البرنامج بتعريف نطاق اسم namespace (السطر 3) اسمه HelloWorld وهو نفس الاسم الذي زوّدناه للبرنامج، سنتكلّم عن نطاقات الأسماء في درس لاحق، ولكن يكفيك أن تعرف الآن أنّ نطاقات الأسماء هي وسيلة لتنظيم الأصناف ضمن مجموعات مترابطة منطقيًّا. يأتي بعد ذلك تعريف صنف class جديد اسمه Program (السطر 5). يحتاج أيّ برنامج مكتوب بالسي شارب إلى نقطة دخول entry point لكي يبدأ تنفيذه. نقطة الدخول يجب أن تكون عبارة عن تابع method اسمه Main (السطر 7)، تكون التوابع عادةً ضمن الأصناف، يكفيك الآن أن تفهم التابع على أنّه شبيه بالدّالة function في لغات البرمجة الأخرى. أي هو جزء من الشيفرة يمكن استدعاؤه لتنفيذ ناحية وظيفيّة مُحدّدة في البرنامج وقد يُرجع قيمة ما أو لا يُرجع أيّ شيء. العبارة الموجودة في السطر 9 هي عبارة برمجّية قياسيّة في لغة سي شارب. وظيفة هذه العبارة استدعاء التابع WriteLine من الصنف Console وتمرير النص "!Hello World" له لكي يُظهر النص !Hello World في خرج البرنامج. أيّ عبارة برمجيّة في سي شارب يجب أن تنتهي بفاصلة منقوطة (;)، وقد تكون العبارة البرمجيّة مجرّد استدعاء تابع أو أن تكون عمليّة إسناد إلى متغيّر، أو قد تكون مزيجًا بينهما. إذا كانت لديك معرفة سابقة بلغات برمجة مثل C أو ++C أو Java ستلاحظ أنّ الصيغة النحويّة syntax للغة سي شارب تشبه إلى حدٍّ كبير الصيغة النحويّة لهذه اللّغات. حيث تُستخدم الحاضنات { } مثلًا لتحديد البداية والنهاية للتابع method وللصنف class ولنطاق الاسم namespace. وحتى أنّهما يشكّلان حدود أيّ بنية برمجيّة في لغة سي شارب مثل العبارات التكراريّة. انظر على سبيل المثال إلى السطر 6 لتجد الحاضنة "{" الخاصّة بالصنف Program وإلى السطر 12 لتجد حاضنة الإغلاق "}" له. كما ينبغي التنبّه أيضًا إلى كون لغة سي شارب حسّاسة لحالة الأحرف كما هو الحال في لغات البرمجة C و ++C و Java. ملاحظة يمكن استخدام المفتاح F6 في بيئة Visual Studio (أو من القائمة Build > Build Solution) لبناء البرنامج دون تشغيله (تنفيذه) وذلك اعتبارًا من الشيفرة والحصول على ملف تنفيذي منه له الامتداد exe في حال كان البرنامج لا يحتوي على أيّ خطأ. برنامج بسيط لجمع عددين صحيحين لنعمل الآن على برنامج عمليّ أكثر. سنكتب برنامج يعمل على جمع عددين صحيحين وإظهار النتيجة للمستخدم. اتبع نفس الخطوات التي أجريناها في البرنامج السابق لإنشاء برنامج جديد باسم SumTwoNumbers، انسخ محتويات الشيفرة التالية إلى الملف Program.cs: 1 using System; 2 3 namespace SumTwoNumbers 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 int a; 10 int b; 11 int c; 12 13 a = 3; 14 b = 4; 15 16 c = a + b; 17 18 Console.WriteLine("3 plus 4 equals: " + c.ToString()); 19 20 } 21 } 22 } يُقدّم هذا البرنامج البسيط مفهوم التصريح عن المتغيّرات والتعامل معها. صرّحنا في الأسطر من 9 إلى 11 عن ثلاثة متغيّرات a و b و c من النوع int. يجب التصريح في لغة سي شارب عن كل متغيّر قبل استخدامه في البرنامج. لاحظ أنّ التصريح عن متغيّر يتمّ بذكر نوعه ومن ثمّ اسمه. يستطيع المتغيّر من النوع int استيعاب أي عدد صحيح (دون فاصلة عشريّة) يقع بين 2,147,483,648- و 2,147,483,647. لاحظ أنّه قد أسندنا القيمتين 3 و 4 إلى المتغيّرين a و b على الترتيب، وذلك في السطرين 13 و14. نجري عملية الجمع والإسناد إلى المتغيّر c في السطر 16. وفي السطر 18 نعرض رسالة للمستخدم. يمكن إسناد قيمة للمتغيّر مباشرةً عند التصريح عنه. فمن الممكن مثلًا إسناد القيمتين 3 و 4 للمتغيّرين a و b على الترتيب عند التصريح عنهما وذلك بالشكل التالي: int a = 3; int b = 4; كما يمكن استخدام عبارة تصريح واحدة للتصريح عن عدّة متغيّرات بنفس الوقت. فمثلًا كان من الممكن التصريح عن المتغيّرات a و b و c السابقة بعبارة برمجيّة واحدة على الشكل التالي: int a, b, c; في الواقع هناك شكلان من أنواع المتغيّرات تدعمهما منصّة دوت نت. أنواع القيمة value types والأنواع المرجعيّة reference types. سنتحدّث عنهما لاحقًا. يُعتبر النوع int نوع قيمة. يجب إجراء عمليّة إسناد واحدة على الأقل إلى متغيّر قيمة قبل القراءة منه. وإلّا سنحصل على خطأ. جرّب حذف العبارة البرمجيّة الموجودة في السطر 16 والمسؤولة عن إسناد قيمة المجموع إلى المتغيّر c. نفّذ البرنامج وستحصل على الخطأ التالي: Use of unassigned local variable 'c' سبب ذلك أنّنا حاولنا قراءة المتغيّر c في السطر 18 دون أن نُسند أيّ قيمة له. العبارة البرمجيّة الموجودة في السطر 18 مسؤولة عن عرض الرسالة إلى المستخدم كما أسلفنا. ستلاحظ أنّنا مرّرنا التعبير expression التالي إلى التابع WriteLine: "3 plus 4 equals: " + c.ToString() التعبير البرمجي هو مفهوم موجود في جميع لغات البرمجة تقريبًا، وهو ببساطة ناتج عمليّة برمجيّة باستخدام عامل operator واحد أو أكثر، أو استدعاء إلى تابع أو مزيج بينهما. نسمّي عمليّة معالجة التعبير بتقييم التعبير expression evaluation. العامل المُستخدم هنا هو عامل ضمّ النصوص (+)، ولعلّك تستغرب لماذا أدعوه بعامل ضمّ النصوص رغم أنّه يشبه عامل الجمع العادي الذي يجمع عددين مع بعضهما (انظر السطر 16). يعود السبب في ذلك إلى نوع المُعامِلَين operands الموجودين على طرفيه. يمكنك أن تلاحظ بسهولة أنّ المعامل الأيسر هو النص: "3 plus 4 equals: " أمّا المعامل الأيمن فهو: c.ToString() وهو أيضًا نص ويعود سبب ذلك إلى استدعاء التابع ToString من المتغيّر c المعرّف أصلًا أنّه متغيّر من نوع int. ولكنّ استدعاء هذا التابع من المتغيّر c يؤدّي إلى الحصول على التمثيل النصّي للقيمة العددية الموجودة ضمنه أصلًا. فإذا كان المتغيّر c يحمل القيمة العددية 7، فإنّ التابع ToString سيُرجع النص "7"، الذي يعمل عامل الضم + على ضمّه مع النص الذي يسبقه لتكون نتيجة التعبير ككل هي: "3 plus 4 equals: 7" سيُمرّر هذا النص إلى التابع WriteLine لعرضه للمستخدم. أعتقد أنّك قد بدأت بفهم طريقة الوصول إلى التوابع واستدعائها في لغة سي شارب. فنحن نستخدم اسم الصنف (أو الكائن object كما سنرى لاحقًا) الذي يحوي التابع المراد استدعاؤه متبوعًا بنقطة ثم باسم التابع المطلوب، وبعد ذلك قوسين هلاليّين نمرّر بينهما الوسائط التي يطلبها التابع إذا اقتضت الضرورة لذلك. برنامج محسن أكثر لجمع عددين لقد تعلّمنا العديد من المفاهيم الجديدة من خلال البرنامجين السابقين. ولكن لعلّك قد لاحظت من برنامج جمع العددين السابق أنّ البرنامج جامد بعض الشيء. فهو يجمع عدّدين مُحدّدين سلفاً. سنعمل في هذه النسخة المطوّرة من البرنامج على استقبال العددين المراد جمعهما من المستخدم ومن ثمّ إجراء عمليّة الجمع عليهما وعرض النتيجة على المستخدم، مع بعض التحسينات الإضافيّة الأخرى. أنشئ مشروعًا جديدًا باسم EnhancedSumTwoNumbers ثمّ استبدل محتويات الملف Program.cs بالشيفرة التالية: 1 using System; 2 3 namespace EnhancedSumTwoNumbers 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 string str1, str2, result; 10 double num1, num2, sum; 11 12 //prompt user to get input for first value. 13 Console.Write("Input first number: "); 14 str1 = Console.ReadLine(); 15 16 //prompt user to get input for second value. 17 Console.Write("Input second number: "); 18 str2 = Console.ReadLine(); 19 20 //convert the input values to double numbers. 21 num1 = double.Parse(str1); 22 num2 = double.Parse(str2); 23 24 //perform sum operation. 25 sum = num1 + num2; 26 27 /*concatenate strings to form output 28 message which contains the result.*/ 29 result = num1.ToString() + " + " + num2.ToString() + " = " + sum.ToString(); 30 31 Console.WriteLine(result); 32 33 } 34 } 35 } نفّذ البرنامج بضغط المفتاحين Ctrl+F5 معًا. سيطلب منك البرنامج في البداية إدخال قيمة العدد الأوّل. أدخل القيمة المرغوبة ثم اضغط مفتاح الإدخال Enter. بعد ذلك سيطلب منك البرنامج إدخال قيمة العدد الثاني. أدخلها واضغط Enter. سيعرض البرنامج بعد ذلك النتيجة المطلوبة على شكل رسالة مناسبة. تحتوي هذه النسخة من برنامج جمع الأعداد على عدّة تحسينات: أصبح برنامجنا يدعم جمع أعداد تقبل فاصلة عشرية من خلال التصريح عن متغيّرات من النوع double (انظر السطر 10). والنوع double هو النوع الذي يقبل أعدادًا ذات فاصلة عائمة مزدوجة الدقّة. مجال الأعداد التي يقبلها يقع بين ±5.0*10-324 حتى ±1.7*10308. أصبح بإمكان مستخدم البرنامج أن يُدخل الأعداد المراد جمعها مباشرة من لوحة المفاتيح، وذلك من خلال التابع ReadLine من الصنف Console (انظر السطرين 13 و 16) يُوقف هذا التابع تنفيذ البرنامج وينتظر المستخدم أن يُدخل قيمة ما ويضغط مفتاح الإدخال Enter ليتابع البرنامج التنفيذ. أضفنا تعليقات توضيحيّة ضمن البرنامج. هذه التعليقات لا يكترث بها المترجم، ووظيفتها هي جعل الشيفرة البرمجيّة مقروءةً وسهلة الفهم والتعديل لاحقًا. في الحقيقة تُعتبر عمليّة كتابة التعليقات البرمجيّة فنًّا بحد ذاته، وأنصح أن يمارسها كلّ مبرمج بأيّ لغة برمجة كانت. في الواقع ليس مطلوبًا كتابة التعليقات البرمجيّة قبل كلّ عبارة برمجيّة، فعلى المرء أن يكون حكيمًا في استخدامها بالشكل الذي يحافظ فيه على التوازن بين جعل الشيفرة واضحة ومقروءة، وعدم الإفراط في كتابة التعليقات بدون ضرورة. تدعم لغة سي شارب نوعين من التعليقات: التعليقات على مستوى السطر، حيث يتجاهل المترجم compiler كلّ ما يقع على يمين الرمزين//. والتعليقات التي تمتد على عدّة أسطر، حيث يتجاهل المترجم المحتوى الموجود بين الرمزين /* والرمزين */. انظر الأسطر 12 و 16 و 20 و 24 من أجل التعليقات على مستوى السطر، والسطرين 27 و 28 من أجل التعليقات التي تمتدّ على عدّة أسطر. استخدمنا التابع Write بدلًا من التابع WriteLine (انظر السطرين 13 و 17)، والسبب في ذلك هو أنّنا نريد أن يطلب البرنامج من المستخدم إدخال القيمة على نفس السطر الذي تُعرَض فيه الرسالة وليس على سطرٍ منفصل. فالتابع Write يعرض النص المُمرّر إليه ولا يُحدِث سطرًا جديدًا. في حين يسلك التابع WriteLine نفس سلوك التابع Write ولكن ينتقل إلى سطر جديد بعد عرض النص. يمكنك أن تجرّب استبدال التابع WriteLine بالتابع Write لترى الفرق. جعلنا عمليّة تشكيل النص الذي سيُعرض على المستخدم ضمن سطر منفصل (السطر 29) وأسندنا هذا النص إلى المتغيّر result من النوع string. الهدف من هذا الأمر هو جعل الشيفرة نظيفة وواضحة وسهلة للقراءة. النوع string هو من الأنواع المرجعيّة reference types ويُستخدم للتعبير عن النصوص. ولكن تبقى هناك بعض العيوب التي لم نعالجها والتي قد تسبّب توقّف البرنامج عن العمل: تُعتبر القيم التي يدخلها المستخدم بواسطة التابع ReadLine أنّها قيم نصيّة. وحتى نستطيع التعامل معها كأعداد تقبل فاصلة عشريّة يجب تحويلها إلى قيم عددية من النوع double. نستطيع ذلك بسهولة من خلال التابع Parse من الصنف double. يقبل هذا التابع أن نُمرّر إليه قيمة نصيّة ليعيد إلينا التمثيل العددي لها من النوع double. ولكنّ السؤال هنا أنّه ماذا لو أدخل المستخدم بشكل غير مقصود (أو مقصود) القيمة النصيّة التالية "abc" للعدد الأوّل؟ عندما يصل تنفيذ البرنامج إلى السطر 21 سيعمل التابع Parse على تحويل القيمة "abc" إلى التمثيل العددي من النوع double وهذا ما لا يمكن حدوثه بالطبع، لذلك فسيرمي التابع Parse استثناءً Exception سيؤدّي إلى توقّف البرنامج عن العمل فورًا! سنتحدّث عن الاستثناءات في درس لاحق. وعلى أيّة حال يمكن حلّ هذه المشكلة بطريقتين مختلفتين سنتحدّث عنهما لاحقًا في هذه السلسلة. ولكنّ المغزى هنا هو أنّه لا تثق بمدخلات المستخدم مطلقًا. تُعتبر عملية ضم النصوص التي أجريناها في السطر 29 غير عمليّة وعادة برمجيّة غير جيّدة. يتعلّق هذا الأمر بالحقيقة طريقة تعامل سي شارب مع النصوص، سأترك الحديث عن هذه المشكلة وطرق حلّها عندما نتحدّث عن النصوص والتعامل معها في الدرس السادس. تمارين داعمة تمرين 1 اكتب برنامجًا يطبع العبارات التالية كما يلي على الشاشة: Today is Sunday. Tomorrow is Monday. Yesterday is Saturday. تمرين 2 اكتب برنامجًا يطلب من المستخدم إدخال قيمتين عدديتين، ومن ثمّ يوجد حاصل الضرب لهما (استخدام العامل *) وبعرض النتيجة على الشاشة. يجب أن يدعم البرنامج الأعداد ذات الفاصلة العشرية. الخلاصة تعرّفنا في هذا الدرس على الشكل الأساسيّ لأيّ تطبيق مكتوب بلغة سي شارب. كما تعاملنا مع ثلاثة برامج بسيطة للغاية وضّحت مبادئ كتابة برنامج باستخدام سي شارب. سنتناول في الدرس القادم موضوع المتغيّرات وأنواعها والعوامل والتعابير expressions بتفصيل أكبر.
    1 نقطة
  3. ماذا يريد هذا السؤال في الصورة؟ وأين الخلل في هذا الحل؟
    1 نقطة
  4. السلام عليكم عندما ارفع المشروع على GitHub هل يجب رفعه مرتين مرة ك مستودع و مرة من اجل GitHub pages شكرا لكم...
    1 نقطة
  5. السلام عليكم ورحمة الله وبركاته اخواني انا استخدم materialBetterSpinner لعرض اختيارات للمستخدم ولكن ما اعرضه هو نصوص للمستخدم مثل الاطفال \ الكبار \ المتوسطين وما شابه اسماء الاقسام في التطبيق وبعدها اقوم بتحويل النصوص الى ارقام وكل قسم له رقم محدد يساويه مثلا الاطفال=1 الكبار =2 ولكن التحويل برمجي يعني المستخدم لا يستطيع مشاهدة ما يحدث داخل الكود ثم اخذ هذا الرقم واقوم بادرجه الى قاعدة البيانات من خلال مكتبة volley لتوضيح العمليه اعلاه هذا الشكل الكود معي String[] SPINNER_DATA = {"Baby","woman " }; String[] SECOND_ARRAY = {"1","2"}; MaterialBetterSpinner materialBetterSpinner; materialBetterSpinner = (MaterialBetterSpinner) findViewById(R.id.material_spinner1); ArrayAdapter<String> adaptermatr = new ArrayAdapter<String>(MAddNewItem.this,android.R.layout.simple_dropdown_item_1line, SPINNER_DATA); materialBetterSpinner.setAdapter(adaptermatr); materialBetterSpinner.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { value = SECOND_ARRAY[position]; } }); واقوم بادرجه الى قاعدة البيانات بشكل التالي : private void upload() { StringRequest stringRequest = new StringRequest(Request.Method.POST, image_upload_url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); String Response = jsonObject.getString("response"); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("Section", value.toString().trim()); return params; } }; RequestQueue requestQueue = (RequestQueue) Volley.newRequestQueue(MAddNewItem.this); requestQueue.add(stringRequest); } طيب الان لدي مشكلة انا اقوم بحفظ بيانات المدخله من المستخدم في حقول edittext في sharedPreferences عشان لو خرج المستخدم فجاه وفتح التطبيق تكون البيانات موجوده ولمشاكل مختلفة متعدده ايضا من خلال الكود التالي : SharedPreferences share = getSharedPreferences("Data", Context.MODE_PRIVATE); SharedPreferences.Editor edit = share.edit(); edit.putString("token",materialBetterSpinner.getText().toString()); edit.commit(); واستددعي هذا البيانات من جديد من خلال الكود التالي : SharedPreferences share = getSharedPreferences("Data", Context.MODE_PRIVATE); materialBetterSpinner.setText(share.getString("token","")); المشكلة التي اوجهها الان لما اقوم باختيار القسم واعمل خروج واعود رح يسحب التطبيق البيانات من sharedPreferences بطبيعة الحال لني قمت بحفظها ولكن ما سيجلبه هو اسم القسم بمعنى سياتي لي ب النص ويعرضه مثل Baby","woman ولكن لو حاولت اقوم بادرج البيانات الان من خلال الفولي وعمل حفظ لهم بيكون فيه خطاء لدي المفترض ان نقوم بحفظ الرقم الذي يساوي لنا القسم المذكور او المعروض وليس النص او اسم القسم المطلوب الان ان يقوم ملف sharedPreferences بعرض النص للمستخدم وهذا الامر يحدث ولكن ان نحفظ الرقم الذي يساويه //الان هو يعرض النص ولكن لو جيت اعمل حفظ لقاعدة البيانات رح يقولي انه الحقل فارغ لنه هو حفظ النص الي موجود داخل sprin فقط وليس النص وقيمة value بحيث انه لم يرجع يستدعي البيانات تكون value تحمل قيمة اتمنى تكون المشكلة واضحه كيف يمكن حل هذا المشكلة ياليت اذا احد لديه فكره يساعدنا فيها
    1 نقطة
  6. تمت بنجاح function addBinary(a,b) { let sum = a + b return (sum >>> 0).toString(2); } addBinary(1,2) بارك الله فيك
    1 نقطة
  7. قمت بتعديل الإجابة لتشمل الشيفرة الرجاء الإطلاع عليها.
    1 نقطة
  8. و عليكم السلام حسين.. يريد منك كتابة دالة تقوم بجمع عددين و إرجاع قيمة حاصل الجمع في صيغة binary , علما بأن لك حرية الإختيار في تحويل العددين إلى binary أولا ثم جمعمها و إرجاع القيمة في صيغة binary أو جمع العددين كما هما و إرجاع القيمة على صيغة binary , أخيرا يعطيك ملاحظة بأن العدد binary يجب أن يكون string الخلل الرئيسي أن طريقة كتابتك للدالة خاطئة حيث أنك تقوم بعمل return خارج الدالة , هكذا يكتب البرنامج بطريقة صحيحة : function sumOfTwo(n1, n2){ let sum = n1 + n2; return (sum >>> 0).toString(2); }
    1 نقطة
  9. مرحباً حسين السبب هو عدم طباعتك للنتيجة التي تُرجعها الدالة أو الإقتران is_substring و للبحث عن ما إذا كان جزء نصي ينتمي إلى سلسلة نصية أخرى إستعمل الدالة التالية: def is_substring(s, l): return s in l print(is_substring('hello', 'hello Python')) و ستقوم بطباعة True في هذه الحالة بالتوفيق
    1 نقطة
  10. لا تظهر المخرجات لأنك لم تقم بطباعتها، يمكنك طباعتها عن طريق استخدام دالة print بدل كتابة: is_substring('balloon', '') أكتب: print(is_substring('balloon', '')) نفس الشيء بالنسبة لباقي العبارات.
    1 نقطة
  11. حسنا واجهت مشكلة هل هناك مشكلة بهذه الرسالة و لدي سؤال كيف يمكنني ضغط ملفات css و js بطريقة سهلة و سريعة او ما هي افضل طريقة شكرا لك..
    1 نقطة
  12. ليس بالضرورة، تحتاج فقط لعمل مستودع واحد، ويمكنك إستخدام هذا المستودع في Github pages. يمكنك متابعة الفيديو التالي، ستجد به كافة مراحل الإنشاء.
    1 نقطة
  13. السلام عليكم لدي سؤال انا انتهيت من بناء موقعين و 5 صفحات هبوط من خلال دورة تطوير واجهات المستخدم هل قسم 5 صفحات هبوط كاف لبدء على مواقع العمل الحر من خلال ان احول ملفات psd الى html css ام اني يجب اتمام المسار او التطبيق على صفحات هبوط اخرا اذا يجب عليي التطبيق على صفحات اخر من اين يمكنني ان اجد صفحات psd اذا كان القسم كاف فكيف يمكنني العمل ؟ يعني ما هي الخدمات التي يمكنني ان اقوم بها و ما الذي سوف اسلمه للعميل هل اسلمه ملفات المشروع فقط من خلال رفعها على GitHub مثلا او كيف ؟ شكرا لك
    1 نقطة
  14. أقصد من خلال التمرن على الأمثلة الموجودة داخل محتويات الدورة, وهي كافية جداً لتحسين مستواك.
    1 نقطة
  15. أنا أنصحك عدم الإستعجال وإكمال الدورة أولاً, حتى توضح أمامك الرؤية بشكل أفضل. حتى وإن كنت فعلاً تجد في نفسك المقدرة على دخول السوق, الأفضل التركيز في محتويات الدورة للحصول على الفائدة المرجوة.
    1 نقطة
  16. السلام عليكم الأفضل إنهاء المسار أولاً, والتمرن أكثر فأكثر, حتى تصل إلى المستوى المناسب لتقديم الخدمة بشكل ممتاز وتنال رضا العميل, لتحصل بالنهاية على تقدير يساعدك على الإستمرار.
    1 نقطة
  17. خلال مواضيع الأكادمية ستتعلم عن أساسيات C# وبعض مواضيع Xamarin. هذه المواضيع ستمكنك من صناعة بعض التطبيقات، لكنك ستحتاج إلى دراسة مواضيع أخرى أيضًا. الجزء الأكبر من تعلم لغة برمجية معينة، يكون عند تطبيقك لما تعلمته، بعد تعلمك للأساسيات حاول إنشاء تطبيق بسيط، وعندما تواجهك مشاكل حاول البحث عن حلول للمشاكل التي واجهتك، خلال عملية البحث عن الحلول ستتعلم الكثير من الأشياء الجديدة. وهكذا، في كل مرة ستنشئ فيه تطبيقًا جديدًا ستواجهك بعض المشاكل ستبحث عن حل لها وخلال بحثك وستتعلم وتتطور.
    1 نقطة
  18. مشكور أخ عثمان على ردك الكافي. لدي سؤال آخر أيضا عن جافا، فبعد ما بحثت عن أقسام جافا ظهر لي ٣ أقسام وهي: JAVA SE JAVA EE JAVA ME بحثت عن تفاصيل هذه الأقسام وما فائدة كل قسم ولكن لم أجد إجابة كافية، أتمنى ان تفيدني اذا كان لديك إجابة عن الموضوع ولك جزيل الشكر.
    1 نقطة
  19. وعليكم السلام ورحمه الله وبركاته، أضن SharedPreferences يمكن استعماله لخفض بيانات لاستعمال في اي جزء من البرنامج. في طرق غير لتحويل المعلومات من شاشة لشاشة. اذا تريد تحويل معلومات في String من Activity الى Activity استعمل putExtra. مثال في اكتيفيتي الاولى: : String text1 = editText.getText().toString(); Intent intent = new Intent(MainActivity.this, Activity2.class); intent.putExtra("text1", text1); startActivity(intent); بعدين في اكتيفيتي الثانية: editText.setText(getIntent().getStringExtra("text1")); و اذا تريد تحويل معلومات في String من Fragment الى Fragment استعمل Bundle. مثال في فراجمنت الاولى: // بعد انشاء و ابداء الفراجمنت String text1 = editText.getText().toString(); Bundle bundle = new Bundle(); bundle.putString("text1", text1); fragmentName.setArguments(bundle); بعدين في فراجمنت الثانية: Bundle bundle = getArguments(); if(bundle! = null){ editText.setText(bundle.getString("text1")); }
    1 نقطة
  20. مرحباً ... هناك العديد من خوارزميات الترتيب و قد ذكر لك الأخ محمد خوارزمية الترتيب بالإدراج بإمكانك الإطلاع على بقية الخوارزميات من خلال هذا الرابط للتعمق أكثر حول الموضوع: خوارزميات الترتيب على موسوعة حسوب و أنا سأذكر لك خوارزمية الترتيب السريع و شرح هذه الخوارزمية موجود في الصفحة التالية : إضغط هنا البرنامج بلغة سي بلس بلس : #include <iostream> using namespace std; // دالة لتبديل قيم متغيرين في الذاكرة من نوع عددي void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } // دالة مساعدة لطباعة عناصر مصفوفة عددية void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } // دالة الترتيب التصاعدي void ascQuickSort(int arr[], int l, int r) { if (l >= r) { return; } int pivot = arr[r]; // العنصر المحوري int cnt = l; for (int i = l; i <= r; i++) { if (arr[i] <= pivot) { swap(&arr[cnt], &arr[i]); cnt++; } } ascQuickSort(arr, l, cnt-2); ascQuickSort(arr, cnt, r); } // دالة الترتيب التنازلي void descQuickSort(int arr[], int l, int r) { if (l >= r) { return; } int pivot = arr[r]; int cnt = l; for (int i = l; i <= r; i++) { if (arr[i] >= pivot) { swap(&arr[cnt], &arr[i]); cnt++; } } descQuickSort(arr, l, cnt-2); descQuickSort(arr, cnt, r); } int main() { // تعريف مصفوفة و ملئها مبدئياً بمجموعة من الأعداد يمكنك تغيير طريقة الملء بطلب الأعداد من المستخدم لاحقاً int arr[] = {10, 7, 9, 1, 8, 5, 2}; // حساب عدد القيم التي تحتويها المصفوفة int n = sizeof(arr) / sizeof(arr[0]); ascQuickSort(arr, 0, n-1); // الترتيب التصاعدي printf("Ascending order: \n"); printArray(arr, n); // طباعة عناصر المصفوفة descQuickSort(arr, 0, n-1); // الترتيب التنازلي printf("Descending order: \n"); printArray(arr, n); // طباعة عناصر المصفوفة } نتيجة البرنامج : لتجربة البرنامج اونلاين: إضغط هنا بالتوفيق
    1 نقطة
  21. ستجدين الشرح الكامل للخوارزمية في هذه الصفحة: الترتيب بالإدراج. تشرح الصفحة طريقة عمل الخوارزمية مع شرح إنشائها بالطريقة التكرارية والتعاودية مع الأكواد. حسب السؤال المشار من طرفك، ستحتاجين الطريقة التعاودية. حل الخوارزمية كالتالي: #include <iostream> using namespace std; void insertionSortRecursiveAscending (int arr[], int n) { // الحالة الأساس if (n <= 1) return; // n-1 ترتيب أول العناصر التي تحمل القيمة insertionSortRecursiveAscending( arr, n-1 ); // إدراج العنصر الأخير في مكانه الصحيح ضمن المصفوفة المرتبة int last = arr[n-1]; int j = n-2; /* تحريك العناصر في المصفوفة arr[0..i-1] والتي تكون أكبر من المفتاح المعطى بمقدار موقع واحد عن موقعها الحالي */ while (j >= 0 && arr[j] > last) { arr[j+1] = arr[j]; j--; } arr[j+1] = last; } void insertionSortRecursiveDescending(int arr[], int n) { // الحالة الأساس if (n <= 1) return; // n-1 ترتيب أول العناصر التي تحمل القيمة insertionSortRecursiveDescending( arr, n-1 ); // إدراج العنصر الأخير في مكانه الصحيح ضمن المصفوفة المرتبة int last = arr[n-1]; int j = n-2; /* تحريك العناصر في المصفوفة arr[0..i-1] والتي تكون أصغر من المفتاح المعطى بمقدار موقع واحد عن موقعها الحالي */ while (j >= 0 && arr[j] < last) { arr[j+1] = arr[j]; j--; } arr[j+1] = last; } // دالة مساعدة لطباعة محتويات المصفوفة void printArray(int arr[], int n) { for (int i=0; i < n; i++) cout << arr[i] <<" "; cout << endl; } /* اختبار الدوال السابقة */ int main() { int i; int arr[10]; cout << "enter 10 numbers: " << endl; // نطلب من المستخدم إدخال 10 أرقام for (i = 0; i < 10; i++) { cin >> arr[z]; // نقرأ الأرقام من المستخدم } int n = sizeof(arr)/sizeof(arr[0]); insertionSortRecursiveAscending(arr, n); printArray(arr, n); // نطبع قيم المصفوفة التصاعدية insertionSortRecursiveDescending(arr, n); printArray(arr, n); // نطبع قيم المصفوصة التنازيلة return 0; }
    1 نقطة
  22. مرحبا مروان أنا لم أفهم جيداً ما الذي تريد عمله لكن حالياً أنت قمت بإضافة listener للحقل الأول فقط فإذا تغير هذا الحقل يتم حفظ القيمة الجديدة بأكثر من key و عند عملية الجلب ستكون القيمة نفسها في كل الحقول إذا كنت تريد حفظ البيانات كلها لكل الحقول يجب إضافة أكثر من listener أي لكل حقل أو يمكنك إضافة زر لحفظ كل البيانات يعني عند الضغط على الزر تجلب بيانات الحقول و تقوم بحفظها في ال SharedPreferences وإضافة زر آخر لجلب البيانات ووضعها في الحقول وسيتم جلب البيانات المخزنة في SharedPreferences يمكنك الإستعانة بهذا الفيديو الذي يشرح عن كيفية خزن و جلب البيانات في الهاتف بإستعمال SharedPreferences إذا لم يكن هذا ما تريد رجاءً إشرح جيداً و سنُساعدك بالتوفيق
    1 نقطة
  23. أهلًا بك، يمثِّل العنصر <meta> البيانات الوصفية التي لا يمكن تمثيلها باستخدام عناصر HTML المتعلقة بالبيانات الوصفية مثل <base> أو <link> أو <script> أو <style> أو <title>. للمزيد أنصحك بقراءة توثيق هذا العنصر من موسوعة حسوب لا يوجد شيئ اسمه افضل لغة برمجة.. وإنما هناك مجالات برمجة مختلفة لكل مجال لغات برمجة محددة وعادة تتميز احدى اللغات على اخواتها ضمن نفس المجال أرجو أن تقرأ عن مجالات البرمجة جميعًا ثم تقرأ عن لغات برمجة كل مجال ثم تنظر أيها مناسب أكثر لك من حيث انتشارها او سهولة تعلمها او طلبها في السوق او اي معايير اخرى تهمك لاحظ الإجابة على اسئلة مشابهة وردتنا
    1 نقطة
×
×
  • أضف...