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

Mustafa Suleiman

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

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

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

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

    299

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

  1. إذا كان السؤال خاص بأحد الدورات فأرجو طرح السؤال أسفل الفيديو الخاص به في الدورة حتى نتمكن من مساعدتك.

    وإذا كان غير ذلك، فما هو الجدول الذي تقصده؟ 

  2. سأشرح لك من خلال خطوات بسيطة:

    1- إنشاء شكل HTML للفاتورة، باستخدام عناصر HTML المختلفة لتحديد تفاصيل الفاتورة مثل الشعار وتاريخ الفاتورة ومجموع الفاتورة وقائمة المنتجات.

    2- إنشاء مصفوفة JavaScript لتخزين تفاصيل المنتجات،  حيث يتم تخزين تفاصيل كل منتج في صف منفرد في المصفوفة، مثل اسم المنتج والكمية والسعر.

    3- إنشاء دالة JavaScript لإضافة منتج جديد إلى المصفوفة، لتحديد الصف الذي يجب إضافة المنتج إليه في المصفوفة، ثم إضافة التفاصيل الخاصة بالمنتج إلى هذا الصف.

    4- إنشاء دالة JavaScript لحساب مجموع الفاتورة بناءً على قائمة المنتجات الموجودة في المصفوفة، ويتم حساب المجموع الإجمالي عن طريق ضرب كمية المنتج بسعره وجمع قيم الناتج لكل المنتجات.

    5- ربط الشكل HTML بدوال JavaScript المناسبة، عن طريق استخدام العناصر HTML المختلفة مثل الأزرار وحقول الإدخال وتعيين وظائف JavaScript لهذه العناصر لتنفيذ العمليات المطلوبة على المصفوفة وحساب مجموع الفاتورة.

    مثال بسيط.

    HTML:

    <!DOCTYPE html>
    <html>
      <head>
        <title>Invoice</title>
        <script defer src="invoice.js"></script>
      </head>
      <body>
        <h1>Invoice</h1>
    <table>
      <thead>
        <tr>
          <th>Product</th>
          <th>Quantity</th>
          <th>Price</th>
        </tr>
      </thead>
      <tbody id="product-list">
        <!-- products will be added dynamically here -->
      </tbody>
      <tfoot>
        <tr>
          <td colspan="2">Total:</td>
          <td id="total">0</td>
        </tr>
      </tfoot>
    </table>
    <button id="add-item">Add Item</button>
    </body>
    </html>

    JavaScript:

    // تعريف المصفوفة الفارغة لتخزين المنتجات
    const products = [];
    
    // دالة لإضافة منتج إلى المصفوفة
    function addProduct() {
      // الحصول على تفاصيل المنتج من مدخلات المستخدم
      const name = prompt("Enter product name:");
      const quantity = parseInt(prompt("Enter quantity:"));
      const price = parseFloat(prompt("Enter price per unit:"));
    
      // إضافة المنتج إلى المصفوفة
      products.push([name, quantity, price]);
    
      // عرض قائمة المنتجات المحدثة
      const productList = document.getElementById("product-list");
      const row = document.createElement("tr");
      row.innerHTML = `<td>${name}</td><td>${quantity}</td><td>${price}</td>`;
      productList.appendChild(row);
    
      // حساب وعرض السعر الإجمالي
      const total = products.reduce((acc, curr) => acc + curr[1] * curr[2], 0);
      const totalElement = document.getElementById("total");
      totalElement.innerHTML = total.toFixed(2);
    }
    
    // إلحاق مستمع الحدث بزر "Add Item"
    const addItemButton = document.getElementById("add-item");
    addItemButton.addEventListener("click", addProduct);

    في المثال، قمت بإنشاء شكل HTML للفاتورة يحتوي على جدول يعرض قائمة المنتجات ومجموع الفاتورة، بالإضافة إلى زر لإضافة منتج جديد،  وربط الزر بدالة JavaScript التي تطلب من المستخدم إدخال تفاصيل المنتج الجديد، ثم تقوم بإضافة المنتج إلى المصفوفة وتحديث الجدول ومجموع الفاتورة.

    ومن الأسهل القيام بذلك عن طريق استخدام إطار عمل مثل Vue.js وهو ما أنصحك به لكونك تقومين حاليًا بتعلم PHP ولارافيل، لكونه متوافق بشكل كبير مع إطار لارافيل.

    وإليك نفس المثال باستخدام Vue.js.

    HTML:

    <!DOCTYPE html>
    <html>
      <head>
        <title>Invoice with Vue.js</title>
        <script src="https://unpkg.com/vue@next"></script>
      </head>
      <body>
        <div id="app">
          <h1>Invoice with Vue.js</h1>
          <table>
            <thead>
              <tr>
                <th>Product</th>
                <th>Quantity</th>
                <th>Price</th>
              </tr>
            </thead>
            <tbody>
              <tr v-for="(product, index) in products" :key="index">
                <td>{{ product.name }}</td>
                <td>{{ product.quantity }}</td>
                <td>{{ product.price }}</td>
              </tr>
            </tbody>
            <tfoot>
              <tr>
                <td colspan="2">Total:</td>
                <td>{{ total }}</td>
              </tr>
            </tfoot>
          </table>
          <button @click="addProduct">Add Item</button>
        </div>
        <script src="invoice.js"></script>
      </body>
    </html>

    JavaScript:

    const app = Vue.createApp({
      data() {
        return {
          products: [],
        }
      },
      methods: {
        addProduct() {
          const name = prompt("Enter product name:");
          const quantity = parseInt(prompt("Enter quantity:"));
          const price = parseFloat(prompt("Enter price per unit:"));
          const product = { name, quantity, price };
          this.products.push(product);
        }
      },
      computed: {
        total() {
          return this.products.reduce((total, product) => {
            return total + product.price * product.quantity;
          }, 0);
        }
      }
    });
    
    app.mount('#app');

    في المثال قمت ببناء تطبيق Vue.js باستخدام Vue.createApp وتم تعريف بيانات الـ data بحيث تكون القائمة الفارغة في البداية.

    وإنشاء دالة addProduct للتعامل مع إضافة منتج جديد بمجرد النقر على الزر "Add Item"، وباستخدام this.products.push تتم إضافة المنتج الجديد إلى القائمة.

    وتم إنشاء الحساب المرتجع باستخدام computed property لحساب المجموع الكلي للمنتجات باستخدام reduce.

    بعد ذلك، يتم ربط العنصر "product-list" في الجدول باستخدام v-for لإنشاء عنصر tr لكل منتج في القائمة.

    ثم استخدام @click للتعامل مع الحدث عند النقر على الزر "Add Item". تم ربط الزر بدالة `addProduct.

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

    وعرض المجموع الإجمالي في العنصر <span> المحدد بواسطة id="total".

  3. بتاريخ 39 دقائق مضت قال فوكس هاجي اف:

    ابحث عن دوره لي تصميم 

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

    ولا تنسى عرض رمضان:

    وإذا كنت تقصد دورة للتصميم، فما هو التصميم الذي تريد تنفيذه؟ فمجالات التصميم كثيرة.

    وهناك التصميم في أكاديمية حسوب يحتوي على دورس ومقالات حول التالي:

    1- تصميم تجربة المستخدم UX

    2- تصميم واجهة المستخدم UI

    3- الرسوميات

    • إنكسكيب
    • أدوبي إليستريتور

    4- التصميم الجرافيكي

    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب GIMP
    • كريتا Krita

    5- التصميم ثلاثي الأبعاد

    • 3Ds Max
    • Blender

    6- نصائح وإرشادات

    7- مقالات تصميم عامة

    وأيضًا هناك كتاب خاص بأساسيات تصميم الرسوميات في أكاديمية حسوب.

  4. أرفق صورة للمشكلة أو الخطأ الذي يظهر لك أو قم بنسخ النص.

     وعنوان الإعلان يكون ما بين 1 إلى 80 حرفًا، ولا يجب استخدام أي رموز أو أحرف غير صالحة.

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

  5.  الكود الذي قمت بكتابته في الصورة، هو ببساطة كود برمجي في بايثون يستخدم الدالة المسماة "f-string".

    والدالة f تساعد على تضمين قيم متغيرة داخل النصوص (strings) بطريقة مباشرة،  وفي حالتك، تم استخدام الدالة f لإنشاء رسالة ترحيبية تحوي اسم شخص معين من قائمة الأسماء (names) التي يتم تخزينها في المتغير names.

    وبشكل مفصل، يتم تعريف مصفوفة (list) تسمى names وتحتوي على ثلاثة عناصر (ahmed، hacen، waleed).

    ثم يتم استخدام الدالة f لإنشاء رسالة ترحيبية بإضافة اسم الشخص الأول في القائمة باستخدام تركيبة {names [0]} داخل النص الذي تم طباعته.

    وعند تشغيل هذا الكود، سيتم طباعة رسالة ترحيبية تحتوي على النص "Hello Ahmed"، ويمكن تغيير الرقم 0 إلى أي رقم آخر لطباعة رسالة ترحيبية تشمل اسم الشخص الذي يأتي في مكان الرقم في القائمة.

    مثلاً، بتغيير الرقم إلى 1 سيتم طباعة رسالة ترحيبية تشمل اسم الشخص الثاني في القائمة، وهكذا.

    لنأخذ مثالًا آخر لفهم الدالة f بشكل أفضل.

    لنفترض أن لدينا متغيرين a و b، ونريد طباعة رسالة تحوي قيمة المتغير a والمتغير b. يمكن فعل ذلك باستخدام الدالة f على النحو التالي:

    a = 10
    b = 20
    print(f'The value of a is {a} and the value of b is {b}')

    عند تشغيل هذا الكود، سيتم طباعة الرسالة التالية:

    The value of a is 10 and the value of b is 20

    في  المثال، قم  باستخدام الدالة f لإدخال قيم المتغيرات a و b داخل النص الذي يتم طباعته، وتحديد قيم المتغيرات باستخدام تركيبات المعايير {}، ثم  وضع قيمة كل متغير داخلها بواسطة استخدام فاصلة (،) وتحديد اسم المتغير داخلها، كما هو موضح في الكود.

    وبالإمكان استخدام الدالة f بشكل أساسي لأي نوع من البيانات، سواء كانت سلسلة نصية (string)، أو رقمية (numeric)، أو قائمة (list)، أو أي نوع آخر من البيانات المتاحة في Python.

    • أعجبني 1
  6. من الممكن أن يتم رفض العنوان لعدة أسباب، ومنها:

    1.  استخدام رموز أو أحرف غير صالحة في العنوان، مثل الأحرف الخاصة أو الرموز.
    2.  تجاوز الحد الأقصى لعدد الحروف المسموح به في العنوان.
    3.  عدم وجود اتصال بالإنترنت الجيد، وبالتالي فإن السناب شات لا يستطيع التحقق من صحة العنوان.
    4.  وجود خطأ ما في تطبيق السناب شات.

     يمكنك محاولة تغيير العنوان ليكون أقل من الحد الأقصى لعدد الحروف، وتجنب استخدام الأحرف الخاصة والرموز. كما يمكنك أيضًا المحاولة مرة أخرى في وقت لاحق أو التحقق من اتصال الإنترنت.

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

  7. 1- تأكد من أن Laravel مثبت على جهاز الخادم الخاص بك ويعمل بشكل صحيح، وأسهل طريقة هي باستخدام بيئة عمل Laragon وبعد تثبيتها قم بالضغط برز الفأرة الأيمن على واجهة البرنامج ثم اختر Quickapp بعد ذلك اختر Laravel.

    وستجد أنه تم إنشاء مشروع لارافيل، وباستطاعتك العثور على مجلد المشروع بالضغط على زر Root في واجهة Laragon. 

    2- قم بإنشاء API للاتصال بقاعدة البيانات الخاصة بك في Laravel، باستخدام Laravel's Eloquent ORM لإنشاء الاتصال بقاعدة البيانات.

    3- في Angular، قم بإنشاء خدمة (Service) للاتصال بـ API المنشأ في Laravel، وباستطاعتك استخدام Angular's HttpClient لإرسال الطلبات إلى API.

    4- إنشاء نموذج (Model) لبيانات تسجيل الدخول الخاصة بك في Angular.

    5- إنشاء نموذج (Model) في Laravel لبيانات تسجيل الدخول الخاصة بك.

    6- إنشاء ملف تحكم (Controller) في Laravel لإدارة عمليات تسجيل الدخول، من خلال استخدام الدالة "validate" في Laravel للتحقق من صحة بيانات تسجيل الدخول.

    7- بربط ملف التحكم في Laravel مع API الخاص بك.

    8- في Angular، قم بإنشاء نموذج (Model) لاستقبال الرد عند الاتصال بالـ API.

    9- في Angular، عليك بإنشاء مكون (Component) للتحكم بواجهة المستخدم لتسجيل الدخول وإرسال البيانات إلى الخدمة (Service).

    10- ربط المكون (Component) الخاص بك في Angular مع النموذج (Model) الخاص بك وخدمة (Service).

    مثال بسيط لكيفية إنشاء API في Laravel والاتصال بها من Angular:

    أولاً، يجب عليك إنشاء جدول لتخزين بيانات المستخدمين في قاعدة البيانات الخاصة بك.

    ولهذا المثال، سننشئ جدولًا باسم "users" وستكون لدينا الأعمدة التالية: "id"، "name"، "email"، و "password".

    ثانياً، قم بتحديث ملف "routes/api.php" في Laravel لإنشاء طريقة POST لإجراء تسجيل الدخول، و سنستخدم الطريقة "authenticate" لهذا الغرض، ويجب عليك إنشاء ملف تحكم (Controller) خاص بهذه الطريقة.

    // routes/api.php
    
    use Illuminate\Http\Request;
    
    Route::post('/authenticate', 'AuthController@authenticate');

    ثالثًا، قم بإنشاء ملف تحكم (Controller) جديد بالاسم "AuthController" وإضافة الطريقة "authenticate" إليه.

    حيث يتم التحقق من صحة بيانات تسجيل الدخول وإرجاع رمز مميز (token) عندما يتم إدخال بيانات تسجيل الدخول صالحة.

    // app/Http/Controllers/AuthController.php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    
    class AuthController extends Controller
    {
        public function authenticate(Request $request)
        {
            $credentials = $request->only('email', 'password');
    
            if (Auth::attempt($credentials)) {
                $user = Auth::user();
                $token = $user->createToken('MyApp')->accessToken;
    
                return response()->json([
                    'user' => $user,
                    'access_token' => $token,
                ]);
            }
    
            return response()->json([
                'message' => 'Invalid login credentials',
            ], 401);
        }
    }

    رابعاً، يجب عليك تثبيت "laravel/passport" وإعداده لاستخدامه مع Laravel.

    composer require laravel/passport

    ثم، قم بتشغيل الأمر التالي لتحديث قاعدة البيانات الخاصة بك:

    php artisan migrate

    وأخيرًا، يجب عليك إنشاء خدمة (Service) في Angular للاتصال بـ API المنشأ في Larave، وباستطاعتك استخدام HttpClient في Angular لإرسال طلب POST لـ API المنشأ في Laravel والحصول على رمز مميز (token) في حالة نجاح تسجيل الدخول.

    // auth.service.ts
    
    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    
    @Injectable({
      providedIn: 'root',
    })
    export class AuthService {
      constructor(private http: HttpClient) {}
    
      login(email: string, password: string) {
        return this.http.post<any>('/api/authenticate', { email, password });
      }
    }

    ويمكن استخدام الخدمة المنشأة في Angular في مكون تسجيل الدخول الخاص بك:

    // login.component.ts
    
    import { Component } from '@angular/core';
    import { AuthService } from '../auth.service';
    
    @Component({
      selector: 'app-login',
      templateUrl: './login.component.html',
      styleUrls: ['./login.component.css'],
    })
    export class LoginComponent {
      email: string = '';
      password: string = '';
    
      constructor(private authService: AuthService) {}
    
      onSubmit() {
        this.authService.login(this.email, this.password).subscribe(
          (response) => {
            console.log(response.access_token);
          },
          (error) => {
            console.log(error);
          }
        );
      }
    }

     

  8. بتاريخ 9 دقائق مضت قال درويش ابو سلطان:

    طيب كيف بدي اسجل رقم مش رقمي؟؟

    أنت بحاجة إلى استخدام تطبيقات توفر رقم لدولة أجنبية مثل تطبيق 2nr وقم بتجربة الأرقام لحين الوصول لرقم لم يتم استخدامه، أو يمكنك شراء رقم من نفس التطبيق أو ِشراء رقم من تطبيق pingme أو 5sim بتكلفة 1 دولار.

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

    إليك الخطوات:

    1- تعريف المتغيرات اللازمة للبرنامج، وهي:

    • مصفوفة من الحروف لتخزين الجملة المدخلة من المستخدم
    • متغير يمثل الحرف الأكثر تكرارًا في الجملة
    • متغير يمثل عدد مرات تكرار الحرف الأكثر تكرارًا في الجملة
    • متغير لتخزين عدد المرات التي يتكرر فيها الحرف الحالي في الجملة

    2- الطلب من المستخدم لإدخال الجملة وتخزينها في المصفوفة المعرفة في الخطوة الأولى.

    3- إنشاء حلقة for لتحليل الجملة حرفًا حرفًا.

    4- داخل حلقة for، تعيين قيمة العداد للحرف الحالي إلى 1.

    5- داخل حلقة for، دوران حلقة ثانية مضمنة داخلها لحساب عدد مرات تكرار الحرف الحالي في الجملة.

    6-داخل حلقة for الثانية، إذا تم العثور على حرف يتطابق مع الحرف الحالي، فزيادة قيمة العداد.

    7- داخل حلقة for الثانية، إذا تم العثور على حرف بتردد أعلى من الحرف الحالي، تعيين قيمة الحرف الأكثر تكرارًا إلى هذا الحرف وتحديث قيمة المتغير المعد لحساب عدد مرات تكراره.

    8- طباعة الحرف الأكثر تكرارًا وعدد مرات تكراره.

  10. بتاريخ 6 دقائق مضت قال درويش ابو سلطان:

    لقد قمت بعملية تسجيل حساب على chatgpt لكن عند تسجيل رقم الهاتف تظهر ملاحظه انه تم استخدام الرقم اكثر من مره ولا يرسل لي رقم كود

    ذلك يعني أنك تستخدم رقم هاتف من أحد التطبيقات التي توفر رقم هاتف أجنبي من دولة مدعومة في ChatGPT وأشهرها تطبيق 2nr البولندي، لذلك عليك بتجربة رقم آخر لحين الوصول لرقم لم يتم استخدامه بالحد الأقصى وهو حسابين لكل رقم.

     

     

  11. الأسئلة الإختبارية أو الخاصة بالمشاريع يتم توفير خطوات الحل فقط لها، أو مساعدتك في الكود إذا تم توفيره.

    الخطوات المطلوبة لبرنامج بلغة C الذي يطلب من المستخدم إدخال جملة بحد أقصى 50 حرفًا ويقوم بطباعة عدد الحروف الكبيرة، هي كالتالي:

    1. بدايةً، يجب علينا تضمين المكتبة الأساسية "stdio.h" في البرنامج.
    2. نقوم بتعريف متغيراتنا، يجب علينا تعريف مصفوفة من الحروف لاستيعاب جملة المستخدم ومتغير لعدد الأحرف الكبيرة.
    3. نستخدم دالة "printf" لطلب من المستخدم إدخال الجملة ونستخدم دالة "scanf" لتخزين هذه الجملة في المصفوفة المحددة سابقًا.
    4. نستخدم حلقة "for" لتحليل كل حرف في المصفوفة. نتحقق في كل تكرار من خلال "if" إذا كان الحرف حرفًا كبيرًا أم لا. إذا كان الحرف كبيرًا، فإننا نزيد قيمة المتغير المخصص لعدد الأحرف الكبيرة بواحد.
    5. أخيرًا، نستخدم دالة "printf" مرة أخرى لطباعة عدد الأحرف الكبيرة التي تم العثور عليها في الجملة.

    وهناك العديد من الطرق المختلفة لحل هذا السؤال باستخدام لغة C.

    على سبيل المثال، بدلاً من استخدام حلقة for وجملة الشرط if لحساب عدد الأحرف الكبيرة في الجملة، يمكن استخدام دالة isupper المتاحة في المكتبة القياسية للغة C، والتي تقوم بتحقق ما إذا كان الحرف كبيرًا أم لا. وبهذه الطريقة، يمكن تبسيط الكود وجعله أكثر فهمًا.

    وتعمل دالة isupper للتحقق من كل حرف في الجملة ما إذا كان كبيرًا أم لا، وفي حال كان الحرف كبيرًا، يتم زيادة قيمة المتغير capital_count، بعد ذلك، يتم طباعة عدد الأحرف الكبيرة باستخدام دالة printf.

    وهناك طريقة أخرى أيضًا:

    كمثال، بدلاً من استخدام حلقة for لتحليل الجملة حرفًا حرفًا، يمكن استخدام دالة strlen المتاحة في المكتبة القياسية للغة C لحساب طول الجملة، ومن ثم استخدام حلقة for لتحليل الجملة حرفًا حرفًا.

    وستجدي هنا مقالات ودروس حول لغة C

  12. في البداية الملف الذي أرفقته غير صالح أرجو منك إعادة ضغط مجلد المشروع كما في الصورة التالية ورفعه.

    2023-04-14_12-50-08.thumb.png.17eda96cf61f1263329b45935a466394.png

    وأيضًا توضيح ما تريده بشكل مفصل لنتمكن من مساعدتك، وهل السؤال تابع لدورة أو مشروع معين.

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

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

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

    <!DOCTYPE html>
    <html>
    <head>
    	<title>عنوان الصفحة</title>
    	<script src="path/to/your/script.js"></script>
    </head>
    <body>
    	<h1>محتوى الصفحة</h1>
    </body>
    </html>

    وتحقق من الأخطاء التي ستظهر لك في الكونسول في حالة وجود أخطاء.

  13. سأقوم بتوضيح الخطوات لك لإنشاء برنامج يستخدم جملة التحويل switch case لحساب أجر الموظفين كما يلي:

    1- قم بتعريف المتغيرات اللازمة للبرنامج، وهي:

    • متغير لتخزين عدد الساعات التي عملها الموظف (hours).
    • متغير لتخزين مستوى المهارة للموظف (skillLevel).
    • متغير لتخزين أجر الموظف اليومي (pay).

    2- قم بطباعة رسالة تعريفية للمستخدم لإعلامه بضرورة إدخال البيانات المطلوبة.

    3- استخدم جملة switch case لتحديد أجر الموظف بناءً على مستوى المهارة الذي يملكه.

    • في الحالة الأولى (skillLevel = 1)، قم بحساب أجر الموظف بتضريب عدد الساعات التي عملها الموظف بمعدل الأجر اليومي للمهارة الغير ماهرة (8.15 RO/-) وتخزين الناتج في متغير الأجر (pay).
    • في الحالة الثانية (skillLevel = 2)، قم بحساب أجر الموظف بتضريب عدد الساعات التي عملها الموظف بمعدل الأجر اليومي للمهارة النصف مهارة (12.55 RO/-) وتخزين الناتج في متغير الأجر (pay).
    • في الحالة الثالثة (skillLevel = 3)، قم بحساب أجر الموظف بتضريب عدد الساعات التي عملها الموظف بمعدل الأجر اليومي للمهارة الماهرة (18.60 RO/-) وتخزين الناتج في متغير الأجر (pay).
    • في الحالة الرابعة (skillLevel غير 1 أو 2 أو 3)، قم بطباعة رسالة خطأ تفيد بأن مستوى المهارة المدخل غير صحيح، وعدم القيام بأي حسابات.

    4- قم بطباعة قيمة أجر الموظف المحسوب في المتغير pay.

    5- اختبر البرنامج باستخدام مجموعة من الحالات الاختبار المختلفة، مثل الأعداد الزوجية والفردية والكسورية، والتأكد من صحة نتائج الحسابات.

    6- قم بإضافة اللازم للتحقق من صحة البيانات المدخلة من قبل المستخدم، مثل التحقق من أن عدد الساعات المدخلة يكون أكبر من صفر، وأن مستوى المهارة المدخل صحيح.

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

     

    • شكرًا 1
  14. إذا كنت تستخدم bootstrap 4 فإن الفئة (bg-color-subtle) ليست موجودة ، بل يمكنك استخدام الفئة (bg-light) وستحقق نفس التأثير.

    أما بالنسبة للفئة (subtle) ، فهي ليست جزءًا من bootstrap ، قد يكون هذا اسم فئة تم إنشاؤها في ملف التنسيق style.css.

     وباستطاعتك إنشاء الفئة subtle بنفسك باستخدام CSS بالشكل التالي:

    .subtle {
      opacity: 0.5;
    }

    وهذا سوف يخفف من تأثير أي عنصر يحمل تلك الفئة.

    وإذا كنت تستخدم bootstrap 5.3 فإن الفئة (bg-color-subtle) موجودة وتعمل بشكل صحيح.

    ولتضمين المكتبة في الكود الخاص بك عن طريق روابط CDN استخدم التالي:

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
    
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.7/dist/umd/popper.min.js" integrity="sha384-zYPOMqeu1DAVkHiLqWBUTcbYfZ8osu1Nd6Z89ify25QV9guujx43ITvfi12/QExE" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.min.js" integrity="sha384-Y4oOpwW3duJdCWv5ly8SCFYWqFDsfob/3GkgExXKV4idmbt98QcxXYs9UoXAB7BZ" crossorigin="anonymous"></script>

    ويمكنك قراءة المستندات الخاصة بإصدار 5.3.

    وإذا كنت تستخدم المكتبة في مشروع يعتمد على webpack فعليك بقراءة الدليل التالي:
    https://getbootstrap.com/docs/5.3/getting-started/webpack/

    • شكرًا 1
  15. لكي تكتب الأرقام بنفس عدد الأسطر، عليك بتعديل حلقة التكرار الداخلية (الحلقة التي تحدد عدد الأرقام في كل سطر) لتكون بحسب عدد الأسطر، يمكن القيام بذلك عن طريق استخدام متغير آخر لحساب عدد الأرقام في الحلقة التالية.

    مثلاً، يمكن تعديل الكود كما يلي:

    num = 1
    for i in range(1, 8):
        # حساب عدد الأرقام في السطر الحالي
        num_digits = i
        for j in range(num_digits):
            print(num, end=' ')
            num += 1
        print()

    كما ترى يتم حساب عدد الأرقام في كل سطر باستخدام المتغير num_digits الذي يتم تعيينه إلى قيمة i في كل دورة من حلقة التكرار الخارجية، بعد ذلك استخدام متغير num_digits في حلقة التكرار الداخلية لطباعة عدد معين من الأرقام في كل سطر.

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

  16. حاول تنفيذ الخطوات التالية لتعديل رابط الصورة في بلوجر:

    1. قم برفع الصورة بشكل طبيعي أثناء كتابة المقالة ومن ثم الضغط على "تحرير HTML".
    2. البحث عن الرابط الذي يحتوي على "/s1600/" أو "/s220/" أو "/s400/" أو "/s72/" ، حيث تشير هذه الأرقام إلى حجم الصورة المراد عرضها.
    3.  تغيير هذه الأرقام وفقًا للحجم الذي تريد استخدامه، على سبيل المثال يمكن استخدام "/s640/" أو "/s1024/" بدلاً من "/s400/" للحصول على صورة بجودة أعلى.
    4.  حفظ التغييرات التي قمت بها وإغلاق نافذة "تحرير HTML".

    وأيضًا تأكد من تغيير عرض الصورة ليصبح original size أو العرض الأصلي للصورة، والأفضل هو تغيير حجم الصورة قبل رفعها لتتناسب مع حجم القالب.

    باستطاعتك استخدام أداة https://squoosh.app/editor لتعديل حجم الصور من خلال الضغط على resize وأيضًا ضغم حجم الصور لتحسين سرعة الموقع وبالتالي الـ SEO.

    • أعجبني 1
  17. الأمر في تلك الحالة راجع للدعم الفني الخاص بخمسات عليك بمراسلتهم أكثر من مرة أي مرة كل 72 ساعة، ويجب توفير دليل أو محادثة الخاصة بالمشروع على أنك العميل استلم الملفات أو أكد الاستلام.

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

    وفي المرة القادمة يجب التأكيد على استلام المشروع بشكل واضح.
    وكنصيحة لا تعلق الكثير من الأمال فالأمر سيبقى معلق لحين عودة العميل وتأكيد الاستلام.

  18. باستطاعتك تعديل الكود بإضافة شرط قبل تحديث قيمة الـ printName، حيث يتحقق من قيمة حقل الإدخال، وإذا كان فارغًا يتم عرض رسالة (required) دون تحديث قيمة الـ printName، وإذا كانت القيمة غير فارغة يتم تحديث قيمة الـ printName بقيمة حقل الإدخال.

    <script>
    function myFunction() {
        let userInput = document.querySelector("#userInput");
        let printName = document.querySelector("#printName");
        if (userInput.value === '') {
            userInput.setCustomValidity("Please enter your name");
            printName.innerHTML = '';
        } else {
            userInput.setCustomValidity('');
            printName.innerHTML = userInput.value;
        }
    }
    </script>

    قمت بإضافة userInput.setCustomValidity لتعيين رسالة الخطأ وتعيين قيمة الـ printName إلى فارغ في حالة كان حقل الإدخال فارغًا، وإذا تم إدخال قيمة صالحة، يتم إزالة رسالة الخطأ وتحديث قيمة الـ printName.

    • أعجبني 1
  19. أرجو منك مشاركة الكود بشكل نصي من خلال إضافته من علامة <> عند كتابة السؤال.

    وحاول تجربة الكود التالي:

    #include <stdio.h>
    
    int main() {
        int n1, n2, n3, n4, n5, n6, n7, n8, n9;
        scanf("%d %d %d %d %d %d %d %d %d", &n1, &n2, &n3, &n4, &n5, &n6, &n7, &n8, &n9);
    
        int row1 = n1 + n2 + n3;
        int row2 = n4 + n5 + n6;
        int row3 = n7 + n8 + n9;
        int col1 = n1 + n4 + n7;
        int col2 = n2 + n5 + n8;
        int col3 = n3 + n6 + n9;
        int diag1 = n1 + n5 + n9;
        int diag2 = n3 + n5 + n7;
    
        if (row1 == row2 && row2 == row3 && row3 == col1 && col1 == col2 && col2 == col3 && col3 == diag1 && diag1 == diag2) {
            printf("Awesome Numbers\n");
        } 
        if (row1 == row2 || row1 == row3 || row2 == row3) {
            printf("Awesome Rows\n");
        }
        if (col1 == col2 || col1 == col3 || col2 == col3) {
            printf("Awesome Columns\n");
        }
        if (diag1 == diag2) {
            printf("Awesome Diagonals\n");
        }
        if (row1 == col1 || row1 == col2 || row1 == col3 || row1 == diag1 || row1 == diag2 ||
            row2 == col1 || row2 == col2 || row2 == col3 || row2 == diag1 || row2 == diag2 ||
            row3 == col1 || row3 == col2 || row3 == col3 || row3 == diag1 || row3 == diag2) {
            printf("Awesome Row and Column\n");
        }
        if (col1 == diag1 || col1 == diag2 || col2 == diag1 || col2 == diag2 || col3 == diag1 || col3 == diag2) {
            printf("Awesome Column and Diagonal\n");
        }
    
        return 0;
    }

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

    إذا كان مجموع الأرقام في الصف الأول يساوي مجموع الأرقام في الصف الثاني ويساوي مجموع الأرقام في الصف الثالث ويساوي مجموع الأعمدة الثلاث ويساوي مجموع القطرين، يتم طباعة "Awesome Numbers".

    إذا كان مجموع الأرقام في أي صف يساوي مجموع الأرقام في أي صف آخر، يتم طباعة "Awesome Rows".

    إذا كان مجموع الأرقام في أي عمود يساوي مجموع الأرقام في أي عمود آخر، يتم طباعة "Awesome Columns".

    إذا كان مجموع الأرقام في القطر الأول يساوي مجموع الأرقام في القطر الثاني، يتم طباعة "Awesome Diagonals".

    إذا كان مجموع الأرقام في أي صف يساوي مجموع الأرقام في أي عمود، يتم طباعة "Awesome Row and Column".

    إذا كان مجموع الأرقام في أي صف يساوي مجموع الأرقام في أي قطر، يتم طباعة "Awesome Row and Diagonal".

    إذا كان مجموع الأرقام في أي عمود يساوي مجموع الأرقام في أي قطر، يتم طباعة "Awesome Column and Diagonal".

    إذا لم يتحقق أي شرط من الشروط المحددة، لا يتم طباعة أي شيء.

    وستجد هنا مقالات ودروس حول لغة C

  20. إذا كان السؤال خاص بأحد دورات حسوب فأرجو منك طرح السؤال أسفل فيديو الدورة الخاص بالسؤال.

    وبخصوص سؤالك:

    الكائنات القابلة للتكرار هي الكائنات التي يمكن إنشاؤها أكثر من مرة في نفس الزمن، وتحتفظ بمعرف فريد لكل كائن.

    مثلاً، يمكن إنشاء عدة كائنات من نفس الفئة (Class) في لغة البرمجة، وكل كائن يمتلك نفس الخصائص والسلوكيات الأساسية ولكنها يحمل معرفاً فريداً لكل كائن.

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

    على سبيل المثال، في لغة البرمجة، قد يكون لدينا ثابت (Constant) معين يحمل قيمة ثابتة، ولا يمكن تغييره أو إعادة إنشائه في أي مكان آخر في البرنامج.

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

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

    أما بالنسبة للكائنات غير القابلة للتكرار، فقد يكون لدينا ثابت (Constant) لرقم الضريبة المضافة VAT في البرنامج، ويمكن استخدام هذا الثابت في جميع أنحاء البرنامج، ولكن لا يمكن تغيير قيمته خلال تنفيذ البرنامج. في هذه الحالة، يتم استخدام الثابت لتمثيل قيمة ثابتة لا تتغير خلال تنفيذ البرنامج، ولا يمكن إنشاء مثيلات جديدة من هذا الثابت.

    • شكرًا 1
  21. في تلك الحالة المشكلة تتعلق بحالة التشغيل (playing state) عند تغيير المسار الصوتي.

    باستطاعتك استخدام الحالة (state) في React لتتبع حالة التشغيل (playing state) وتحديثها عند الحاجة.

    مثلاً، يمكنك تعريف حالة (state) جديدة تسمى isPlaying في المكون الذي يحتوي على العناصر التي تتحكم في المشغل والتي يتم تمريرها إلى العنصر المسؤول عن تشغيل الصوت كخاصية isPlaying عند تغيير المسار الصوتي.

    في الأسفل مثال لإعادة ترتيب المكون الذي يتحكم في تشغيل الصوت بحيث يتبع حالة التشغيل بشكل صحيح:

    function AudioPlayer({ tracks }) {
      const [currentTrackIndex, setCurrentTrackIndex] = useState(0);
      const [isPlaying, setIsPlaying] = useState(false);
    
      const audioRef = useRef(null);
    
      const handlePlayPause = () => {
        if (isPlaying) {
          audioRef.current.pause();
        } else {
          audioRef.current.play();
        }
        setIsPlaying(!isPlaying);
      };
    
      const handleNextTrack = () => {
        if (currentTrackIndex < tracks.length - 1) {
          setCurrentTrackIndex(currentTrackIndex + 1);
          setIsPlaying(false);
          audioRef.current.src = tracks[currentTrackIndex + 1].src;
        }
      };
    
      const handlePrevTrack = () => {
        if (currentTrackIndex > 0) {
          setCurrentTrackIndex(currentTrackIndex - 1);
          setIsPlaying(false);
          audioRef.current.src = tracks[currentTrackIndex - 1].src;
        }
      };
    
      useEffect(() => {
        audioRef.current.src = tracks[currentTrackIndex].src;
        setIsPlaying(false);
      }, [currentTrackIndex, tracks]);
    
      return (
        <div>
          <audio ref={audioRef} />
          <button onClick={handlePrevTrack}>Previous</button>
          <button onClick={handlePlayPause}>{isPlaying ? 'Pause' : 'Play'}</button>
          <button onClick={handleNextTrack}>Next</button>
        </div>
      );
    }

    في المثال، يتم تتبع حالة التشغيل في isPlaying ويتم تحديثها عند الحاجة، مما يتيح للمشغل أن يشتغل تلقائيًا عند تحميل الملف الصوتي الجديد.

    • أعجبني 1
  22. بالإمكان تحقيق هذا السلوك عن طريق إضافة بعض الشروط والدوال لتعيين  حالة التشغيل (playing state) بمجرد تحميل المسار الصوتي الجديد.

    فيتم تحميل الملف الجديد باستخدام دالة useEffect و setAudio, حيث تُحدث الدالة setAudio حالة audio الجديدة وتقوم بتشغيلها عند تحميل الملف الصوتي الجديد.

    ولتعيين حالة التشغيل (playing state) بشكل تلقائي بعد تحميل الملف الصوتي الجديد، يمكن إضافة المعلمة autoplay إلى الصوت الجديد قبل تعيين حالة audio الجديدة كما يلي:

    setAudio(new Audio(src));
    audioRef.current = new Audio(src);
    audioRef.current.autoplay = true; // تشغيل الصوت تلقائياً

    وبذلك يتم ضبط حالة التشغيل (playing state) بشكل تلقائي بمجرد تحميل الملف الجديد، وعند النقر على الأزرار Previous أو Next يمكن تغيير المسار الصوتي الحالي والتشغيل التلقائي سيتم بشكل تلقائي.

    • أعجبني 1
  23. بتاريخ 3 دقائق مضت قال moh am:

    لا اعلم ما المشكله فانه لا يطبع بشكل صحيح ربما يحدث خطا ما 

    حيث انني قمت بحذف الشرط الاول تحقق الشرط الثاني 

    وعند وجود الشرط الثاني يتحقق الشرط الاول 

    أرجو منك مشاركة الكود بعد التعديل وأيضًا قم بالضغط على علامة الكود <> لإضافة الكود الخاص بك عند كتابة السؤال.

×
×
  • أضف...