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

Mustafa Suleiman

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

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

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

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

    305

أجوبة بواسطة Mustafa Suleiman

  1. يتوفر الخيار append=True في الدالة to_excel()، وذلك هذا سيؤدي إلى إضافة البيانات الجديدة إلى نهاية الملف الموجود، دون استبدال البيانات الموجودة.

    كالتالي:

    Table2.to_excel("123456.xlsx", index=False, append=True)

    والنتيجة هي إضافة البيانات في Table2 إلى نهاية ملف 123456.xlsx.

  2. طريقة الاستدعاء الذاتي هي طريقة لجعل الدالة تستدعي نفسها بشكل متكرر حتى تتحقق حالة معينة/ ونستخدم يمكن تلك الطريقة لإنشاء خوارزميات تكرارية، مثل خوارزمية فيبوناتشي.

    def fibonacci(n):
        if n == 0 or n == 1:
            return n
        return fibonacci(n - 1) + fibonacci(n - 2)
    
    print(fibonacci(10))

    أو دالة لحساب عاملي العدد المدخل لها:

    def factorial(n):
        if n == 0 or n == 1:
            return 1
        else:
            return n * factorial(n-1)
    
    result = factorial(5)
    print("عاملين الثنائي لعدد 5 هو:", result)

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

    مثل جمع عددين بطريقة متداخلة:

    def add(x):
        def add_inner(y):
            return x + y
        return add_inner
    
    add_5 = add(5)
    result = add_5(3)
    print("جمع 5 و 3 هو:", result)

    أو دالة متداخلة لحساب المربع والتكعيب:

    def power(x):
        def square(y):
            return y ** 2
        
        def cube(y):
            return y ** 3
    
        return square(x), cube(x)
    
    result_square, result_cube = power(4)
    print("المربع هو:", result_square)
    print("التكعيب هو:", result_cube)

    أو  حساب مساحة الدائرة:

    def calculate_area(radius):
        def area_of_circle(radius):
            return 3.14 * radius * radius
        return area_of_circle(radius)
    
    print(calculate_area(5))

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

    • شكرًا 1
  3. من الأفضل حذف نسخة Node.js القديمة تمامًا uninstall ثم تثبيت النسخة الجديدة والتي يمكنك تحميلها من هنا:

    ودائمًا اختر النسخة المستقرة وهي LTS وهي إصدار 20 حاليًا.

    لكن هناك طريقة أفضل والتي يستخدمها مطوري Node.js لكن البعض قد يجدها معقدة قليلاً، وهي استخدام مدير إصدارات وهو NVM بمعنى أنه يمكنك تحميل أكثر من إصدار لـ Node والتنقل بينهم بكل سهولة باستخدام أمر بسيط.

    والأمر يتم كالتالي حذف أي إصدار Node.js لديك على حاسوبك من لوحة التحكم Control panel ثم تحميل وتثبيت NVM من:

    وبعد التثبيت قم بتنفيذ الأمر التالي في منفذ الأوامر:

    nvm install lts

    وذلك من أجل تثبيت أحدث إصدار مستقر متوفر.

    أو يمكنك تحميل إصدار معين من خلال:

    nvm install 18

    ثم قم بعرض الإصدارات الذي تم تثبيتها من خلال:

    nvm ls

    ولتفعيل إصدار معين اكتب رقمه فقط كالتالي:

    nvm use 18

    والآن أنت على إصدار 18 وتستطيع التأكد من خلال:

    node --version

    وإذا أردت التنقل إلى أي إصدار اكتب nvm use ورقم الإصدار بجانبه.

    • شكرًا 1
  4. من الصعب تحديد المشكلة، لكن:

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

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

    • شكرًا 1
  5. الأمر يعتمد على إتجاه الشرح في الكتاب، وستحتاج إلى معرفة بلغة جافا قبل قراءته حيث أنه مذكور التالي:

    "ينبغي أن تكون على معرفة جيدة بلغة البرمجة جافا قبل أن تبدأ بقراءة هذا الكتاب. وبالتحديد، لابُدّ أن تَعرِف كيف تُعرِّف صنفًا class جديدًا يمتدّ extend أو يرث من صنف آخر موجود، إلى جانب إمكانية تعريف صنف يُنفِّذ واجهة interface. إذا لم تكن لديك تلك المعرفة، فيُمكِنك البدء بسلسلة مدخل إلى جافا فهي مترجمة عن كتاب شهير يشرح لغة البرمجة جافا."

  6. أولاً هنا مشكلة في تبعية مكتبة androidx.activity:activity:1.8.0 في مشروعك، وهناك سببان محتملان لظهور تلك الرسالة:

    •  نسخة compileSdk في مشروعك حاليًا مضبوطة على 33، بينما تتطلب مكتبة androidx.activity:activity:1.8.0 استخدام نسخة 34 أو أعلى من واجهة برمجة تطبيقات أندرويد.
    • من الممكن أن تكون قد استخدمت نسخة خاطئة من المكتبة غير متوافقة مع نسخة compileSdk الحالية.

    ولذا عليك القيام بتحديث compileSdk:

    • افتح ملف build.gradle.kts الخاص بوحدة التطبيق (app module).
    • ابحث عن قسم android داخل الملف.
    • غيّر قيمة الخاصية compileSdk إلى 34 على الأقل.
    • تأكد من حفظ الملف وإعادة مزامنة بالضغط على Gradle (Sync Now).
  7. تحقق من المسار الرئيسي في ملف المسارات لديك، هل يوجد مسار كالتالي؟ على إفتراض أنك تستخدم express.js

    app.get('/', (req, res) => {
      // قم بمعالجة المسار "/" هنا
    });

    فالخادم يعمل لكن ويخبرك أنه لا يوجد المسار الذي طلبته.

  8. بتاريخ 2 ساعة قال Programmer Programmers:

    هل تقصد مجلد public

    انا الان انشأت مشروع لارافيل جديد لايحتوي على layout

    ليس مجلد public بل يوجد ملف باسم app.blade.php أو layout.blade.php أيًا كان الملف الرئيسي للمشروع لديك، وستجد بالضغط على مجلد resources ثم ستجد بداخله مجلد views والذي يحوي قوالب blade.

    1. افتح لوحة التحكم.
    2. انقر فوق "الأنظمة والأدوات".
    3. انقر فوق "إدارة مصادر البيانات".
    4. انقر فوق "إضافة".
    5. حدد "مصادر البيانات ODBC".
    6. انقر فوق "التالي".
    7. حدد "إنشاء مصدر بيانات جديد".
    8. انقر فوق "التالي".
    9. حدد "Oracle".
    10. انقر فوق "التالي".
    11. أدخل اسمًا لمصدر البيانات.
    12. أدخل معلومات الاتصال بقاعدة بيانات أوراكل.
    13. انقر فوق "التالي".
    14. حدد قواعد البيانات التي تريد استخدامها.
    15. انقر فوق "التالي".
    16. حدد خيارات الاتصال.
    17. انقر فوق "التالي".
    18. راجع معلومات مصدر البيانات.
    19. انقر فوق "إنهاء".
    • أضف مرجعًا إلى مكتبة ODBC.NET إلى مشروع C#.
    1. افتح مشروع C# الخاص بك في Visual Studio.
    2. انقر بزر الماوس الأيمن فوق مشروعك في نافذة "المستكشف".
    3. حدد "إضافة مرجع".
    4. حدد "مكتبات".
    5. حدد "مكتبات البرامج المثبتة".
    6. حدد "ODBC.NET".
    7. انقر فوق "إضافة".
    • إنشاء كائن OdbcConnection جديد للاتصال بقاعدة بيانات أوراكل.
    OdbcConnection connection = new OdbcConnection("DSN=OracleDB");

    حيث "DSN=OracleDB" هو اسم مصدر البيانات الذي أنشأته في الخطوة 2.

    • استخدم الكائن OdbcCommand لإنشاء استعلام SQL.
    • ثم استخدم الكائن OdbcDataReader لقراءة البيانات من استعلام SQL.

    مثال لتوضيح الأمر:

    using System;
    using System.Data.Odbc;
    
    namespace OdbcDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Create an ODBC connection object.
                OdbcConnection connection = new OdbcConnection("DSN=OracleDB");
    
                // Open the connection.
                connection.Open();
    
                // Create an ODBC command object.
                OdbcCommand command = new OdbcCommand("SELECT * FROM Customers", connection);
    
                // Execute the command.
                OdbcDataReader reader = command.ExecuteReader();
    
                // Read the data from the reader.
                while (reader.Read())
                {
                    Console.WriteLine("{0} {1}", reader["CustomerID"], reader["CustomerName"]);
                }
    
                // Close the connection.
                connection.Close();
            }
        }
    }

    أولا يقوم الكود بإنشاء اتصال بقاعدة بيانات أوراكل المسماة "OracleDB"، ثم سينشئ استعلام SQL لتحديد جميع البيانات من جدول "العملاء"، ثم سيقرأ البيانات من الاستعلام ويطبعها على وحدة التحكم.

  9. أرجو التعليق أسفل فيديو الدورة لمساعدتك بشكل أفضل وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.

    أولاً سأوضح لك فكرة  الوعود Promises.

    يمكنك التفكير في الوعود Promises في JavaScript على أنّها الوعود في الحياة الحقيقية.

    لنفرض أنّ طفلًا صغيرًا طلب من والده أن يشتري له لُعبةً ما و أخبره والده أنه يعده بأن يصنع له اللعبة إذا وجد مواد صنعها في الأسواق. و ذهب الأب للبحث عن هذه المواد أي أنّ الوعد الآن قيد التنفيذ (Pending) ، فإذا وجد الأب المواد سيشتريها و يصنع اللعبة للطفل و بذلك يكون قد وفّى بوعده أي تكون حالة الوعد الآن هي fulfilled أو resolved، أمّا إذا لم يجد هذه المواد فلن يشتريها و بالتالي لن يتمكن من صنع اللعبة أي لا يكون قد وفى بوعده أي تكون حالته rejected. 

    نفس هذا الأمر ينطبق على الوعود Promise برمجيًا.

    مثال لما يشبه الأمور التي نفعلها في الحياة الواقعية - في الحياة البرمجية:

    ”شيفرة مُنتِجة“ أي أنّها تُنفّذ أمرًا ما وتأخذ وقت. مثل الأكواد التي تقوم بتحميل البيانات عبر الشبكة. هذا الأب "في المثال السابق".

    ”شيفرة مُستهلِكة“  أي أنّها تطلب ناتج  ”الشيفرة المُنتِجة“  ما إن يُصبح جاهزًا. وهناك عديد من الدوال تحتاج إلى هذا الناتج. هذا الطفل ”في المثال السابق ينتظر اللعبة“.

    الوعد (Promise) هو كائن في جافاسكربت يقوم بالربط بين ”الشيفرة المُنتِجة“ و”الشيفرة المُستهلِكة“. في الحياة العملية، الوعد هو ”انتظار صنع اللعبة“. يمكن أن تأخذ ”الشيفرة المُنتِجة“ ما تلزم من وقت لتُقدّم لنا النتيجة التي وعدتنا بها، وسيقوم الوعد بتجهيزها لنا لأيّة شيفرة طلبتها متى جهزت.

    و صيغة الباني لكائنات الوعود تكون كما يلي:

    let promise = new Promise(function(resolve, reject) {
      // ‫المُنفِّذ (الشيفرة المُنتجة، مثل ”الأب“)
    });

    تُسمى الدالة التي يتم تمريرها إلى new Promise ”بالمُنفِّذ“. فمتى صُنع الوعد new Promise تعمل الدالة تلقائيًا. يحتوي هذا المُنفِّذ على الشيفرة المُنتجِة، ويمكن أن تُقدّم لنا في النهاية ناتجًا. في مثالنا، فالمُنفِّذ هذا هو ”الأب“.

    و تُقدّم جافاسكربت الوسيطين resolve و reject وهما ردود نداء.

    لا نضع الشيفرة التي نريد تنفيذها إلا داخل المُنفِّذ. و عليه مهمّة استدعاء resolve أو reject أي عليه أن يقوم بنداء/استدعاء  أحد ردود النداء resolve أو reject:

    • resolve(value)‎: لو اكتملت المهمّة بنجاح. 
    • reject(error)‎: لو حدث خطأ.

    و كائن الوعد promise الذي أعاده الباني new Promise له خاصيتين داخليتين، و هما:

    • الحالة state: و تبدأ حالة الوعد بالقيمة "pending" وبعدها تنتقل إلى "fulfilled" متى تم استدعاء resolve، أو إلى "rejected" متى تم استدعاء reject.
    • الناتج result: و يبدأ أولًا غير معرّف undefined، وبعدها يتغيّر إلى value متى تم استدعاء resolve(value)‎ أو يتغيّر إلى error متى تم استدعاء reject(error)‎.

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

    و set time out هي دالة تقوم بتنفيذ دالة معينة بعد مرور زمن محدد، وهي مفيدة لعمل جدولة مزمنية مثلا، ومثلها الدالة set interval التي تكرر نفسها اي تستدعي الدالة كل X ثانية مثلا.. يمكننا استخدام هتين الدالتين عندما نستطيع التحكم بالزمن وعمل جدولة زمنية. هنا نستخدمها لتحديث الرسائل أو الاشعارات مثلا كل 5 ثواني..

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

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

    • أعجبني 1
  10. وعليكم السلام محمود،

    لاحظ أنك وضعت علامة simi colon بعد دالة then أي علامة ; والتي تعني نهاية سطر الكود وبالتالي أي كود بعدها هو كود جديد.

    ولكن نحن نريد استخدام دالة catch لذلك نستخدم ميزة method chaining من خلال وضع نقطة بعد نهاية الدالة ثم كتابة الدالة الأخرى التي تستقبل النتيجة منها على شرط أن تلك القيمة لها علاقة بالدالة التي تأتي بعدها وتستقبلها وهنا دالة catch تستقبل الأخطاء ونقوم بالتعامل معها بداخلها.

    لذا احذف ; بعد then وسيتم حل المشكلة.

    waitt(7000).then(() => console.log(result)).catch((err) => console.log(err))

    وأرجو طرح السؤال أسفل الدرس وليس هنا لمساعدتك بشكل أفضل، فقسم أسئلة البرمجة هو للأسئلة العامة الغير متعلقة بالدورة.

    • أعجبني 1
  11. بل البدء مباشرة بـ Redux Toolkit، فذلك الإصدار يوفر الكثير من الميزات التي تجعل عملية تعلم واستخدام Redux أسهل بكثير، كما أنه لا يزال يتبع مبادئ Redux الأساسية، وفي الأصل تم تطوير  Redux Toolkit من أجل حل مشاكل كانت موجودة في Redux لذلك الإصدار الذي ينًصح باستخدامه هو Redux Toolkit.

    ولكن من الأفضل قبل ذلك تعلم كيفية استخدام الـ reducers في React حتى لا تستخدم التقنية بدون معرفة ما يحدث.

    • شكرًا 1
  12. الكود يعتمد على مفهوم list comprehension.

    حيث أن [i for i in range(5)] ستولّد مصفوفة هي [4, 3, 2, 1, 0]، وتوليد تلك المصفوفة سيتكرّر بحسب j في الحلقة الخارجية، وبما أنّ الحلقة الخارجية for j in range(6) ستتكرر 6 مرّات فهذا يعني تكرار الحلقة الداخلية 6 مرّات، أي توليد matrix لها ست صفوف و 5 أعمدة كالتالي:

    [
    [0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4]
    ]

    حيث الحلقة الداخلية (التي تحوي المتحوّل i) تولّد الأعمدة، والحلقة الخارجية التي يتحكّم بها المتحوّل j تولّد الأسطر.

    لكن ما معنى استقلال i عن j ؟ هما ليسا نفس المتحوّل، وكما قلت آنفاً لكل منهما وظيفة في الكود أحدهما في حلقة تولّد الأسطر والآخر في حلقة تولّد الأعمدة.

    وانت بحاجة إلى قراءة التالي لتفهم الأمر بشكل أفضل:

     

  13. المشكلة هي أنك تحاول المقارنة بين قائمة كاملة ورقم صحيح في السطر:

    if numbers<30:

    وذلك غير منطقي، فيجب أن قوم بالمرور على القائمة ثم مقارنة كل رقم بها مع رقم 30.

    وأنت قمت بذلك بالفعل في حلقة for، لكن استخدمت اسم القائمة الكاملة numbers بدلاً من أن تستخدم المتغير number في حلقة for.

    لاحظ أن أنك كتبت for number in numbers أي أن number هنا بدون s هو متغير يمثل كل رقم القائمة في كل تكرار لذلك نستخدمه هو داخل الحلقة.

    أي تصحيح السطر إلى:

    if number<30:

    وأرجو طرح السؤال أسفل الدرس وليس هنا لمساعدتك بشكل أفضل، فقسم أسئلة البرمجة هو للأسئلة العامة الغير متعلقة بالدورة.

  14. في البداية نقوم تهيئة المتغيرات:

    • numbers: يخزن قائمة الأرقام.
    • seen: هو قاموس فارغ سيتم استخدامه لتتبع الأرقام التي تم رؤيتها بالفعل.
    • dups: هي قائمة فارغة ستخزن الأرقام المكررة التي تم العثور عليها.

    بعد ذلك نقوم باستخدام حلقة التكرار   for للتكرار على الأرقام، من أجل تعداد كل رقم في قائمة numbers باستخدام حلقة for كالتالي:

    1. داخل الحلقة، نستخدم حلقة شرطية if، للتحقق مما إذا كان الرقم الحالي موجودًا بالفعل في قاموس seen.
    2. وفي حال كان الرقم غير موجود، فسيتم إضافته إلى قاموس seen بقيمة 1، بمعنى أن الرقم قد شوهد مرة واحدة.
    3. وإن كان الرقم موجودًا بالفعل في قاموس seen، يتحقق الكود مما إذا كانت القيمة المرتبطة بالرقم تساوي 1.
    4. وإن كانت القيمة 1، فذلك يعني أن الرقم قد شوهد مرة واحدة فقط من قبل، وهنا نقوم بزيادة القيمة إلى 2 وإضافة الرقم إلى قائمة dups، مما يعني أن الرقم قد شوهد الآن مرتين وهو بالتالي مكرر.

    بعد تكرار جميع الأرقام، ستحتوي قائمة dups على جميع الأرقام المكررة التي تم العثور عليها في القائمة الأصلية، ونقوم بطباعتها.

    وأرجو طرح السؤال أسفل الدرس وليس هنا لمساعدتك بشكل أفضل، فقسم أسئلة البرمجة هو للأسئلة العامة الغير متعلقة بالدورة.

  15. أنت لم تستخدم f-string كما أوضحت لك هنا حاول تطبيق الشرح وأخبرني إن واجهت مشكلة:

    وأرجو طرح السؤال أسفل الدرس وليس هنا لمساعدتك بشكل أفضل، فقسم أسئلة البرمجة هو للأسئلة العامة الغير متعلقة بالدورة.

  16. أرجو طرح السؤال أسفل فيديو الدرس لمساعدتك بشكل أفضل.

    نستخدم الحرف "f" كبادئة لتحديد (f-string)، والنصوص المنسقة هي وسيلة لتضمين قيم المتغيرات داخل سلاسل النصوص بطريقة سهلة وواضحة دون الحاجة إلى استخدام أوامر تكوين معقدة.

    أي تستطيع استخدام f-string لإدراج قيمة متغير داخل نص بالشكل التالي:

    name = "أحمد"
    age = 25
    
    # استخدام f-string لإدراج قيم المتغيرات في سلسلة نصية
    sentence = f"اسمي {name} وعمري {age} سنة."
    
    # طباعة النص المنشأ باستخدام f-string
    print(sentence)

    لاحظ دمج قيمة المتغير name في النص "اسمي {name}" وقيمة المتغير age في النص "عمري {age} سنة." بشكل مباشر.

    والعلامات المنسقة (f-strings)، هي طريقة جديدة متوفرة في Python 3.6 والإصدارات الأحدث.

    وتدعم f-strings مجموعة متنوعة من المعاملات لتنسيق البيانات داخل سلاسل، مثل معامل ".format()" لتنسيق البيانات بالطريقة التي تريدها، كالتالي:

    number = 12345.6789
    
    print(f"The number is {number:.2f}.")

    والنتيجة هي:

    The number is 12,345.68.

    لاحظ تم تنسيق الرقم.

  17. للأسف لا يوجد دورة خاصة بالتسويق والتجارة الإلكترونية في أكاديمية حسوب، ولكن يوجد قسمين بهما دروس ومقالات عن التجارة الإلكترونية والتسويق 

    أيضًا يوجد الكتب التالية:

     

  18. بتاريخ 11 دقائق مضت قال Ail Ahmed:

    تمام بس ليه دكتور دفيد ميلان عامل العكسيه فيه الكود ده

    #include <cs50.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        string names[] = {"ali" , "yomna" , "david"};
        string numbers[] = {"01112745" , "012743855" , "01017342"};
    
        string name = get_string("Name: ");
    
        for(int i = 0; i < 3; i++)
        {
            if(strcmp(names[i] , name) == 0)
            {
                printf("Fonud %s\n", numbers[i]);
                return 0;
            }
        }
        printf("Not Found\n");
        return 1;
    }

     

    مش المفروض تكون 1 في حاله الشرط تحقيق

    والعكس صحيح

    أنت على حق فذلك هو الشائع 1 تعني True و0 تعني Flase.

    لكن هنا يتم استخدام مفهوم آخر، ويعني أن 0 لم يحدث مشكلة بينما 1 تعني حدوث مشكلة ولم يتم العثور.

    ولتبسيط الأمر تخيل أن البرنامج يسألك "هل حدث مشكلة؟" وأنت تخبره لا لم يحدث مشكلة 0 لا يوجد مشكلة، حيث أنه أحيانًا ستجد في الدوال المدمجة في لغات البرمجة تقوم بإعادة -1 بدلاً من 0 في حال لم يتم العثور على أمر معين أي حدوث مشكلة.

    وفي حال حدوث مشكلة نخبره نعم 1 حدث مشكلة.

    لكن تلك الطريقة محيرة وأتفهم ذلك، لذا تجاهل ذلك واعتمد على الطريقة الشائعة وهي  1 تعني True و0 تعني Flase.

    ولمعلوماتك في C لا يوجد قيمة  boolean  لذلك نعتمد على الـ 0 و 1.

    • أعجبني 1
  19. بتاريخ 18 دقائق مضت قال احمد قايد:

    قمت بتجربة الامر في ثلاث اجهزة مختلفة , وثلاث متصفحات مختلفة بثلاث انظمة مختلفة, ولكن نفس المشكلة  

    اذا كان ممكن ان اشاركم معرفي في AnyDesk او TeamViewer

    بالطبع أرسل لي الـ address  الخاص بـ AnyDesk على الخاص

    • أعجبني 1
×
×
  • أضف...