لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 04/14/21 في كل الموقع
-
الإصدار 1.0.0
63053 تنزيل
لا يخفى على أي متعلم لمجال علوم الحاسوب كثرة الاهتمام بمجال الذكاء الاصطناعي وتعلم الآلة، وكذلك الأمر بالنسبة لمستخدم التقنية العادي الذي بات يرى تطورًا كبيرًا في الآلات والتقنيات التي تحيط به بدءًا من المساعد الصوتي الآلي في جواله وحتى سيارته وبقية الأشياء الذكية المحيطة به. تتوالى الاختراعات والاكتشافات يومًا بعد يوم وتتنافس كبرى الشركات حول من يحرز أكبر تقدم ليخطف الأضواء من غيره. ونظرًا لهذا الاهتمام، ولضعف المحتوى العربي وسطحيته في هذا المجال أيضًا، قررنا توفير مصدر عربي دسم لشرح مجال الذكاء الاصطناعي وتعلم الآلة نظريًا وعمليًا لذا وضعنا فهرس المحتوى آنذاك وبدأنا العمل. هذا الكتاب هو الجزء الأول النظري التأسيسي من أصل جزآن عن الذكاء الاصطناعي وتعلم الآلة، ويبدأ بعرض أهمية الذكاء الاصطناعي وتعلم الآلة عبر الإشارة إلى المشاريع والإنجازات التي قدَّمها هذا المجال إلى البشرية حتى يومنا هذا وكيف أثرت على كل مجالات حياتنا اليومية. ينتقل بعدها إلى لمحة تاريخية عن المجال وكيفية ولادته ومراحل حياته حتى يومنا الحالي. ستجد بعدئذٍ المعلومات الدسمة في الفصل الثالث الذي يشرح المصطلحات المتعلقة بمجال تعلم الآلة ويشرح أساليب تعليم الإنسان للآلة والأسس التي بنيت عليها عمليات تعليم الآلة (منها شرح طرائق تعلم الآلة التقليدية ثم التجميع والتعلم المعزز وحتى الشبكات العصبية والتعلم العميق). يعرض الفصل الأخير تحديات عملية تعليم الآلة وما علاقة البيانات فيها، ثم أخيرًا عرض خارطة طريق لأهم المفاهيم التي يجب أن تتقنها في حال أردت التوسع في المجال وإتقانه. بعد الانتهاء من الجزء الأول في هذا الكتاب وتأسيس المفاهيم والمصطلحات التي يقوم عليها مجال الذكاء الاصطناعي وتعلم الآلة، يمكنك الانتقال إلى الجزء الثاني وهو كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي لبدء تطبيق مشاريع عملية تطبيقية مبنية على بيانات واقعية وتنفيذ أفكار مشاريع من الحياة العملية باستخدام الذكاء الاصطناعي. ساهم بالعمل على هذا الكتاب، محمد لحلح تأليفًا، وجميل بيلوني تحريرًا وإشرافًا، وأخرجه فنيًا فرج الشامي. أرجو أن نكون قد وُفقنَا في هذا العمل لسد ثغرةً كبيرةً في المحتوى العربي -كما خططنا لذلك- الذي يفتقر أشد الافتقار إلى محتوى جيد ورصين في مجال الذكاء الاصطناعي وتعلم الآلة. هذا الكتاب مرخص بموجب رخصة المشاع الإبداعي Creative Commons «نسب المُصنَّف - غير تجاري - الترخيص بالمثل 4.0». يمكنك قراءة فصول الكتاب على شكل مقالات من هذه الصفحة، «الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية»، أو من مباشرةً من الآتي: الفصل الأول: الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية الفصل الثاني: الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها الفصل الثالث: المفاهيم الأساسية لتعلم الآلة الفصل الرابع: تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال1 نقطة -
مرحبا بالعالم يطبع البرنامج التالي العبارة مرحبًا بالعالم! في مجرى الخرج القياسي (standard output stream): #include <iostream> int main() { std::cout << "مرحبا بالعالم!" << std::endl; } يمكنك رؤية التجربة الحية على Coliru. تحليل البرنامج لنحلل كل جزء من شيفرة البرنامج بالتفصيل: #include <iostream> هو موجّه معالجة مسبقة (preprocessor directive)، ويتضمن محتوى iostream، وهي ترويسة ملف C++ القياسي (standard C++ header file). الكلمة iostream هي ترويسة ملف مكتبة قياسية (standard library header file)، وتحتوي على تعريفات مُجريَا الدخل والخرج القياسيين (standard input and output streams). هذه التعريفات مُتضمنة في فضاء الاسم std، كما هو موضح أدناه. يوفر مُجريا الدخل/الخرج القياسيين (I/O) طريقة للبرامج يمكنه عبرها جلب مدخلات من مخرجات خاصة بنظام خارجي، والذي يكون طرفية في العادة. int main() { ... } تُعرِّف هذه الشيفرة دالة جديدة باسم main تستدعى عند تنفيذ البرنامج. يجب أن تكون هناك دالة main واحدة لكل برنامج C++، ويجب أن تعيد دائمًا عددًا من النوع int. يمثل int نوع القيمة التي تعيدها الدالة والتي تمثل رمز الخروج (exit code) الخاص بالدالة main. البرامج ذات رمز الخروج المساوي للقيمة 0 أو EXIT_SUCCESS تُعد ناجحة من قبل النظام الذي ينفّذ ذلك البرنامج. ترتبط كل رموز الخروج الأخرى بأخطاء تحددها هي. في حال عدم استخدام التعليمة return، ستعيد الدالة main (وبالتالي البرنامج نفسه) القيمة 0 افتراضيًّا. في هذا المثال لا نحتاج إلى كتابة ;return 0. جميع الدوال الأخرى، باستثناء تلك التي تُعيد النوع void، يجب أن تُعيد قيمة بشكل صريح من النوع الذي يُفترض أن تعيده، أو لا ينبغي أن تعيد أي قيمة على الإطلاق. std::cout << "مرحبا بالعالم!" << std::endl; تطبع هذه التعليمة السلسلة النصية "مرحبا بالعالم!" في مجرى الخرج القياسي، وتتألف من الأجزاء التالية: std: هي فضاء اسم، و :: هو عامل تحليل النطاق (scope resolution operator) الذي يسمح بالبحث عن الكائنات بأسمائها ضمن فضاء الاسم. هناك العديد من فضاءات الاسم. هنا نستخدم :: لإظهار أننا نريد استخدام cout من فضاء الاسم std. لمزيد من المعلومات، ارجع إلى المقال Scope Resolution Operator في توثيق ميكروسوفت. std::cout: هو كائن مجرى الخرج القياسي (standard output)، وهو مُعرّف في iostream، ويُطبع أيّ شيء يُمرَّر إليه في مجرى الخرج القياسي (stdout). >>: هي، في هذا السياق، عامل الإدراج (stream insertion operator)، ويُسمى كذلك لأنه يدرج كائنًا في كائن المجرى (stream object). تُعرِّف المكتبة القياسية العامل >> لإدراج بعض أنواع البيانات في مجاري الخرج. تدرج التعليمة stream << content المحتوى content في المجرى stream ثم تعيد المجرى نفسه بعد تحديثه. يسمح ذلك بإجراء الإدراجات المتسلسلة، مثلًا، تطبع التعليمة std::cout << "Foo" << " Bar"; السلسة النصية "Foo Bar" في سطر الأوامر. "مرحبا بالعالم!": هي سلسلة نصية حرفية (character string literal). عامل الإدراج الخاص بالسلاسل النصية مُعرّف في الملف iostream. std::endl: هو كائن خاص لمعالجة مجرى I/O، وهو مُعرّف في الملف iostream. إنّ إدراج معالج في مجرى ما يغير حالة ذلك المجرى. يقوم معالج المجرى std::endl بعملين: أولًا، يدرج محرف نهاية السطر (end-of-line character)، ثم ينقل البيانات (flushes) الموجودة في المخزن المؤقت (stream buffer) الخاص بالمجرى لجعل النص يظهر في سطر الأوامر. يضمن هذا أنّ البيانات المُدرجة في المجرى ستظهر بالفعل في وحدة التحكم. (تُخزنّ بيانات المجرى عادة في مخزن مؤقت، ثم تُنقَل على دفعات، إلا إذا أمرت بنقلها فوريًا.) هناك طريقة بديلة تُجنِّب نقل البيانات من المخزن المؤقت، وهي: std::cout << "Hello World!\n"; // سطرًا جديدًا \n يمثل الفاصلة المنقوطة ;: تُخطر الفاصلة المنقوطة (;) المُصرّف (compiler) بأنّ التعليمة البرمجية قد انتهت. تتطلب كل عبارات C++ وتعريفات الأصناف استخدام فاصلة منقوطة في النهاية. التعليقات التعليقات هي جزء من الشيفرة يتجاهلها مصرف C++. تُستخدم التعليقات لتوضيح بعض الجوانب التي قد تكون غامضة بخصوص تصميم أو طريقة عمل البرنامج. هناك نوعان من التعليقات في C++: التعليقات السطرية (Single-Line Comments) تجعل الشرطتان المائِلتان // النص الذي يليها وحتى بداية السطر الجديد تعليقًا: int main() { // هذا تعليق سطري int a; // هذا تعليق سطري كذلك int i; // هذا أيضا تعليق سطري } التعليقات الكُتلية (Block Comments) يُستخدَم المحرفان /* للإعلان عن بداية تعليق كتلي، فيما يُستخدَم المحرفان */ للإعلان عن نهاية التعليق. يُفسَّر النص الموجود بين العبارتين على أنه تعليق، حتى لو كان النص الموجود بينهما شيفرة C++ صالحة. يسمى هذا النوع من التعليقات عادة تعليقات "C-style"، لأنّ صياغة هذ النوع من التعليقات موروثة من سلف C++، أي اللغة C: int main() { /* * هذا تعليق كتلي */ int a; } يمكنك كتابة ما تشاء في التعليقات الكتلية لكن عندما يجد المصرّف رمز نهاية التعليق*/، فإنه ينهي التعليق الكتلي: int main() { /* تعليق كتلي يمتد * على عدة أسطر * وينتهي في السطر التالي */ int a; } يمكن أيضًا أن تبدأ التعليقاتُ الكتلية وتنتهي في سطر واحد. مثلا: void SomeFunction(/* الوسيط الأول */ int a, /* الوسيط الثاني */ int b); أهمية التعليقات كما هو الحال مع جميع لغات البرمجة، توفر التعليقات العديد من الفوائد، منها: توثيق ضمني للشيفرة البرمجية لتسهيل قراءتها وصيانتها شرح الغرض من الشيفرة البرمجية ودوالها توفير تفاصيل حول تاريخ الشيفرة أو المنطق وراءها وضع حقوق الطبع والنشر/التراخيص، أو ملاحظات حول المشروع، أو شكر خاص، أو التنويه بالمساهمين، وما إلى ذلك مباشرة في الشيفرة المصدرية (source code). من جهة أخرى، فإنّ للتعليقات جانبًا سلبيًا كذلك: يجب تعديلها لتعكس أي تغييرات في الشيفرة الإفراط في إدراج التعليقات قد يؤثر سلبًا على مقروئية الشيفرة. يمكن تقليل الحاجة إلى التعليقات عبر كتابة شيفرة واضحة ومُوثقة ذاتيًا (self-documenting). أحد الأمثلة على ذلك هو استخدام أسماء توضيحية للمُتغيرات والدوال والأنواع. وتوزيع المهام المترابطة منطقيًا في دوال منفصلة. تعليق الشيفرة واختبارها أثناء التطوير، يمكن أيضًا استخدام التعليقات لتعطيل أجزاء من الشيفرة بسرعة دون حذفها. غالبًا ما يكون هذا مفيدًا في مرحلة الاختبار أو التنقيح (debugging)، ولكن ينبغي محو تلك التعليقات بعد الانتهاء. يشار إلى هذا غالبًا باسم "تعليق الشيفرة" (commenting out). بالمثل، الاحتفاظ بالإصدارات القديمة من أجزاء من الشيفرة في التعليقات لجعلها متاحة للمراجعة قد يكون مزعجًا، لأنّ ذلك يُراكم الكثير من الشيفرة غير المستخدمة، ولا يضيف قيمة تذكر موازنةً بالاطلاع على تاريخ الشيفرة عبر نظام إصدارات (versioning system). عملية التصريف القياسية في C++ تُنتَج برامج C++ القابلة للتنفيذ عادة بواسطة المُصرّف (compiler)، وهو برنامج يترجم الشيفرة من لغة برمجة إلى شيفرة تنفيذية تفهمها الآلة وتُنفذ على الحاسوب من قبل المستخدم النهائي. استخدام المصرّف لتصريف الشيفرة يسمى عملية التصريف (compilation process). ورثت C++ آلية التصريف من سلفها، أي اللغة C. فيما يلي قائمة توضح الخطوات الرئيسية الأربع للتصريف في C++: ينسخ المعالج الأولي (preprocessor) للغة C++ محتويات كل ملفات الترويسات (header files) المتضمنة في ملف الشيفرة المصدري، ويولد «شيفرة عملية بدل» (macro code، ويعوّض الثوابت الرمزية (symbolic constants) المعرفّة باستخدام #define بقِيمهما. تُصرَّف الشيفرة المصدرية الموسعة التي أُنتِجت بواسطة المعالج الأولي لـ C++ إلى لغة التجميع (assembly language) المناسبة لنظام التشغيل. تُصرَّف الشيفرة المجمّعة التي أُنتِجت بواسطة المصرّف إلى تعليمات مُصرّفة (object code) مناسبة لنظام التشغيل. تُربَط التعليمات المُصرَّفة المُولّدة من قبل المجمّع (assembler) مع ملفات التعليمات المُصرَّفة (object code files) الخاصة بدوال المكتبات المستخدمة لإنتاج الملف القابل للتنفيذ. ملاحظة: أحيانًا تُربط بعض الشيفرات المُصرَّفة معًا، ولكن ليس لغرض إنشاء برنامج نهائي، إذ يمكن تحزيم (packaging) الشيفرة "المربوطة" لأجل استخدامها من قبل برامج أخرى. الحزم الناتجة هي ما يشير إليه مبرمجو C++ بالمكتبات (libraries). تدمج العديد من مصرّفات C++ أو تفكّك بعض مراحل عملية التصريف لتسهيل العملية، أو لأجل التحليل الإضافي. يستخدم مُبرمجو C++ أدوات مختلفة، لكنها جميعًا تتبع المقاربة أعلاه. الدوال الدالة هي كتلة من الشيفرة تحتوي سلسلة من العبارات. يمكن للدوال قبول وسائط (arguments) أو قيم، ويمكن أن تعيد قيمة واحدة، أو قد لا تعيد أي قيمة. لاستخدام دالة، يجب استدعاؤها مع تمرير وسائط إليها، ثم تعيد قيمة. لكل دالة بصمة نوعيّة (type signature)، والتي تمثل أنواع وسائطها، ونوع القيمة المعادة. الدوال مستوحاة من مفهومَي الإجراء (procedure) والدالة في الرياضيات. ملاحظات: دوال C++ هي إجراءات (procedures) بالأساس، ولا تتبع بدقة قواعد الدوال الرياضية وفق مفهوم علوم الرياضيات. تؤدي الدوال في العادة مهام محددة ويمكن استدعاؤها من أجزاء أخرى من البرنامج. كما يجب التصريح عن الدالة وتعرِيفها قبل استدعائها في البرنامج. قد تُخفى تعريفات الدوال الشائعة والمهمة في ملفات أخرى مُضمّنة، فذلك يسهِّل إعادة استخدامها في البرامج. وهذا أحد الاستخدامات الشائعة لملفات الترويسات (header files). التصريح عن دالة التصريح عن دالة (Function Declaration) هو عملية الإعلان عن وجود دالة، مع توضيح اسمها وبصمتها النوعيّة للمصرف. ويتبع الصياغة التالية: // الدالة التالية تقبل عددًا صحيحًا وتعيد عددًا صحيحًا int add2(int i); في المثال أعلاه، تخبر int add2(int i) المصرّف بالمعلومات التالية عن الدالة المُصرَّح عنها: نوع القيمة المعادة هو int. اسم الدالة هو add2. عدد وسائط الدالة هو 1: الوسيط الأول من النوع int. سيُشار إلى الوسيط الأول داخل الدالة بالاسم i. اسم الوسيط اختياري؛ إذ يمكن التصريح بالدالة كما يلي: int add2(int); // يمكن حذف اسم الوسيط وفقًا لقاعدة التعريف الواحد (one-definition rule)، لا يمكن التصريح بدالة ذات بصمة (signature) نوعيّة معينة أو تعريفها أكثر من مرة واحدة في كامل شيفرة C++ المرئية للمصرّف. بمعنى آخر، لا يمكن إعادة تعريف دالة ذات بصمة نوعية معيّنة إلا مرة واحدة فقط. وبالتالي، فالشيفرة التالية غير صالحة في C++ وسيطلق المصرف خطأ عند تنفيذها: // int هي دالة من النوع add2 المصرف سيعلم أن int add2(int i); // (int) -> int // لا يمكن إعادة تعريف نفس الدالة بنفس البصمة int add2(int j); // (int) -> int إذا لم تُعِد الدالة أي قيمة، فإنّ نوع القيمة المعادة سيُكتب void. إذا لم تأخذ الدالة أيّ معاملات، فينبغي أن تكون قائمة المعاملات فارغة. // الدالة التالية لا تأخذ أي وسائط، ولا تعيد أي قيمة void do_something(); لاحظ أنه ما يزال بمقدور الدالة do_something التأثير في المتغيرات التي يمكنها الوصول إليها. استدعاء الدالة يمكن استدعاء الدالة بعد التصريح عنها. على سبيل المثال، يستدعي البرنامج التالي الدالة add2 مع القيمة 2 داخل الدالة main: #include <iostream> int add2(int i); // add2 تعريف الدالة int main() { // في هذا الموضع add2(2) سيتم تقييم std::cout << add2(2) << "\n"; // وستُطبع النتيجة return 0; } بالنظر إلى الشيفرة السابقة، نجد أنَّه ما تزال الدالة add2 تحتاج إلى توفير طريقة تنفيذ لها بالإضافة إلى تعريفها (جسم الدالة)، رغم أن تنفيذ الدالة لا يظهر مباشرة في الشيفرة، إذ يمكن جلبه من ملف آخر بربط هذا الملف مع الشيفرة التي تستدعي الدالة. تمثل add2(2) صياغة استدعاء دالة. تعريف الدالة تعريف الدالة يشبه التصريح عنها، إلا أنه يحتوي أيضًا على الشيفرة الذي ستُنفّذ عند استدعاء الدالة، هذه الشيفرة تُسمى جسم الدالة (function body). فيما يلي مثال عن تعريف الدالة add2: // i القيمة التي ستُمرر إلى الدالة سيشار إليها بالاسم int add2(int i) { // بين القوسين يمثل داخل نطاق أو جسم الدالة int j = i + 2; return j; } زيادة تحميل الدوال يمكنك إنشاء عدة دوال تشترك في نفس الاسم، ولكن مع اختلاف المعاملات، أي تختلف بصمة الدالة فقط، وهذا ما يعرف «بزيادة تحميل دالة» (Function Overloading). // التنفيذ الأول int add2(int i) { int j = i + 2; return j; } // التنفيذ الثاني int add2(int i, int j) { int k = i + j + 2; return k; // } كلتا الدالتين تحملان الاسم add2، بيْد أنّ الدالة المُنفّذة تعتمد على عدد وأنواع المعاملات المُمررة في الاستدعاء. في معظم الحالات، يمكن لمصرّف C++ أن يحدد الدالة المراد استدعاؤها. لكن في بعض الحالات يجب ذكر النوع بوضوح. فسيتم تقييم الشيفرة المحتواة في التعريف الأول عند استدعاء الدالة نع معامل واحد بالشكل add2(1). وفي حال استدعاء الدالة مع معاملين بالشكل add2(1, 3)، فسيتم تقييم الشيفرة المتضمنة في التعريف الثاني بدلًا من التعريف الأول. المعاملات الافتراضية يمكن تحديد القيم الافتراضية لمعاملات الدالة (Default Parameters) في تعريفات الدوال فقط. // 7 هي b القيمة الافتراضية للمعامل int multiply(int a, int b = 7); // جسم الدالة int multiply(int a, int b) { return a * b; } في هذا المثال، يمكن استدعاء multiply() مع معامل واحد أو مُعاملين. في حال تمرير معامل واحدة فقط، فستكون القيمة الافتراضية للمعامل b هي 7 وسيتم ضرب القيمة الممررة تلك بالمعامل الافتراضي 7 آنذاك. يجب وضع المعاملات الافتراضية في الأخير على النحو التالي: // تعريف صحيح int multiply(int a = 10, int b = 20); // مُقدّمة int a تعريف غير صحيح لأن int multiply(int a = 10, int b); استدعاءات خاصة للدوال - العوامل توجد استدعاءات خاصة في C++ للدوال، وهي ذات صياغة مختلفة عن الصياغة التقليدية name_of_function(value1, value2, value3). المثال الأكثر شيوعا هي العوامل (operators). وهي تسلسلات أحرف خاصة تحوَّل إلى استدعاءات دوال من طرف المصرّف، من أمثلة ذلك، ! و + و - و * و % و << وغيرها. عادةً ما ترتبط هذه المحارف الخاصة باستخدامات غير برمجية، أو تُستخدم للتبسيط (على سبيل المثال، المحرف + يمثل عادةً مفهوم الإضافة). تعالج C++ هذه التسلسلات؛ وتحوّل كل عامل إلى استدعاء الدالة المقابلة. على سبيل المثال، التعبير التالي: 3+3 يكافئ استدعاء الدالة التالية: operator+(3, 3) تبدأ جميع أسماء دوال العوامل بـ operator. في لغة C، لا يمكن تعيين معان جديدة لأسماء دوال العوامل عبر كتابة تعريفات إضافية ذات بصمات نوعية مختلفة، في C++، هذا جائز. يشار إلى ربط تعريفات إضافية بنفس اسم الدالة باسم التحميل الزائد للعامل (operator overloading) في C++، وهو اصطلاح شائع نسبيًا، ولكنه غير عام في C++. التصريح عن الدوال وقواعد مرئيتها في C++، يجب التصريح عن الشيفرة أو تعريفها قبل استخدامها. على سبيل المثال، ينتج عن الشيفرة التالية خطأ في وقت التصريف: int main() { foo(2); // (*) } void foo(int x) {} سيطلق خطأ، لأن الدالة foo استُدعِيت في السطر (*) قبل أن تُعرّف، إذ لا ترى الدالة main هذا التعريف المتأخر للدالة foo بعد استدعائها ضمنها. هناك طريقتان لحل هذه المشكلة: إما التصريح عن foo() أو تعريفها قبل استخدامها في main(). هذا مثال على ذلك: // ووضع جسمها أولا foo التصريح عن الدالة void foo(int x) {} int main() { // الآن foo يمكن استدعاء الدالة foo(2); } من الممكن أيضًا التصريح المسبق (forward-declaration) عن الدالة عن طريق وضع تصريح عن قالبها (prototype declaration) قبل موضع استدعائها والذي يحدد نوع القيمة المعادة واسم الدالة وعدد وسائطها وأنواعها، ثم تعريف جسمها لاحقًا: // foo تصريح عن قالب لدالة باسم void foo(int); int main() { foo(2); // (*) } // ينبغي أن تطابق تصريح القالب أعلاه void foo(int x) { // هنا foo تعريف جسم } أصبحت الدالة foo مرئية، لذا يمكن استدعاؤها الآن ضمن الدالة main في السطر (*) رغم أنها لم تُعرّف بعد. يجب أن يحدد تصريح النموذج نوع القيمة المعادة (void)، واسم الدالة (foo)، وأنواع المتغيرات في قائمة الوسائط (int)، لكنّ أسماء الوسائط غير ضرورية. يمكن وضع تصريحات قوالب الدوال في ترويسة الملف: // foo.h الملف // تصريح عن قالب دالة void foo(int); ثم تقديم التعريف الكامل في موضع آخر: // foo.cpp --> foo.o // foo تضمين الملف الذي يحوي قالب الدالة #include "foo.h" // foo تعريف جسم الدالة void foo(int x) { } ثم، بمجرد تصريف الشيفرة، يمكن ربط كائن الملف (object file) المقابل foo.o بالكائن المصرّف حيث يتم استخدامه في مرحلة الربط، main.o: // main.cpp --> main.o // foo تصريح عن قالب الدالة #include "foo.h" int main() { foo(2); } // (*) استدعاء الدالة foo ممكن هنا، لأنه سبق التصريح عنها، وتعريف قالب ومتن الدالة foo مربوط عبر كائنات الملفات (object files). يحدث الخطأ "رمز خارجي غير محلول" (unresolved external symbol) إذا صادف المصرّف تصريحَ قالب واستدعاء لدالة، دون وجود لجسمها (body). قد يكون حل هذه الأخطاء معقدًا، لأنّ المصرّف لن يبلِّغ عن الخطأ حتى مرحلة الربط النهائية، ولن يعرف السطر الذي يجب الانتقال إليه في الشيفرة لإظهار الخطأ. المعالج الأولي المعالج الأولي (Preprocessor) هو جزء مهم من المصرّف إذ يقوم بتعديل الشيفرة المصدرية، وحذف بعض البتات، أو تغييرها، وإضافة أشياء أخرى. في الملفات المصدرية، يمكننا تضمين مُوجِّهات (directives) للمعالج الأولي. تخبر تلك الموجِّهات المعالج الأولي بتنفيذ إجراءات محددة. يبدأ الموجّه بالرمز # في سطر جديد مثل: #define ZERO 0 من أشهر مُوجهات المعالج الأولي، الموجهات التالية: #include <something> يأخذ هذا الموجه something ويُدرجه في ملفك حيث يظهر الموجه. مثلا، يبدأ برنامج "مرحبا بالعالم!" بالسطر التالي: #include <iostream> يضيف هذا السطر الدوال والكائنات التي تتيح لك استخدام المدخلات والمخرجات القياسية. لا تحتوي اللغة C (والتي تستخدم أيضًا المُعالج الأولي) نفس القدر من ترويسات الملفات كخَلَفها C++، كما أنه يمكنك في C++ استخدام جميع ترويسات C. المُوجِّه الثاني في الأهمية هو على الأرجح الموجّه التالي: #define something something_else يخبر هذا المُوجِّه المعالج الأولي بأنه يجب أن يبدِّل something مكان كل ظهور لـ something_else في الملف الحالي. يمكن أن يجعل هذا الموجّه بعض الأشياء تتصرف مثل دوال، لكنه مفهوم متقدم أشرنا إليه قبل قليل على أنه «شيفرة عملية بدل» (macro code)، ولن نتطرق إليه الآن. something_else ليس ضروريًا، ولكن في حال عدم إضافة something، سيُحذَف كل ظهور لـ something. هذا مفيد جدا، إذ يمكن استخدامه مع المُوجِّهات #if و #else و #ifdef. وفق الصياغة التالية: #if something == true // شيفرة #else // شيفرة أخرى #endif #ifdef thing_that_you_want_to_know_if_is_defined // شيفرة #endif تدرِج هذه الموجِّهات الشيفرة الموجودة في البت الصحيح، وتحذف الآخرين. يمكن استخدام هذا لتضمين أجزاء من الشيفرة حصرًا في أنظمة تشغيل معينة دون الحاجة إلى إعادة كتابة الشيفرة بالكامل. هذه المقالة جزء من سلسلة مقالات عن C++. ترجمة -وبتصرّف- للفصل Chapter 1: Getting started with C++ من الكتاب C++ Notes for Professionals اقرأ أيضًا الدرس 2: القيم مصنَّفة النوع1 نقطة
-
1 نقطة
-
خط سير التطبيق ( عندما يقوم المستخدم بفتح التطبيق _ إذا كان مسجل تظهر الصفحة الرئيسية وإلا فستظهر صفحة تسجيل الدخول " علما أن صفحة تسجيل الدخول هنا تظهر بدون leading " _ ) - عندما يكون المشتخدم بالفعل داخل التطبيق، يوجد drawer يحتوي على مجموعة من الميزات، منها: ( Logout ) عند الضغط عليها يتم تحويل المستخدم إلى صفحة تسجيل الدخول، لكن المشكلة أن صفحة تسجيل الدخول هنا تظهر ب leading ، فكيف يمكن إزالته؟ بحيث تظهر صفحة تسجيل الدخول كما لو كلن المستخدم قد فتح التطبق لتوّه. باختصار / أريد حذف ال leading الظاهر في الصورة المرفقة والمشار إليه بالسهم الأزرق.1 نقطة
-
لا يُمكن أن يكلل بناء أي متجر على ووردبريس بالنجاح ما لم تستخدم قالبًا جيدًا يخدم المنتجات التي تريد الترويج لها. كما يوجد العديد من القوالب الجاهزة والتي توفر تصاميم جاهزة تناسب أنواع معينة من المنتجات وهنا سنذكر مجموعة من القوالب التي تدعم التجارة الإلكترونية من متجر قوالب ووردبريس الرسمي ومتجر بيكاليكا. سنشرح خطوات تثبيت كل قالب واستيراد التصاميم الجاهزة التي يقدمها، وأخيرًا سوف نتحدث عن أهم الإضافات المجانية أو المدفوعة التي لا بدَّ لنا من استخدامها أثناء تطوير متجرنا. قوالب ووردبريس مناسبة للتجارة الإلكترونية قد تتساءل ما الفرق بين قالب موقع عادي وقالب مخصص للمتجر الإلكتروني وهل يصلح أي قالب ووردبريس لأستخدمه في متجري؟ في الواقع لا فليست كل قوالب ووردبريس مناسبة للتجارة الإلكترونية فقوالب التجارية الإلكترونية يجب أن تتوافق بشكل أساسي مع إضافة ووكومرس WooCommerce المسؤولة عن تحويل موقع ووردبريس إلى متجر إلكتروني قابل للتخصيص بعبارة أخرى يجب أن تختار قالب ووردبريس يدعم واجهة ووظائف ووكومرس بشكل كامل بحيث يمكنك إضافة المنتجات، وإدارة الطلبات، وتتبع المخزون، وإدارة وسائل الدفع والشحن، وإجراء عمليات البيع والشراء بسهولة باستخدام إضافة ووكومرس. توفر قوالب ووردبريس المتوافقة مع ووكومرس تصميمات مخصصة للمتاجر الإلكترونية وتخصص صفحات عرض منتجات المتجر، وعربة التسوق وصفحات الدفع وحساب المستخدم ومراجعات المنتجات وتسويق المنتجات وغيرها. سنتعرف في الفقرات التالية على طريقة تثبيت وتخصيص قوالب ووردبريس متوافقة مع إضافة ووكوميرس وتصلح للاستخدام في بناء متجرك الإلكتروني، بالطبع القوالب التي سنتطرق لشرحها هي مجرد عينة توضيحية ويعتمد اختيار القالب على طبيعة متجرك الإلكتروني والمنتجات التي يوفرها. القالب الأول مدفوع من بيكاليكا وهو قالب لذيذ المخصص للمطاعم والكافيهات والقالب الثاني هو قالب أسترا المجاني الذي يناسب المتاجر الإلكترونية العامة، وسبب اختيارنا للقوالب المدفوعة يكون بشكل أساسي لكون بعض الميزات والتصاميم الجاهزة المميزة لا تتوافر إلا ضمن القوالب المدفوعة ومن الممكن أيضًا أن تواجهك بعض المشاكل مع القالب المجاني مثل عدم توافق القالب مع اللغة العربية أو ظهور أخطاء خلال التثبيت والتي يمكن لفريق الدعم التابع للقالب مساعدتك على حلها في حال كنت تملك النسخة المدفوعة وما زلت ضمن فترة الدعم والتي تبلغ عادة سنة كاملة أو 6 أشهر. فإذا لم تجد ما يناسبك من القوالب المجانية أنصحك بأن تأخذ جولة في متجر بيكاليكا للمنتجات الرقمية وستجد فيه العديد من قوالب ووردبريس الاحترافية وقوالب ووكومرس WooCommerce التي تتوافق بالكامل مع اللغة العربية وتلبي احتياجات أنواع مختلفة من المواقع والمتاجر الإلكترونية. قالب لذيذ من بيكاليكا اخترنا من متجر بيكاليكا قالب باسم لذيذ وهو قالب ووردبريس مدفوع مخصص لمواقع المطاعم والكافيهات يتميز بتصميم مميز وحديث ويوفر مجموعة واسعة من الميزات ولا يتطلب خبرة برمجية مسبقة لإدارة وتعديل الموقع يتميز هذا القالب بكونه متعدد النماذج حيث يحتوي على ثلاثة نماذج احترافية لمواقع المطاعم كما أنه يوفر لك 42 صفحة مختلفة تلبي احتياجات مواقع المطاعم الإلكترونية كما يوفر ديمو مسبق يمكن استيراده لجعل موقعك مطابقًا للنماذج المعروضة. يتضمن القالب كذلك لوحة تحكم احترافية متقدمة لتخصيص الموقع وإدارته ونظام ألوان ذكي يساعدك على تغيير ألوان القالب بسهولة وهو يدعم بشكل كامل إنشاء متجر إلكتروني متكامل باستخدام ووكومرس ويتميز بسرعة عالية في التصفح وتوافقية مع كافة أحجام الشاشات والمتصفحات ويوفر دعم فني وتحديثات دورية للقالب بدون تكاليف إضافية. قالب ASTRA من متجر قوالب ووردبريس يتوفر من هذا القالب نسختان الأولى مجانية والثانية مدفوعة مستخدمة من قبل أكثر من مليون موقع. النسخة المدفوعة منه تكلف 59 دولار اشتراك لمدة عام ويمكنك استخدامها على عدد غير محدود من المواقع. التقييمات التي حصل عليها القالب مرتفعة ومن بين العديد من القوالب التي استخدمتها فإن قالب ASTRA سهل التنصيب وسريع التحميل والدعم جيد جداً (أحيانًا نتيجة الضغط يتأخرون في الرد على مشكلتك)، وهو يمتلك خيارات تصميم جاهزة متنوعة كما يعطي حرية في التعديل على الموقع دون الحاجة لامتلاك خبرة برمجية (النسخة المدفوعة). يمكن أن تنزل القالب على جهازك من خلال زيارة الموقع ASTRA ثم الضغط على مفتاح Download والذي يطلب منك اسمك وبريدك الإلكتروني ثم يبدأ تنزيله بشكل ملف مضغوط يمكن استخدامه لتثبيت قالب ووردبريس أو يمكن تثبيته مباشرة على الموقع من داخل لوحة تحكم موقع ووردبريس كما سأشرح لاحقًا في فقرة كيفية تثبيت قالب في ووردبريس. الفرق بين النسخة المدفوعة والمجانية هي في الدعم وسهولة التعديل على التصميم ويمكنك الاطلاع على التفاصيل عبر الرابط مقارنة بين Astra pro وAstra free. كيفية تثبيت قالب من بيكاليكا كي تتمكن من شراء قالب من متجر بيكاليكا يجب عليك إنشاء حساب جديد عن طريق النقر على زر حساب جديد أو تسجيل الدخول إلى حسابك الموجود على موقع حسوب. بعد ذلك، يجب إيداع مبلغ في رصيد حسابك كي تتمكن من إجراء عمليات الشراء من المتجر. بعد تسجيل الدخول يمكنك استعراض المنتجات وفقًا للتصنيفات حيث يمكنك اختيار واحدة من بين العديد من تصنيفات المنتجات مثل قوالب ووردبريس، قوالب ووكومرس، قوالب HTML وغيرها كما يمكنك البحث على المنتج الذي تحتاجه بسهولة وسرعة عن طريق إدخال الكلمة المفتاحية في شريط البحث الموجود في الصفحة الرئيسية للموقع ومن ثم انقر على زر البحث لعرض المنتجات المتوافق. بعد تسجيل الدخول إلى موقع بيكاليكا اخترت تصنيف قوالب ووردبريس وتصفحت القوالب المتاحة على الموقع. بعد ذلك تصفحت قوالب ووكومرس للعثور على قالب يلبي متطلبات الموقع الذي أرغب في إنشائه وبعد أن وقع اختياري على قالب لذيذ حددت رخصة استخدام القالب ونقرت فوق زر إضافة المنتج للسلة كما في الصورة التالية: بعد إضافة المنتج ظهرت لي النافذة التالية، نقرت هنا فوق زر إتمام الشراء وانتقلت إلى صفحة سلة التسوق في صفحة سلة المشتريات سيظهر لك المنتج أو مجموعة المنتجات التي اخترتها وسعرها الإجمالي انقر فوق زر الدفع الظاهر أسفل هذه الصفحة. كل ما عليك الآن هو النقر فوق زر إتمام عملية الدفع ليتم اقتطاع سعر المنتج من رصيد حسابك في الموقع ويصلك إشعار بإتمام الطلب وتوفير رابط لتحميل القالب. بالنقر فوق زر التحميل كما هو موضح في الصورة التالية سيبدأ تحميل المنتج الذي اشتريته على جهاز الحاسوب الخاص بك بعد اكتمال التحميل حصلت على ملف مضغوط يتضمن مجموعة من الملفات أهمها ملف القالب وملف ابن أو فرعي للقالب child theme في حال رغبت بإجراء تعديلات على ملفات القالب الرئيسية مثل تعديل التصميم أو الوظائف وضمان عدم فقدانها في حال تحديث القالب الأصلي و النماذج والوسائط المستخدمة في القالب وملفات توثيق ومن الضروري قراءة التوثيق بعناية للتعرف على الطريقة الصحيحة لتثبيت القالب في متجرك الإلكتروني وتعديله ليناسب متطلباتك. بعد اكتمال تحميل القالب انتقل الآن لموقع وودربريس واختر من لوحة التحكم المظهر ثم قوالب ثم أضف جديد بعد ذلك اضغط على زر رفع قالب أعلى النافذة ثم انقر فوق زر اختيار ملف وحدد موقع الملف المضغوط lazeez.zip الخاص بالقالب وانقر على زر التنصيب الآن لتنصيب القالب من الملف المرفوع. بعد اكتمال عملية التنصيب انقر فوق الرابط تفعيل لتفعيل قالب لذيذ في موقعك. أخيرًا قم بتنصيب وتفعيل الإضافات المطلوبة مع القالب الخطوة التالية هي استيراد بيانات النماذج التي يوفرها القالب من خلال التبويب المظهر ثم النقر فوق استيراد بيانات النماذج، في حالتي اخترت نموذج كافيه ومحل عصائر، بعدها سيطلب منك القالب تنصيب مجموعة من الإضافات الضرورية لاستيراد النموذج ومن ضمنها إضافة ووركوميرس ويستورد لك مجموعة من المنتجات الافتراضية لمتجرك. سنحصل في نهاية هذه الخطوات على موقع ووردبريس يمتلك إضافة ووكومرس ومجهز بالصفحات الخاصة بمنتجات العصائر والمشروبات والتي يمكنك تعديلها وفق بيانات وصور منتجاتك الفعلية. بعد اكتمال عملية الاستيراد تظهر لك النافذة التالية التي تبين نجاح العملية: يمكنك الآن زيارة الموقع لعرض النتيجة ورؤية المحتوى التجريبي الذي استوردته و التغيير الكبير الذي حصل في مظهر الموقع ومحتوياته من صفحات ومقالات، أنت بالطبع حر في تعديل ما تشاء منها أو إضافة محتوى جديد عليها. كما يوفر لك هذا القالب الاحترافي لوحة تحكم سهلة الاستخدام تصل لها بالنقر فوق اسم القالب ضمن التبويب المظهر في لوحة التحكم وستلاحظ توفر الكثير من الخيارات التي يمكنك من خلالها تعديل ما تريده من مظهر موقعك سواء الخطوط أو الألوان أو غير ذلك. ارجع إلى توثيق القالب وستجد الكثير من التفاصيل للتعامل مع هذا القالب وتخصيصه وفق متطلبات علامتك التجارية. كيفية تثبيت قالب من متجر ووردبريس الرسمي الآن سوف أقوم بشرح طريقة تثبيت قالب من المتجر الرسمي لقوالب ووردبريس وسأختار هنا قالب أسترا المعروف الذي يوفر محتوى جاهز لمتجرك يتضمن منتجات وصفحات افتراضية مستفيدين من ميزة الاستيراد التي يقدمها لها القالب وبعض الإضافات المساعدة. سنحصل في نهاية هذه الخطوات على موقع ووردبريس يمتلك إضافة ووكومرس ومجهز بالصفحات الخاصة بالمنتجات وعملية الشراء وينقصه فقط إضافة بعض المنتجات. سوف أستخدم موقع ووردبريس الذي أنشأته في درس سابق باستخدام استضافة Cloudways لذا سجل دخول لحسابك في الاستضافة وانتقل للوحة تحكم أدمن الموقع الموجودة على الرابط example.com/wp-login.php كما شرحنا في المقال السابق. طبعًا ما زال الموقع يستخدم القالب الافتراضي نفسه عند تنصيب الموقع عبر استضافة Cloudways وهو في حالتنا القالب الافتراضي Twenty Twenty ويظهر ذلك من زيارة الصفحة الرئيسية للموقع أو يمكن معرفة ذلك من خلال النقر فوق التبويب مظهر على يمين لوحة التحكم ثم النقر فوق قوالب، حينها يمكنك رؤية كافة القوالب المثبتة على موقعك ومعرفة أي قالب هو المُفعل، ولتثبيت قالب ووردبريس جديد عليك النقر فوق زر "أضف جديد" الموجود في أعلى النافذة. الآن سوف تظهر لك نافذة جديدة تحوي العديد من القوالب المجانية التي تستطيع تثبيتها بمجرد الضغط عليها وهي موجودة ضمن مخزن قوالب ووردبريس الرسمي ولكن في حال أردت تنصيب قالب غير موجود ضمن المخزن ولكني أمتلك ملفاته على حاسوبي اضغط على خيار "رفع قالب" في أعلى الصفحة وبعدها أختار الملف من حاسوبي. الآن اضغط على خيار "التنصيب الآن" ليبدأ الموقع برفع الملف من الحاسوب وفك ضغطه وتثبيته على الاستضافة. وبعد الانتهاء من عملية التثبيت سوف يطلب منك الموقع تفعيل القالب وذلك بالضغط على خيار تفعيل. بعد تفعيل القالب سوف يتم تحويلك إلى النافذة المبينة في الصورة التالية والتي تبين أنَّ القالب المفعل الآن أصبح Astra وفي حال قمت بزيارة الموقع سوف تلاحظ أنَّ شكله قد تغير. بعد الانتهاء من تثبيت قالب Astra سيوجهك القالب لتنصيب إضافة Spectra وهي إضافة ووردبريس مثالية طورتها نفس شركة تطوير قالب Astra وظيفتها توسيع محرر المكونات في ووردبريس وتزوديه بالعديد الكتل الإضافية والتصاميم الاحترافية التي تساعدك على إنشاء صفحتك بسهولة وسرعة، لذا أنصحك بتثبيتها على الفور، وفي حال لم تثبتها مباشرة بعد تثبيت القالب لا مشكلة يمكنك تثبيتها لاحقًا بطريقة مماثلة لتثبيت أي إضافة ووردبريس أخرى. كما تلاحظ فإن موقعنا إلى الآن لا يتضمن محتوى باستثناء المقالة الافتراضية بعنوان "أهلًا بالعالم" والصفحة الافتراضية بعنوان "مثال على صفحة" التي يضيفها نظام ووردبريس بشكل افتراضي ولم يتم تخصيص تصميمه بشكل احترفي، لذا أمامنا خياران إما أن نقوم بأنفسنا بعملية التخصيص وإضافة المحتوى بشكل يدوي أو نستورد قوالب جاهزة تسرع العمل وتبني لنا الموقع المطلوب بمحتوى تجريبي ويمكننا بالطبع أن نعدله كما نشاء بعدها. سنختار حاليًا الطريقة الثانية وللقيام بذلك نحتاج إلى تثبيت إضافة مساعدة هي إضافة Starter Templates التي توفر مجموعة قوالب أو تصاميم جاهزة تستخدم قالب Astra وتوفر عليك عناء التصميم الذي يتطلب الكثير من الوقت والجهد والخبرة في استخدام إضافات البناء Page builder plugins وتجدر الإشارة لأن بعض هذه التصاميم مجاني وبعضها مدفوع. لكن قبل أن نبدأ بتنصيب الإضافة Starter Templates دعنا قبل ذلك نحول هذا الموقع من مدونة إلى متجر إلكتروني من خلال تثبيت إضافة ووكومرس الشهيرة woocommerce التي تمكننا من إنشاء متجر إلكتروني متكامل وإدارته بسهولة فائقة. لتثبت الإضافة يجب تسجيل الدخول للوحة تحكم الموقع بدور مسؤول ثم الانتقال إلى التبويب إضافات ثم تبويب "إضافة جديد" بعدها نكتب ضمن مربع البحث woocommerce ثم ننقر فوق زر التنصيب الآن للبدء بتنصيبها ثم زر تفعيل لتفعيلها على الموقع. بعد تفعيل الإضافة سوف ينقلك الموقع إلى صفحة إعداد إضافة ووكومرس WooCommerce ولأن إعداد الإضافة يتضمن العديد من المراحل سوف نتطرق لشرحها بالتفصيل في المقال التالي من هذه السلسلة، لذلك سنكتفي حاليًا بهذه الخطوة ونضغط على الرابط skip setup store details الظاهر أسفل الصفحة وسنعود لإتمام هذه العملية لاحقاً. بالعودة لإضافة Starter Templates والبدء باستخدامها علينا التوجه من جديد للتبويب إضافات في لوحة التحكم والنقر فوق أضف جديد وكتابة starter templates Astra في مربع البحث وعند ظهور للإضافة المطلوبة ننقر فوق زر التنصيب الآن ثم تفعيل. بعد تفعيل الإضافة ستلاحظ وجود خيار جديد في التبويب المظهر باسم Starter Templates وبالنقر فوقه ستظهر لك صفحة تعريفية بالإضافة، انقر فوق الزر Build Your Website Now للبدء باستخدامها وبناء موقعك بالاستعانة بأحد تصاميمها. الخطوة التالية هي تحديد إضافة باني الصفحات التي ستعتمدها لتحرير موقعك وهنا أفضل اختيار محرر ووردبريس الافتراضي Block Editor المعروف كذلك باسم محرر جوتنبرج Gutenberg فهو محرر مرن وسهل الاستخدام وقابل للتوسيع من خلال إضافات مساعدة بعدها سأنتقل مباشرة للخطوة التالية. تستطيع اختيار ما شئت من قوالب تعجبك وتتناسب مع تصميم ومحتوى موقعك، أما بالنسبة لي فسوف أختار التصميم Organic Store. ستظهر لك نافذة يمكنك من خلالها تخصيص بعض الأمور الخاصة بموقعك مثل صورة الشعار وحجمه وتخصيص الألوان وما إلى ذلك أو يمكنك النقر فوق زر Skip and Continue لمتابعة عملية الاستيراد وتخصيصها في مرحلة لاحقة. تبدأ الآن عملية الاستيراد وقد يستغرق الأمر بعض الوقت لإتمام العمل، بعد انتهاء عملية الاستيراد بنجاح سوف تظهر لك رسالة تخبرك بأن الأمر تم بنجاح ويمكنك الآن استعراض الشكل الجديد للموقع بالنقر فوق الزر View your website وستلاحظ التغيير الكبير الذي ظهر على مظهر الموقع ومحتوياته من صفحات ومقالات. تجدر الإشارة بأن عملية الاستيراد قد تقوم بتثبيت مجموعة من الإضافات الجديدة وفق ما يتطلبه التصميم الذي اخترته وهذا يمكنك ملاحظته إذا توجهت إلى تبويب الإضافات المنصبة في موقعك. خاتمة تعرفت في هذا المقال على طريقة تثبيت وتخصيص قوالب مناسبة لمتجرك الإلكتروني ولكن هذا لا يعني أن هذه الخيارات هي الوحيدة المتوفرة أو أنها سوف تبقى الأفضل. فيوميًا تظهر قوالب جديدة وميزات جديدة منافسة لما هو متوفر الآن لذلك عليك أن تبقى مطلعًا باستمرار على كل ما هو جديد وتختار الأنسب لمتطلبات موقعك. سيتضمن المقال القادم شرح المزيد من الخطوات حول تثبيت إضافة ووكومرس WooCommerce وتخصيص المتجر وإضافة المنتجات لموقعك، سوف تجد أيضًا شرح الأقسام المختلفة لهذه الإضافة بالتفصيل. اقرأ أيضًا المقال التالي: تثبيت إضافة WooCommerce وضبطها وبدء العمل على إنشاء متجر إلكتروني المقال السابق: لمحة عن لوحة تحكم ووردبريس استخدام قوالب ووردبريس كيفية تخصيص قالب ووردبريس الخطوات الأولى للعمل مع ووردبريس1 نقطة
-
مرحبا من رايى الشخصى وخبرتى بالمجال كمصممه جرافيك وموشن جرافيك اعتقد انه من الافضل فى برامج المونتاج برامج ادوبى. ادوبى بريمير للمونتاج الفيديو وإضافة المؤثرات الصوتيه والمرئية وايضا برنامج ادوبى اودشن للمونتاج الصوت وايضا برنامج افترافيكت وهذا افضل برنامج لتحريك الرسومات والشخصيات المتحركه وعمل 3d فيديو بالتوفيق1 نقطة
-
لحل هذه المشكلة يجب عليك تغيير إعدادات BIOS , إذهب إللى إعدادات BIOS ضمن Advanced / Boot / Boot Configuration (تكوين التمهيد / التمهيد / التكوين المتقدم) قم بتغييره من "Fast Boot" إلى "Disabled". السبب في تمهيده (مرة واحدة) بعد ضبط جهاز التمهيد الأساسي هو أن BIOS لا يقوم بعملية "التمهيد السريع" في المرة الأولى التي يتم فيها التمهيد لأول مرة.1 نقطة
-
مرحبا لقد قراة منشورك و نصيحتي لك هو ان تتعلمي ل برنامج ادوبي بريمر فهو احسن برنامج للمبتدئيمن و بالتوفيق لك1 نقطة
-
ممكن بهذا الشكل. #include <iostream> using namespace std; #define colleges 7 #define OtherOptionsRow 1 #define OtherOptionsCol 1 char size[4][25] = { "Small", "Medium", "Large", "XLarge" }; unsigned int savedata[colleges + OtherOptionsRow][4 + OtherOptionsCol], TotalAll = 0; int main(int c, char **g) { // Input & Calc for (int college = 0; college < colleges; college++) { cout << endl << "College Details ( " << college+1 << " )" << endl; savedata[college][4] = 0; for (int sizeidx = 0; sizeidx < 4; sizeidx++) { cout << "\t" << "Count Size " << size[sizeidx] << " "; cin >> savedata[college][sizeidx]; cout << savedata[college][sizeidx]; savedata[college][4] += savedata[college][sizeidx]; } } cout << endl << endl; // Output cout << "\t" << "\t" << "\t"; for (int college = 1; college <= colleges; college++) { cout << college << "\t"; } cout << "Total" << endl; int sizeidx = 0; for (; sizeidx < 4; sizeidx++) { cout << size[sizeidx] << "\t\t\t"; savedata[colleges][sizeidx] = 0; for (int college = 0; college < colleges; college++) { savedata[colleges][sizeidx] += savedata[college][sizeidx]; cout << savedata[college][sizeidx] << "\t"; } cout << savedata[colleges][sizeidx] << endl; } cout << "College Total\t\t\t"; for (int college = 0; college < colleges; college++) { TotalAll += savedata[college][sizeidx]; cout << savedata[college][sizeidx] << "\t"; } cout << endl << "Total Quantity On Hand " << TotalAll << endl; }1 نقطة