programming

  • تفسير قصير: لماذا لا تعود sumBy في Kotlin بقيمة Long؟

    عند استخدام الدالة sumBy في لغة البرمجة Kotlin، يتم إرجاع قيمة من نوع Int. هذا يعني أن الدالة تقوم بإجراء جمع للقيم باستخدام دالة تحديد المفتاح (selector) وترجع نتيجة من نوع البيانات الصحيح Int. وفيما يتعلق بالسؤال حول سبب عدم إمكانية إرجاع Long، يمكننا أن ننظر إلى الاعتبارات التصميمية والأداء.

    غالبًا ما تمثل القيم من نوع Int نطاق قيم معقول لمعظم الحالات الاستخدام، وتكون كافية لتغطية القيم الناتجة عن الجمع. إذا كان هناك حاجة فعلية لاستخدام Long في حالات خاصة حيث تكون القيم كبيرة للغاية، يمكن للمطور أن يقوم بتحويل القيم يدويًا إلى Long بعد استرداد الناتج.

    وبالنسبة لحالات الحاجة الخاصة، يمكن استخدام الدالة sumBy بشكل عام ومن ثم تحويل الناتج إلى Long بواسطة البرمجة اليدوية، على النحو التالي:

    kotlin
    val sum: Int = myList.sumBy { it.someProperty } val sumAsLong: Long = sum.toLong()

    هذا يسمح بالاستفادة من وظائف الجمع القوية المقدمة بواسطة sumBy وفي الوقت نفسه يوفر مرونة في التعامل مع أنواع البيانات المختلفة.

    المزيد من المعلومات

    عند النظر إلى وظيفة sumBy في لغة البرمجة Kotlin، يُلاحظ أنها تُستخدم لحساب المجموع باستخدام دالة تحديد القيمة selector التي تعيد قيمة من نوع Int. هذه الوظيفة تعتبر جزءًا من مكتبة Kotlin القياسية المخصصة لمجموعات البيانات.

    عندما تقوم بتحديد دالة selector لتقديم قيم من نوع Int، يكون الناتج الكلي لدالة sumBy من نوع Int أيضًا. وهنا يكمن السبب في أن الدالة لا تعيد قيمة من نوع Long.

    تكون الحاجة إلى Long غالبًا عند التعامل مع مجموعات كبيرة من البيانات، حيث يمكن أن يؤدي تجميع قيم من نوع Int إلى تجاوز نطاق القيم الممكنة لهذا النوع. ومع ذلك، يبدو أن Kotlin اختارت البقاء على sumBy محدودة بنوع Int لأسباب أداء.

    للتغلب على هذا القيد، يمكنك استخدام sumByLong في حال كان لديك حاجة إلى ناتج من نوع Long. هذه الوظيفة تعمل بنفس الطريقة كـ sumBy ولكن تعيد قيمة من نوع Long.

    في الختام، يجدر بك أن تتأكد من احتياجات التطبيق الخاص بك والبيانات التي تعمل عليها لاختيار الوظيفة المناسبة لتجنب أية مشاكل محتملة في الأداء أو تجاوز الحدود المفروضة على أنواع البيانات.

  • حل مشاكل Fatal Error في PHP: دليل تصحيح أخطاء mysqli_execute

    فيما يبدو، تقوم بتطوير نظام مكتبة باستخدام لغة البرمجة PHP وقاعدة بيانات MySQL. واستنادًا إلى الأخطاء التي تظهر لديك، يبدو أن هناك مشكلة في تنفيذ استعلام الإدخال إلى قاعدة البيانات. دعنا نقوم بفحص الكود والتعرف على المشكلات المحتملة.

    أولًا، يُلاحظ أن لديك خطأ في كتابة اسم المتغير عند استخدام الدالة mysqli_connect. يجب أن يكون الاسم الصحيح هو $connection بدلاً من $mysli_link، لذا يجب تصحيح هذا الخطأ.

    php
    $stm = $connection->prepare("INSERT INTO users (username,password,first_name,middle_name,last_name,address,contact_no,email,activation_code) values(?,?,?,?,?,?,?,?,?)"); $stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE);

    ثانيًا، يجب تصحيح ترتيب استخدام دالة bind_param. يجب أن يكون النمط (types) أولًا، وبعد ذلك يتبعها القيم. في هذا السياق، يجب تغيير خط الربط إلى الشكل التالي:

    php
    $stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE);

    وتأكد من أن النمط (types) المستخدم يتناسب مع أنواع البيانات المتوقعة في الجدول.

    ثالثًا، قم بنقل تحضير الاستعلام ($stm->prepare()) إلى داخل الشرط if(isset($_POST['register'])) حتى لا يتم تنفيذه إلا إذا تم تقديم النموذج.

    php
    if(isset($_POST['register'])){ $USERNAME = trim(mysqli_real_escape_string($connection,$_POST['username'])); // ... (التعريفات الأخرى) $ACTIVATION_CODE = md5($USERNAME.(rand(0,1000))); $stm = $connection->prepare("INSERT INTO users (username,password,first_name,middle_name,last_name,address,contact_no,email,activation_code) values(?,?,?,?,?,?,?,?,?)"); $stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE); $stm->execute(); }

    بعد تطبيق هذه التحسينات، قد تجد أن مشكلتك قد حلت. يُفضل أيضًا إضافة إجراءات إضافية لمعالجة الأخطاء وتسجيل الأخطاء للمساعدة في تحديد المشاكل في المستقبل.

    المزيد من المعلومات

    بالطبع، دعنا نقوم بتوسيع المناقشة حول بعض النقاط الأساسية في الكود الخاص بك، وذلك لزيادة الفهم والتفصيل.

    أولًا، يُلاحظ أنك تقوم بفتح اتصال جديد بقاعدة البيانات باستخدام mysqli_connect وفي الوقت نفسه تستخدم المتغير $connection الذي تم فتحه بواسطة mysqli_connect. يُفضل استخدام نفس المتغير لتجنب اللبس وتحسين الأداء.

    php
    $connection = mysqli_connect('localhost', 'root', '', 'library_system') or die(mysqli_error());

    ثانيًا، يُلاحظ أنك تقوم بتهيئة القيم المتعلقة بالمستخدم من خلال استخدام mysqli_real_escape_string، ولكن يُفضل أيضًا استخدام استعلام محضر (Prepared Statements) لتحسين أمان البرنامج وتفادي هجمات حقن الشيفرة.

    ثالثًا، يجب عليك التحقق من نجاح عملية التحضير والربط قبل تنفيذ الاستعلام. يمكنك فعل ذلك بفحص قيمة $stm:

    php
    $stm = $connection->prepare("INSERT INTO users (username,password,first_name,middle_name,last_name,address,contact_no,email,activation_code) values(?,?,?,?,?,?,?,?,?)"); if ($stm === false) { die('Error in preparing statement: ' . $connection->error); } $success = $stm->bind_param("sssssssss", $USERNAME, $PASSWORD, $FIRST_NAME, $MIDDLE_NAME, $LAST_NAME, $ADDRESS, $CONTACT_NO, $EMAIL, $ACTIVATION_CODE); if ($success === false) { die('Error in binding parameters: ' . $stm->error); } if (isset($_POST['register'])) { // ... (التعريفات الأخرى) $ACTIVATION_CODE = md5($USERNAME . (rand(0, 1000))); $success = $stm->execute(); if ($success === false) { die('Error in executing statement: ' . $stm->error); } }

    رابعًا، قم بالتأكد من أن النمط الخاص بالربط ("sssssssss") يتناسب مع أنواع البيانات في جدول القاعدة. على سبيل المثال، إذا كان هناك حقول رقمية، يجب تعديل النمط وفقًا للأنواع الصحيحة.

    أخيرًا، يُفضل أيضًا تقديم رسائل أخطاء ونصائح أكثر وضوحًا إلى المستخدمين، وذلك لتسهيل فهم المشاكل في حالة حدوث أخطاء.

  • تنفيذ خريطة هاشماب في Kotlin لأنواع قيم متنوعة

    في لغة Kotlin، يمكن تحقيق خريطة (HashMap) تقبل أنواع قيم مختلفة عبر استخدام نوع البيانات الأب (Any) كنوع لقيم الخريطة. يعتبر Any نوعًا ديناميًا يمكن أن يشير إلى أي نوع في Kotlin. إليك كيف يمكن تعريف واستخدام خريطة مع قيم متنوعة:

    kotlin
    val template = "Hello {{world}} - {{count}} - {{tf}}" val context = HashMap() context["world"] = "John" context["count"] = 1 context["tf"] = true

    في هذا المثال، تم استخدام نوع Any لتحديد قيم الخريطة، وهذا يسمح لك باستخدام قيم من أنواع مختلفة مثل السلاسل (Strings)، الأعداد الصحيحة (Integers)، والقيم البولية (Booleans).

    تجنب استخدام new عند إنشاء الكائنات في Kotlin. بدلاً من ذلك، يمكنك ببساطة استخدام كلمة الرئيسية object لإنشاء كائنات من الأنواع الأساسية. لذلك، يكفي فقط استخدام:

    kotlin
    context["tf"] = true

    وبهذا يتم فهم أن تمثيل Boolean في Kotlin هو مباشرة true بدلاً من Boolean(true).

    هكذا، يمكنك الآن استخدام HashMap بنجاح مع قيم مختلفة في Kotlin دون الحاجة إلى تعبئة القيم بطرق معقدة.

    المزيد من المعلومات

    الآن، بمجرد أن قمت بتعريف خريطتك وتخزين القيم بها، يمكنك الوصول إليها بسهولة باستخدام مفاتيحها. على سبيل المثال:

    kotlin
    val worldValue = context["world"] // ستكون قيمة worldValue هنا "John" val countValue = context["count"] // ستكون قيمة countValue هنا 1 val tfValue = context["tf"] // ستكون قيمة tfValue هنا true

    يمكنك أيضًا إضافة المزيد من العمليات والمنطق إلى كودك لاستخدام هذه القيم بشكل أكثر تخصيصًا وفهمًا.

    في Kotlin، يمكن أيضًا استخدام التحويلات (casting) لتحويل القيم إلى أنواع محددة إذا كان ذلك ضروريًا. على سبيل المثال:

    kotlin
    if (tfValue is Boolean) { // تم تحديد tfValue كقيمة من نوع Boolean val booleanValue: Boolean = tfValue // يمكنك القيام بالعمليات المتخصصة هنا باستخدام booleanValue } else { // إذا لم تكن القيمة من نوع Boolean، يمكنك التعامل معها بشكل آخر هنا }

    هذا يمنحك قدرة أكبر على التحكم والتعامل مع القيم بناءً على النوع الفعلي لكل قيمة.

    باستخدام هذه الطريقة، يمكنك تصميم بنية البيانات الخاصة بك بشكل أكثر دقة وكفاءة، وضمان أن تكون القيم متوافقة مع النوع المتوقع.

  • حلا لخطأ في Swift: استخدام if case لتفادي مشكلة القيم الثابتة

    عند النظر إلى الشيفرة التي قدمتها، يبدو أن الخطأ الذي تواجهه هو في السطر الذي يحتوي على التعبير if colorTouched = inputs[indexOfNextButtonToTouch] {، حيث تحاول تعيين قيمة لثابت colorTouched الذي يتم إعلانه باستخدام let، وهو لا يمكن تعيين قيمة جديدة له بمجرد الإعلان.

    لحل هذه المشكلة، يمكنك استخدام if case بدلاً من if let للتحقق من تطابق القيمة مع القيم الممكنة. في حالتك، يمكن تعديل الشيفرة كما يلي:

    swift
    if case let colorTouched = inputs[indexOfNextButtonToTouch], colorTouched == ButtonColor(rawValue: buttonTag) { // تم التحقق من تطابق القيمة ويمكن القيام بالعمليات اللاحقة هنا indexOfNextButtonToTouch += 1 if indexOfNextButtonToTouch == inputs.count { // اللاعب نجح في إكمال هذه الجولة بنجاح if advanceGame() == false { playerWins() } indexOfNextButtonToTouch = 0 } else { // قم بأي عمليات إضافية إذا كانت هناك } } else { // في حالة عدم تطابق القيمة playerLoses() indexOfNextButtonToTouch = 0 }

    باستخدام if case، يمكنك القيام بفحص قيمة colorTouched ومقارنتها مع ButtonColor(rawValue: buttonTag) في نفس السياق دون الحاجة إلى استخدام if let، مما يتيح لك تجنب الخطأ الذي قد تواجهه.

    المزيد من المعلومات

    بالطبع، دعونا نقوم بتوسيع فهمنا للمشكلة وتقديم بعض المعلومات الإضافية المفيدة. يظهر أنك تقوم بتطوير تطبيق باستخدام لغة البرمجة Swift، وتواجه مشكلة في التعامل مع القيم الاختيارية وثوابت let في بيئة تطويرك.

    في الشيفرة التي قدمتها، يتم استخدام if let للتحقق من قيمة colorTouched وتعيينها من ButtonColor(rawValue: buttonTag)، ولكن تظهر مشكلة عند محاولة التعيين لـ colorTouched داخل الجملة الشرطية. هذا يعود إلى أن colorTouched هو ثابت let، وبالتالي لا يمكن تعيين قيمة جديدة له بمجرد الإعلان.

    تقوم الشيفرة بفحص ما إذا كانت القيمة المسترجعة من ButtonColor(rawValue: buttonTag) متاحة (if let) وتعيينها إلى colorTouched، ولكن بعد ذلك، تحاول تعيين قيمة جديدة لـ colorTouched في الشرط الثاني، وهذا يتسبب في الخطأ.

    الحلاقة التي اقترحتها تستخدم if case للقيام بالفحص والتحقق من التطابق دون الحاجة إلى استخدام if let، وهي تحل المشكلة التي تواجهك.

    بهذا، يمكنك الاستمرار في تطوير تطبيقك بسلاسة، ويمكنك دائمًا طرح المزيد من الأسئلة أو مشاركة مزيد من الشيفرة إذا كنت بحاجة إلى المزيد من المساعدة.

  • استخدام الشرط الثلاثي في Java: تسهيل وتبسيط التعابير

    في عالم برمجة Java، يُستخدم الرمز الاستفهامي (?) في سياق خاص يعرف باسم “تشغيل الشرط الثلاثي” أو “Conditional Operator”. هذا العامل يُستخدم لتبسيط كتابة التعابير الشرطية في بعض الحالات.

    لفهم كيف يتم استخدامه، دعنا نلقي نظرة على كيفية استخدامه في عبارة return وكيف يمكن أن يسهم في جعل الشيفرة أكثر وضوحًا وإيضاحًا.

    عندما يُستخدم الرمز ? في عبارة return، يُمكن استخدامه لتحديد قيمة العودة بناءً على شرط معين. على سبيل المثال، افترض أن لدينا دالة تقوم بمقارنة قيمتين وتُرجع القيمة الأصغر منهما. يمكننا استخدام الرمز ? لتحقيق هذا بشكل مختصر.

    java
    public int findMinimum(int a, int b) { return (a < b) ? a : b; }

    في هذا المثال، إذا كانت قيمة a أصغر من قيمة b، سيتم إرجاع قيمة a، وإلا سيتم إرجاع قيمة b. يمكن أن يكون هذا أكثر فهمًا من كتابة بيان if-else كامل.

    إضافة إلى ذلك، يُمكن استخدام الشرط الثلاثي لتعيين قيمة افتراضية في حالة عدم تحقق الشرط. على سبيل المثال:

    java
    public String getUsername(String name) { return (name != null && !name.isEmpty()) ? name : "Guest"; }

    في هذا المثال، إذا كانت قيمة name ليست فارغة وليست null، سيتم إرجاع قيمة name، وإلا سيتم إرجاع "Guest" كقيمة افتراضية.

    بهذه الطريقة، يمكن للشرط الثلاثي تقليل الشيفرة المطلوبة وجعلها أكثر قراءة وفهمًا، وهو أداة فعّالة لتحقيق تبسيط الشفرة وجعلها أكثر إيضاحاً.

    المزيد من المعلومات

    الشرط الثلاثي في Java يأخذ تعبيرين أو قيمتين ويقوم بإرجاع قيمة واحدة بناءً على تحقق شرط معين. يُعرف أيضًا بالاسم الشائع "Ternary Operator"، ويأخذ الصيغة العامة:

    java
    (condition) ? valueIfTrue : valueIfFalse;

    حيث يتم تقييم "condition"، وإذا كانت صحيحة، يُرجع "valueIfTrue"، وإذا كانت غير صحيحة، يُرجع "valueIfFalse". يُستخدم هذا الشرط بشكل شائع لتبسيط التعابير الشرطية البسيطة.

    على سبيل المثال، يمكن استخدام الشرط الثلاثي لتعيين قيمة متغير استنادًا إلى اختبار شرط:

    java
    int age = 25; String status = (age >= 18) ? "Adult" : "Minor";

    في هذا المثال، إذا كانت قيمة المتغير age أكبر من أو تساوي 18، ستكون قيمة status هي "Adult"، وإلا ستكون "Minor".

    يمكن أيضًا استخدام الشرط الثلاثي كجزء من تعابير أكثر تعقيدًا، مما يسهم في تحسين قراءة الشيفرة وتقليل حجمها. ومع ذلك، يجب استخدامه بحذر لضمان فهم صحيح للشيفرة وتجنب التعقيد الزائد.

    لاحظ أن الشرط الثلاثي لا يُعتبر بديلًا عن بنية التحكم if-else في جميع الحالات، ولا يُفضل استخدامه في حالات التحكم المعقدة أو الشروط الكبيرة.

  • فارق بين Arrays.stream() و Arrays.asList().stream() في Java

    في عالم لغة البرمجة جافا، يثير استخدام تعبيري “Arrays.stream(array)” و”Arrays.asList(array).stream()” تساؤلات حول الفارق الواضح بينهما، رغم أن الاعتقاد الشائع هو أن هذين التعبيرين يقومان بنفس العملية. إن المشهد البرمجي يتسم بالتفرد والتفاصيل الدقيقة التي يجب فهمها بعمق لتحديد تفوق الأول على الثاني.

    في البداية، يبدو أن كلا التعبيرين يقومان بتحويل المصفوفة إلى تيار (Stream)، ولكن الفارق يكمن في كيفية تعاملهما مع النوع الذي يتم إنشاءه. عند كتابة “Arrays.stream(scores)”، يتم تحويل المصفوفة مباشرة إلى تيار من الأنواع الأساسية (primitives) مثل IntStream. وهذا يعني أنه يمكن استخدام العديد من العمليات المتقدمة مباشرة على هذا التيار دون الحاجة إلى تحويل أخر.

    أما “Arrays.asList(scores).stream()”، فيعتبر تعبيرًا أكثر تعقيدًا. بمجرد استخدام “Arrays.asList(scores)”، يتم إنشاء قائمة (List) والتي تكون من نوع List (أو List حسب السياق). عند استخدام “stream()” على هذه القائمة، يتم إنشاء تيار من أنواع الكائنات (Objects) بدلاً من الأنواع الأساسية. هذا الفارق يمكن أن يؤدي إلى تأثيرات غير متوقعة عند استخدام بعض العمليات الخاصة بتدفقات الأنواع الأساسية.

    من هنا، يظهر السبب وراء عدم عمل الكود الثاني كما هو متوقع. حيث ينتج عنه تيار من نوع Stream بدلاً من Stream أو IntStream. لذا، عند محاولة طباعة العناصر باستخدام “System.out::println” يتم طباعة مرجع إلى الكائن (object reference) بدلاً من قيم العناصر.

    في الختام، يبرز هذا المثال أهمية فهم تفاصيل صغيرة في لغات البرمجة، حيث يمكن أن تؤدي الفروق الدقيقة في السياقات إلى نتائج مختلفة. يُحَبذ دائمًا التأكد من الفهم الكامل لكيفية تفاعل التعبيرات مع البيانات المحددة لتجنب المفاجآت غير المرغوب فيها في مسار التطوير.

    المزيد من المعلومات

    في البرمجة بلغة Java، يعتبر الفرق بين Arrays.stream(array) و Arrays.asList(array).stream() مهمًا للغاية ويعود ذلك إلى الفروق في الأنواع التي يتعاملون معها. دعونا نلقي نظرة أعمق على السبب وراء هذا السلوك المختلف.

    أولًا وقبل كل شيء، يقوم Arrays.stream(array) بتحويل المصفوفة إلى تيار من العناصر المباشرة. يتيح لك هذا الأسلوب القيام بعمليات تحويل وتحليل على العناصر بسهولة باستخدام واجهة Stream API المتقدمة. هذا يعني أنك تتعامل مع العناصر نفسها، وليس مع مجرد هيكل البيان (المصفوفة).

    على الجانب الآخر، Arrays.asList(array).stream() يقوم بتحويل المصفوفة إلى قائمة (List) ثم يحصل على تيار من هذه القائمة. لكن هنا يكمن الفارق الرئيسي، وهو أن Arrays.asList() تقوم بإنشاء قائمة واجهة List ثابتة الحجم وتقوم بربط هذه القائمة بالمصفوفة نفسها. وبالتالي، عند تغيير المحتوى في المصفوفة، ستظل القائمة مقيدة بحجم المصفوفة الأصلية.

    في المثال الخاص بك، عند استخدام Arrays.asList(scores).stream()، يتم الحصول على تيار للقائمة المحددة بحجم المصفوفة. ولكن عند استخدام .forEach(System.out::println)، يتم تطبيق الدالة println على القائمة ككل وليس على عناصرها الفردية، وبالتالي تحصل على إخراج غير متوقع يتضمن عنوان الذاكرة الرئيسي للقائمة.

    بالمقابل، Arrays.stream(scores) يأخذ المصفوفة ويقوم بتحويلها إلى تيار من العناصر الفردية، وبالتالي تستطيع تنفيذ .forEach(System.out::println) بطريقة تتيح لك طباعة كل عنصر على حدة.

    لحل هذه المشكلة عند استخدام Arrays.asList()، يمكنك استخدام Arrays.stream() مباشرة على المصفوفة، مما يجعل الشيفرة تعمل كالتالي:

    java
    Arrays.stream(scores) .forEach(System.out::println);

    هذا يضمن أنك تتعامل مع تيار العناصر الفردية بشكل صحيح دون القلق بشأن السلوك غير المتوقع الناتج عن Arrays.asList().

    باختصار، الفرق الرئيسي هو في كيفية تحويل الهيكل والتعامل مع العناصر، وهذا يلعب دورًا هامًا في سلوك الشيفرة والنتائج المتوقعة.

  • تحليل أخطاء الشيفرة PL/SQL: استعراض الدرجات وتصحيح الأخطاء

    في البداية، يظهر أن هناك بعض الأخطاء في الشيفرة البرمجية PL/SQL التي قد تحتاج إلى تصحيحها. لنقم بتحليل الشيفرة وتصحيح الأخطاء المحتملة.

    أولًا وقبل كل شيء، يبدو أن هناك خطأ إملائي في السطر الذي يحتوي على الكلمة “dected”، يجب تصحيحها لتكون “detected”.

    ثانيًا، في السطر الذي يحتوي على الجملة “IF numeric_grade IS NOT NULL THEN”، يجب تعديلها لتكون “IF vNumeric_grade IS NOT NULL THEN” لأن المتغير الذي تقوم بفحصه هو “vNumeric_grade” وليس “numeric_grade”.

    ثالثًا، يمكن تحسين التعليمة “OPEN gradeCursor;” بوضع فحص إذا كان المؤشر مفتوحًا بالفعل أو لا، لتجنب فتح المؤشر إذا كان مفتوحًا بالفعل. يمكن القيام بذلك باستخدام “IF NOT gradeCursor%ISOPEN THEN OPEN gradeCursor; END IF;”

    رابعًا، يفضل استخدام اسماء الأعمدة مع تحديد المتغيرات في عبارة FETCH، لذا يفضل استبدال “INTO vStudent_id, vSection_id, vNumeric_grade;” بـ “INTO vStudent_id, vSection_id, vNumeric_grade FROM gradeCursor;”

    وأخيرًا، يفضل استخدام رمز الاستفهام (?) في ORDER BY لتجنب الخطأ، يمكن تحديث “ORDER by numeric_grade;” إلى “ORDER BY numeric_grade ?;”

    بعد تصحيح الأخطاء المشار إليها، يمكن أن يكون الكود الصحيح كالتالي:

    plsql
    DECLARE vStudent_id grade.student_id%TYPE; vSection_id grade.section_id%TYPE; vNumeric_grade grade.numeric_grade%TYPE; CURSOR gradeCursor IS SELECT student_id, section_id, numeric_grade FROM grade WHERE student_id = 102 ORDER BY numeric_grade; BEGIN IF NOT gradeCursor%ISOPEN THEN OPEN gradeCursor; END IF; LOOP FETCH gradeCursor INTO vStudent_id, vSection_id, vNumeric_grade FROM gradeCursor; EXIT WHEN gradeCursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Student number: ' || vStudent_id); DBMS_OUTPUT.PUT_LINE('Section_id: ' || vSection_id); IF vNumeric_grade IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE('Numeric Grade: ' || vNumeric_grade); ELSE DBMS_OUTPUT.PUT_LINE('Numeric Grade: NULL'); END IF; END LOOP; IF gradeCursor%ISOPEN THEN CLOSE gradeCursor; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error detected'); IF gradeCursor%ISOPEN THEN CLOSE gradeCursor; END IF; END;

    تأكد من تنفيذ التعديلات المقترحة وتجربة الشيفرة الجديدة.

    المزيد من المعلومات

    في الشيفرة التي قدمتها، يظهر لي أنك تقوم بفتح مؤشر (Cursor) في PL/SQL لاستعراض الدرجات الخاصة بالطلاب. يتم اختيار الدرجات التي تنتمي لطالب محدد (student_id = 102) وترتب حسب الدرجة الرقمية (numeric_grade). الهدف هو عرض معلومات الطلاب ودرجاتهم الرقمية.

    لكن، هناك بعض الأخطاء والنقاط التي يجب مراعاتها:

    1. في الجملة:

      arduino
      IF numeric_grade IS NOT NULL THEN

      يجب أن تكون كالتالي:

      arduino
      IF vNumeric_grade IS NOT NULL THEN

      يجب استخدام المتغير vNumeric_grade الذي قمت بتعريفه في البداية بدلاً من numeric_grade.

    2. يمكن أن يكون من المفيد استخدام بنية IF-ELSIF-ELSE لفحص قيمة vNumeric_grade بدلاً من استخدام IF منفصلة.

    3. يمكنك استخدام حلقة FOR لتبسيط الشيفرة بدلاً من استخدام حلقة LOOP مع FETCH وEXIT WHEN.

    4. يمكن أيضًا إضافة رسالة خطأ أو توضيح عند حدوث أي خطأ في الشيفرة.

    5. يمكن تحسين تنسيق الشيفرة لجعلها أكثر وضوحًا وقابلية للقراءة.

    إذا كان هناك نقاط خاصة تحتاج إلى توضيح أو إذا كنت تواجه أي مشكلة معينة، يرجى تقديم توضيح إضافي لتتمكن من الحصول على المساعدة الأكثر دقة.

  • فهم الفارق بين Calendar.HOUR و Calendar.HOUR_OF_DAY في Java

    عند التعامل مع فئة الـ Calendar في لغة البرمجة جافا، يمكن أن تكون هناك بعض الالتباسات بين استخدام الثوابت Calendar.HOUR و Calendar.HOUR_OF_DAY. لفهم الفارق بينهما، يجب أن نلقي نظرة على كيفية تمثيل الوقت في هذه الفئة.

    تستخدم Calendar.HOUR لتمثيل الساعات في نظام الوقت القياسي (12 ساعة)، أي يمكن أن يكون القيم الممثلة لها من 0 إلى 11. على سبيل المثال، الساعة 1 بعد الظهر ستكون 1 إذا كانت في فترة الصباح، وستكون 1 أيضًا إذا كانت في فترة بعد الظهر.

    من ناحية أخرى، Calendar.HOUR_OF_DAY تستخدم لتمثيل الساعات في نظام الوقت العسكري (24 ساعة)، حيث تكون القيمة بين 0 و 23. على سبيل المثال، الساعة 1 بعد الظهر ستكون 13.

    لذلك، عندما تستخدم Calendar.HOUR فإنك تعتمد على نظام الوقت القياسي، في حين أن Calendar.HOUR_OF_DAY تقدم لك الوقت في صيغة 24 ساعة. اختيار الثابت المناسب يعتمد على متطلبات التطبيق الخاص بك. إذا كنت تحتاج إلى تمثيل الوقت بنظام 12 ساعة، استخدم Calendar.HOUR، وإذا كنت تفضل نظام 24 ساعة، استخدم Calendar.HOUR_OF_DAY.

    في حال كنت محتارًا أحيانًا بين استخدام الثابتين، يمكنك دائمًا التحقق من السياق الذي تستخدم فيه وفهم كيف يجب تمثيل الوقت في تطبيقك الخاص.

    المزيد من المعلومات

    بالطبع، دعنا نقوم بتوسيع فهمنا للثوابت Calendar.HOUR و Calendar.HOUR_OF_DAY وكيفية استخدامها في سياقات مختلفة.

    1. نظام الوقت:

      • Calendar.HOUR: يمثل الوقت في نظام 12 ساعة، حيث يبدأ من منتصف الليل وينتهي في منتصف الليل التالي، وتكون القيم من 0 إلى 11.
      • Calendar.HOUR_OF_DAY: يمثل الوقت في نظام 24 ساعة، حيث تمتد القيم من 0 إلى 23.
    2. الاستخدام الشائع:

      • Calendar.HOUR: يستخدم عادة في السياقات التي تتطلب تمثيل الوقت بتنسيق 12 ساعة مع فترات AM و PM.
      • Calendar.HOUR_OF_DAY: يستخدم عندما تحتاج إلى تمثيل الوقت بدقة في نظام 24 ساعة دون تقديم تفاصيل حول الفترات الزمنية.
    3. القيم المُعادة:

      • Calendar.HOUR: يُعيد قيم من 0 إلى 11، حيث 0 يمثل منتصف الليل و11 يمثل الساعة 11 مساءً.
      • Calendar.HOUR_OF_DAY: يُعيد قيم من 0 إلى 23، حيث 0 يمثل منتصف الليل و23 يمثل الساعة 11 مساءً.
    4. توضيح الارتباط مع الدقائق والثواني:

      • في كلتا الحالتين، تستخدم Calendar.MINUTE لتمثيل الدقائق (من 0 إلى 59)، و Calendar.SECOND لتمثيل الثواني (من 0 إلى 59).
    5. توجيه عام:

      • استخدم Calendar.HOUR إذا كنت تحتاج إلى تمثيل الوقت بتنسيق 12 ساعة مع AM و PM.
      • استخدم Calendar.HOUR_OF_DAY إذا كنت تفضل تمثيل الوقت بنظام 24 ساعة بدون تقديم لفترات AM و PM.

    في النهاية، يتعلق الاختيار بين Calendar.HOUR و Calendar.HOUR_OF_DAY بمتطلبات تطبيقك الخاص وكيفية تمثيل الوقت الذي يتناسب مع سياق العمل الخاص بك.

  • تفصيل الأرقام الإيجابية والسلبية باستخدام ArrayList في Java

    In order to separate positive and negative numbers in your ArrayList and achieve the desired output, you can enhance your Java code. Here’s an improved version of your code that accomplishes this task:

    java
    import java.util.ArrayList; import javax.swing.JOptionPane; public class PositiveNegativeSeparator { public static void main(String[] args) { ArrayList numbers = new ArrayList<>(); int num = Integer.parseInt(JOptionPane.showInputDialog("How many numbers?")); for (int i = 0; i < num; i++) { numbers.add(Integer.parseInt(JOptionPane.showInputDialog("Enter number #" + (i + 1)))); } // Separate positive and negative numbers ArrayList positiveNumbers = new ArrayList<>(); ArrayList negativeNumbers = new ArrayList<>(); for (int number : numbers) { if (number >= 0) { positiveNumbers.add(number); } else { negativeNumbers.add(number); } } // Display the results System.out.print("Positive numbers: "); for (int positive : positiveNumbers) { System.out.print(positive + ", "); } System.out.println(); // Move to the next line for better formatting System.out.print("Negative numbers: "); for (int negative : negativeNumbers) { System.out.print(negative + ", "); } } }

    This modified code creates two separate ArrayLists, positiveNumbers and negativeNumbers, to store positive and negative numbers, respectively. It then iterates through the original numbers ArrayList, categorizing each number accordingly. Finally, it prints the positive and negative numbers in the desired format.

    Now, if you input the example numbers (-2, -7, 8, 4, -1), the output will be:

    mathematica
    Positive numbers: 8, 4, Negative numbers: -2, -7, -1,

    Feel free to incorporate this code into your project and adjust it as needed.

    المزيد من المعلومات

    تعمل الشيفرة المحسّنة على فصل الأرقام إلى إيجابية وسلبية، وتقوم بطلب عدد معين من الأرقام من المستخدم باستخدام JOptionPane. بعد ذلك، يتم تخزين هذه الأرقام في ArrayList المسماة numbers.

    ثم يتم إنشاء ArrayList جديدة، وهي positiveNumbers و negativeNumbers، لتخزين الأرقام الإيجابية والسلبية على التوالي. يتم استخدام حلقة for-each للمرور عبر numbers وتصنيف كل رقم في القائمة المناسبة بناءً على إشارته.

    أخيرًا، يتم طباعة النتائج بتنسيق المطلوب. يُطبع الأرقام الإيجابية مع العبارة “Positive numbers: “، تليها القائمة المفصولة بفواصل. ثم يُطبع الأرقام السلبية بنفس الطريقة مع العبارة “Negative numbers: “.

    هذا البرنامج يعتبر مثالاً جيدًا على كيفية استخدام ArrayList وتقسيم الأرقام إلى فئات مختلفة باستخدام هيكل التحكم في Java. يمكنك استخدام هذه الطريقة في مشاريعك لفصل البيانات والتلاعب بها وفقًا لاحتياجاتك.

  • فهم سبب تصرف Boolean.getBoolean في Java

    عندما نلقي نظرة على الكود الذي قدمته، والذي يستخدم Boolean.getBoolean(Boolean.TRUE.toString())، قد يظهر الأمر غامضًا للكثيرين. يبدو أن هذا السطر من الكود يتحقق مما إذا كانت قيمة Boolean.TRUE.toString() تعيد true أم لا. ولكن المثير للدهشة هو أن النتيجة تعود بشكل غير متوقع إلى false.

    لفهم هذا التصرف، يجب علينا النظر إلى كيفية عمل Boolean.getBoolean(String) والتي تعتمد على قراءة خاصية النظام المعنية والتحقق مما إذا كانت قيمتها “true” أم لا.

    في المثال الذي قدمته، Boolean.TRUE.toString() يعيد النص “true”، ولكن هذا ليس كافيًا لجعل Boolean.getBoolean يرجع قيمة true. السبب في ذلك هو أن الدالة تقوم بقراءة قيمة خاصية النظام المرتبطة بهذا النص، وليس بمجرد التحقق من تطابق النص.

    إذاً، لا يُفترض أن يكون Boolean.getBoolean(Boolean.TRUE.toString()) يعيد true في هذه الحالة. وللإجابة على استفسارك حول عدم وجود توضيح واضح في وثائق JavaDoc، يمكن أن يكون هذا بسبب أن هذا الاستخدام الخاص قد يكون غير مألوف للعديد من المطورين، ولذلك لم يتم توضيحه بشكل كاف في الوثائق.

    المزيد من المعلومات

    لفهم أفضل حول سبب عدم عودة true عند استخدام Boolean.getBoolean(Boolean.TRUE.toString())، يجب أن نتناول كيفية عمل هذه الدالة ومفهوم الخصائص في Java.

    دالة Boolean.getBoolean(String) في Java لا تقوم بمجرد مقارنة النص المعطى بقيمة true أو false. بدلاً من ذلك، تقوم بالبحث في خصائص النظام (System Properties) للعثور على قيمة متعلقة بهذا النص. وفي هذا السياق، يشير “true” إلى اسم خاصية النظام.

    عندما تقوم بتشغيل الكود Boolean.getBoolean(Boolean.TRUE.toString())، يحاول النظام البحث عن خصائص النظام باسم “true”، وليس بقيمة “true”. وعندما لا تجد هذه الخاصية، تعود قيمة الاستعلام بالقيمة الافتراضية، التي هي false.

    بالتالي، يمكن أن يكون السبب الرئيسي وراء هذا التصرف هو عدم وجود خاصية النظام المسماة “true” في الخصائص النظامية، مما يؤدي إلى عودة القيمة الافتراضية التي هي false.

    تلخيصاً، يجسد هذا المثال كيف يجب علينا أن نكون حذرين عند استخدام Boolean.getBoolean، حيث يعتمد تصرفها على خصائص النظام، وليس على تحويل النص إلى قيمة بوليانية مباشرة.

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر