أهلا ومرحبا بكم مرة أخرى.
في هذه المحاضرة أريد أن أذهب من خلال
عرض حل لتحدينا السابق الذي كان لإنشاء
بعض الوظائف ، وخاصة وظيفة GCD و a دالة زوجية ، دالة قيمة مطلقة ودالة
جذر تربيعي.
سأقوم بإنشاء مشروع ، و سأقوم على الأرجح
بتسمية وظائف المشروع ، أنا ذاهب لإغلاق مشروعي الحالي هنا.
سوف يكون آخر استمارة القنصلية.
لم نحصل عليه حقًا في المكتبات أو أي نوع من البرمجة
الرسومية.
هذا سيكون كيف حول بعض الوظائف فقط.
عادة ، تريد أن يكون لديك ملف حسن السمعة هناك ، ولكن
هذا فقط لأغراض التعلم.
لذلك نحن نوعًا ما توفير وظائف عامة.
إذا كان برنامج GCD ، كنت سأفعل ذلك اكتب القاسم المشترك الأكبر.
لكن أول شيء سنفعله هو أننا بصدد تنفيذ أكبر برنامج
مشترك لدينا للمقسوم عليه.
ستكون هذه وظيفة يجد القاسم المشترك الأكبر بين عددين
صحيحين غير سالبين القيم ثم تقوم بإرجاع النتائج.
يجب أن نقدم وظيفة النماذج الأولية أيضًا حتى نتمكن من الاتصال
بها ويمكننا وضعها لهم في أي مكان في الوظيفة.
لذلك دعونا نفعل ذلك.
بالنسبة للوظيفة الأولى ، هذا هو إعلان وظيفة.
لماذا نصنع وظيفة إعلان ، حتى نتمكن
من استدعاؤه في أي مكان في البرنامج.
لا يتعين علينا في الواقع تنفيذ هذه الوظيفة
فوق الوظيفة الرئيسية عندما نسميها.
إنها مجرد ممارسة جيدة ، إنها من السهل جدًا أن تكون واضحًا لمعرفة
ما يحدث في البرنامج مع جميع ملفات إعلانات الوظائف في الأعلى.
سيعود هذا إلى عدد صحيح.
لذا تذكر ، وظيفة رأس الأول الشيء الذي تفعله هو تحديد نوع البيانات التي سيتم
إرجاعها.
سيعود GCD إلى عدد صحيح.
سوف تقوم بعد ذلك بتسمية الوظيفة التي هي GCD.
وبعد ذلك يوجد داخل الأقواس البيانات التي يتم تمريرها إلى GCD.
وهذا سوف أن تكون كذلك.
سنقوم بتمرير عنصرين من البيانات.
لذلك نفصل بينها بفاصلات.
نحدد نوع البيانات لـ كل واحد واسم المتغير.
سأقول فقط في u و v.
ثم لدي الفاصلة المنقوطة إنهاء تعريف الوظيفة.
الآن يمكنني تحديد وظيفتي أدناه الرئيسي ولا يزال بإمكاني استدعاؤه
وعدم التعرض لأية مشاكل.
حتى الآن عندما تريد في الواقع تحديد
وظيفة تنفيذها ، تقوم بنفس الوظيفة قيمة إرجاع رأس int GCD.
يجب أن تتطابق مع إعلان من حيث الأنواع.
يمكنك تسميته شيء آخر مثل int x للأسماء ، لكننا سنكون
متسقين.
سنقول فقط int v.
نحن نعلم أنها الوظيفة التعريف لأن هناك
أقواس تحدد الجسم.
هذا هو رمز التنفيذ.
الخوارزمية الفعلية لـ GCD بسيط للغاية.
كل ما عليك فعله هو كتابة حلقة وتصفح الحلقة وانظر إلى القيم المؤقتة
بناءً على الباقي.
لذلك سأقوم بإنشاء محلي متغير داخل وظيفة GCD الخاصة بي.
كيف نعرف أنه محلي لأنه إنه داخل الأقواس من 12 إلى 14.
هذا المتغير لا يمكن الوصول إليه داخل الوظيفة الرئيسية.
إنه محلي فقط لهذه الكتلة.
أنا هنا فقط استدعاء temp لأنه محلي.
سأقوم الآن أيضًا بإنشاء الحلقة الخاصة بي.
سأستخدم حلقة while.
وحلقة بلدي أثناء الذهاب فقط للذهاب حتى v ، والذي سيكون القاسم المشترك
الأكبر لدينا.
تذكر ، أكبر مشترك يأخذ القاسم معلمتين.
سيستغرق الأمر معلمة.
واستنادًا إلى هاتين المعلمتين ، لديها خوارزمية لتكوينها للعثور
على القاسم المشترك الأكبر.
لذلك إذا كنا نحاول إيجاد المقسوم عليه
، علينا التأكد من أن v لا يساوي صفر ، المعلمة الثانية لدينا.
هذا مجرد معيار أجزاء من الخوارزمية.
بينما v لا يساوي إلى الصفر ، سنضع
أقواس للحلقة.
ما سنفعله هو أننا سنقوم أولاً بتعيين
درجة الحرارة لقيمة الوحدات النمطية لـ u mod v.
ثم سنقوم بتعيين u يساوي v ، وسنساوي v بالدرجة
الحرارة.
وبعد ذلك نريد العودة البيانات من هذه الوظيفة.
فكيف نعيد البيانات من وظيفة؟ نستخدم الكلمة الرئيسية
للإرجاع ، ونعيد فقط البيانات التي نريد إرجاعها.
في هذه الحالة ، نريد إرجاع u.
الآن تذكر أنه إذا كانت هذه الوظيفة لم يُرجع أي بيانات ، فسيتعين
علينا تغيير النوع إلى باطل.
وبعد ذلك يمكننا فقط لديك عائد مع عدم وجود بيانات.
لكن هذا يعيد البيانات.
لذلك علينا أن نتطابق.
وها نحن ذا قل العودة مرة أخرى ش.
أيضا إذا كنا لا نمرر البيانات لهذه الوظيفة ، يمكننا
وضع الفراغ كمعلمات أو يمكننا ذلك إبقائهم فارغين وهذا يعني أن
الوظيفة لا تأخذ أي بيانات ، لكننا نجتاز متغيرين.
وهذان المتغيران u و v هما المتغيرات المحلية لوظيفة GCD.
يمكننا استخدامها داخل الدالة.
وهذا ما نفعله.
هذه كلها سمات الوظيفة.
القيمة المعادة والبيانات التي تقوم بالمرور باستخدام المتغيرات
المحلية ثم إرجاع البيانات.
كل هذه الأشياء تولي اهتماما في بناء الجملة مع الأقواس ثم أيضًا
مع الإعلان في الأعلى.
الآن نريد أن نحاول اختبر هذه الوظيفة.
لذلك نريد اختباره للجميع أنواع مختلفة من الأشياء.
دعونا نمضي قدما ونتذكر أن هذا تقوم الدالة بإرجاع البيانات ، لذا ربما نرغب في إنشاء
متغير محلي في الرئيسية لدينا ، سوف نسميها فقط نتيجة.
يمكننا تهيئته إلى الصفر.
وبعد ذلك نريد ذلك استدعاء الوظيفة أساسًا.
كيف نستدعي وظيفة؟
نحن فقط نحدد الوظيفة الاسم متبوعًا بالبيانات التي يتم تمريرها
إليها.
لأن هذه الوظيفة ترجع البيانات ، سأقول النتيجة
تساوي ثم اسم الوظيفة.
اسم الوظيفة هو GCD.
وسأمررها 150 لاختباري الأول و 35.
سأقوم باختبارين آخرين لتمرير أرقام مختلفة فقط ، لكن ما أريده هو أنني
أريد لطباعة البيانات التي يتم إرجاعها
إلى النتيجة.
لذلك سأقول printf ، وأنا كذلك سيقول أن GCD لـ 150 و 35 هي تغذية خط النسبة
المئوية ثم النتيجة.
الصحيح. لذا فإن السطر 10 مهم.
نحن نحصل على البيانات مرة أخرى من GCD لذلك نحن نسنده إلى متغير.
ويمكننا تسمية الدالة بالمرور في ثابتين هنا ، 150 و 35.
يمكننا أيضًا تمرير المتغيرات.
الطريقة التي نستدعي بها الوظيفة مع البيانات التي تم تمريرها
إليها داخل الأقواس ، نضع القيم مفصولة بفواصل ثم الفاصلة المنقوطة
في النهاية هناك.
أريد أن أجري عدة اختبارات.
لذا سأقوم بنسخ السطر 10 و 11 وقم فقط بوضع بعض البيانات الأخرى.
سأضع الرقم 1026 و 405 ثم 83 أيضًا.
وفي الواقع ما يمكننا فعله هو بدلاً من إرجاع المتغير
، يمكننا في الواقع وضعه في استدعاء الوظيفة داخل
printf وطباعتها هناك مباشرة ، ليس علينا حتى حفظه.
لذا يمكننا أن نقول GCD 83 ، 240.
سيتعين علينا تغيير ماذا
نحن نطبع من حيث القيم المشفرة هنا ، على سبيل المثال 1026 و 405 ثم 240 و 83 أيضًا.
لذلك دعونا نمضي قدمًا ونجمع ذلك.
دعونا نتأكد من أننا حصلنا عليها لا أخطاء أو تحذيرات.
ليس لدينا أخطاء وتحذيرات.
لذلك دعونا نديرها.
عندما نقوم بتشغيله ، يجب أن نرى القاسم المشترك الأكبر
ثلاث مرات لأرقام معينة.
إذن نرى GCD لـ 150 و 35 هو 5.
GCD لـ 1026 و 405 هي 27.
و GCD لـ 83 و 240 هو 1.
أكبر قاسم مشترك يعني العوامل التي تدخل في هذين العددين
، ما هو العامل الأكبر.
إذن ، 5 يذهب إلى 35 ، و 5 يذهب إلى 150.
وهذا هو أعلى واحد.
27 يدخل أيضًا في 405 و 1026 ، وهذا أعلى واحد بين الاثنين.
لذلك يبدو أنه يعمل.
وقمنا بتغطية أساسيات تمرير البيانات وإعادة البيانات.
الآن نريد أن نمارس زوجين أشياء أخرى من حيث الخوارزميات
العادلة وحل المشكلات.
لنقم بإنشاء وظيفة أخرى تسمى القيمة المطلقة.
دالة القيمة المطلقة مستمرة لإرجاع تعويم وتأخذ تعويم.
ستكون أ وظيفة بسيطة للغاية.
لذلك سوف نعلن الوظيفة حتى السطر الخامس.
سنقول تعويم مطلق القيمة ، هذا اسم متبوع بالمعلمات ، ونحن فقط
سوف نقول float x ، ثم ننهي فاصلة
منقوطة.
مرة أخرى ، لاحظ الوظيفة الإعلان ، قيمة الإرجاع
، تحدد المعلمات بأنواع البيانات ثم اسم الوظيفة.
يمكننا بعد ذلك المضي قدمًا وتحديد هذه الوظيفة أسفل
وظيفة GCD وستكون بسيطة للغاية.
نحدد الوظيفة بالنوع التي سيتم إرجاعها ، الاسم ثم المعلمة
، تمامًا مثل إعلان باستثناء أنه لدينا الآن أقواس لبدء كتلة التعليمات
البرمجية.
هذا سهل لأن كل ما علينا القيام به هو التحقق من المعلمة التي تم تجاوزها
وتحقق مما إذا كانت أقل من الصفر.
إذا كان أقل من الصفر ، إذن سنقوم فقط بتعيين
المعكوس الذي سيكون a ناقص x.
لذلك إذا كانت قيمة سالبة ، سيضرب
في ناقص ويعود موجب.
ونريد إعادة تلك البيانات.
إذن سنقول إرجاع x.
الآن شيء واحد ذكرته في المحاضرات التي
لم أحصل على مثال لها كانت ماذا إذا قمت بإرجاع البيانات طوال الوقت.
لأنه يمكننا الحصول على مجموعة من عبارات if ، ويمكن أن نعود في
كل عبارة if.
وهكذا يمكن لوظيفتك ، في نظرية ، لديها العديد من عبارات الإرجاع إذا
كانت داخل ifs أو حلقات.
وبعد ذلك يمكنك ذلك واحد في الأسفل.
المشكلة مع هذا من الصعب حقًا المتابعة.
إذا كنت بحاجة للعودة مختلفة أجزاء من التعليمات البرمجية الخاصة بك ، في الأساس ، ما
عليك سوى تخزين البيانات في متغير وإعادته في الأسفل.
لكن هذه وظيفة بسيطة.
نحن فقط نعيد قيمة.
دعنا نمضي قدمًا ونحاول استخدامها هذه الوظيفة ومن الجميل حقًا أنها تأخذ عددًا
عوامات حتى نتمكن من ذلك استخدمه مع الأعداد الصحيحة والعائمة.
لذلك سأقوم بإنشاء بعض المتغيرات التي
سنجتازها هنا.
وأنا أيضا ذاهب لإنشاء عدد صحيح.
سأفعل ذلك في الجزء العلوي من بلدي الرئيسي.
سأقوم بإنشاء تعويم لـ F1 F2 F3.
وسأقوم بإنشاء عدد صحيح I1.
وسأقوم بإنشاء أخرى متغير يخزن النتيجة ولكن يجب أن يكون
عددًا عشريًا.
لذلك سأضطر إلى الإبداع
متغير آخر وهذا سيقول فقط نتيجة
القيمة المطلقة ، وسأقوم بتهيئة ذلك إلى 0.
0.
الآن سأقوم باستدعاء وظيفة وطباعة النتائج.
لذلك سأقوم بنسخ و الصق بعض التعليمات البرمجية هنا.
يمكنني استدعاء الوظيفة والتخزين البيانات التي تم إرجاعها أو يمكنني
فقط تمريرها إلى وظيفة printf.
ربما أرغب في عمل بعض التعليقات هنا لاختبار
دالة القيمة المطلقة.
وعند استخدام العلامات النجمية على ملف واحد الخط ، يسلط الضوء عليه نوعًا ما.
لذلك قمت هنا بلصق مجموعة من المكالمات إلى المطلق وظيفة القيمة ثم عرض بعض النتائج.
لذا هنا في 24 ، أنا أتصل القيمة المطلقة مع f1.
تذكر أن f1 عبارة عن عدد عائم.
إنها تساوي سالب 15. 5.
سأقوم بتنسيق ملف النتيجة وطباعتها.
ثم أنا أيضًا ذاهب لطباعة f1.
لذلك سنرى ما إذا كان تتغير النتيجة عن
طريق استدعاء الوظيفة من الأصل.
لذلك سأطبع نتيجة استدعاء الوظيفة ثم القيمة
الأصلية.
هذا سوف يخبرنا إذا تغيرت على الإطلاق.
إذا كانت سلبية في الأصل وتغيرت إلى إيجابية.
القيام بذلك على عدة خطوط لاختبارات متعددة.
ثم في السطر 37 ، الوحيد الاختلاف هنا
هو أنه بدلاً من تخزين القيمة في متغير ، سأقوم فقط بطباعته.
لذلك لا بد لي من تغيير النتائج هنا للمتغير الصحيح.
لذلك دعونا نفعل ذلك و.
لذا هنا في الأسفل ، أريد أن أفعل ذلك.
عندما كتبت في الأصل ملف برنامج ، كتبتها منفصلة.
لذلك آمل ألا أرتكب أخطاء هنا.
وتغيير كل ما احتاجه للتغيير وهذا يجب أن يفعل ذلك.
الآخرون في الواقع ليسوا كذلك طباعة نتائج جميع المتغيرات
، فقط المتغيرات الموجودة في السطر 26.
خلاف ذلك ، نحن فقط تظهر النتائج.
الأول يظهر ذلك فقط أنه تغير لأن
f1 قيمة سالبة.
حسنًا ، لنبني هذا.
ليس لدينا أخطاء أو لا تحذيرات.
المخرجات التي نريدها انتبه إلى ناتج
القيمة المطلقة.
لذلك قد يكون من الأفضل في الواقع إضافة بعض الخط يغذي.
بعد أن نعرض آخر عرض لدينا ، دعنا نضيف موجزات سطرين.
أسهل لقراءة وتشغيل هذا.
والآن نرى أن النتيجة هي 15. 5.
لذا فقد غيرته بالفعل من سالب إلى موجب لأن f1 كانت
في الأصل 15. 5.
وجميع النتائج الأخرى هي أيضًا قيم موجبة.
لم تتم طباعة آخر بيان مطبوع خارج النتيجة ، قام فقط بطباعة القيمة
التي تم إرجاعها من الوظيفة.
يبدو أنه يعمل.
الوظيفة الأخيرة التي أردت القيام بها كان تعريف دالة الجذر التربيعي.
ستكون هذه وظيفة يحسب الجذر التربيعي لرقم.
وإذا كانت الحجة السلبية مرت ، سيتم عرض رسالة
وسيتم إرجاع سالب 1.
لذلك دعونا نحدد إعلان هذه الوظيفة كجذر تربيعي
عائم ويأخذ عددًا عشريًا مع أي اسم.
والجذر التربيعي يتجه بالفعل لاستخدام دالة القيمة المطلقة.
حتى نتمكن من تحديده أعلاه ولا يزال يستخدمه بسبب
إعلان الوظيفة.
فلنعرّفها ، ويأخذ عوامة.
لذلك نحن في متناول اليد جدًا تحديد هذه الوظائف ، نوع البيانات
لمعلمات الإرجاع ، الأقواس.
سنقوم بإنشاء زوجين المتغيرات المحلية هنا.
يمكن أن تكون هذه فقط يتم الوصول إليها داخل الكتلة.
هذا سيساعد فقط باستخدام خوارزمية الجذر التربيعي.
ستلاحظ هنا في السطور 59 ، لقد خلقت متغيرًا ثابتًا.
لم نتحدث عن ذلك ، ولكن هذه مجرد طريقة لإنشاء
ثابت بدلاً من استخدام تعريف.
أنشأنا متغير عائم باسم إبسيلون ، إنه. 001 ، فهو يساعد في حساب الجذر
التربيعي تأكد من أنه يقع ضمن نطاق معين.
لدينا تخمين وهو 1. 1 و إعلان القيمة المطلقة هنا.
لا نحتاج في الواقع إلى تقديم الإعلان لأننا حددناه في
الأعلى ، لذا يمكنني التخلص منه.
تذكر الآن أنه يتعين علينا ذلك تحقق من المعلمات ، نريد أن نفعل التحقق
من صحة المعلمة.
إذا كانت المعلمة أقل من
صفر ، نريد طباعة تعليق وإرجاع قيمة سالبة.
لذا إذا كانت س أقل من صفر ، اطبع خارج السعة السالبة إلى الجذر التربيعي
وإرجاع سالب واحد.
هنا حيث سنصل قيم إرجاع متعددة ، وسأوضح
لك كيف يمكنك العودة مرة واحدة ثم ضعه في الأسفل.
خلاف ذلك ، لدينا خوارزمية الجذر التربيعي.
لن أشرح الخوارزمية لأنها ليست ذات صلة
بما نتعلمه.
ولكن في الأساس ، للعثور على المربع جذر رقم ، نحصل على
قيمته المطلقة عن طريق الضرب ثم ناقص في x.
لذا فإن التخمين هو أننا سنخمن.
لذلك في الأصل سنخمن و ثم تحقق مما إذا كانت هذه هي
الخوارزمية ، تحقق مما إذا كانت ضمن نطاق معين.
وإذا كان الأمر كذلك ، فإننا نذهب لتعيين تخميننا لشيء ما وقسمته على
اثنين وهذا يحدث ليكون التخمين أننا نعود.
لذلك في القاع ، نحن سيقول تخمين العودة.
ولذا فإننا نستخدم دالة القيمة المطلقة.
يتم تعريفه أدناه لنا ، ولكن لدينا إعلاننا في الأعلى
، لذلك هذا جيد.
شيء واحد هنا هو أننا نملك عبارات عودة متعددة.
هذا قانوني تمامًا ، لكن يجب أن يكون كذلك يمكن تجنبه لأنه
من الصعب معرفة ما يحدث.
لذا ما سأفعله هنا هو أنني سأفعل من المحتمل أن تخزن هذا السالب في متغير آخر
غير guess ، لكن دعنا نرى هنا كيف يمكننا القيام بذلك.
لذا ما سأفعله هو التخمين تمت تهيئة إلى 1. 0 ، ونعيد واحدًا
سالب.
من المحتمل أن أقوم بإنشاء أخرى متغير يسمى قيمة عائمة العائد.
يمكننا ضبط هذا على 0. 0.
ثم قبل إعادته هنا لأن هذا
هو القفز من وظيفة الرياضيات ، يمكنني فقط قل قيمة الإرجاع
تساوي سالب 1. 0 بدلاً من الحصول على العائد.
ثم يمكنني التحقق ويمكنني القول إذا كانت القيمة المعادة لا
تساوي 1 سالب. 0 لأنني لا أفعل تريد تنفيذ
هذا إذا كان لدي بالفعل رقمي غير صالح ، رقم غير صالح ، ويمكنني تغليف هذا في عبارة
if.
وبعد ذلك داخل بيان while ، أستطيع أن أقول أن القيمة المعادة تساوي التخمين.
بهذه الطريقة سأعيد الصحيح الشيء إذا كان إدخالًا صالحًا.
وبعد ذلك بدلاً من العودة خمن ما أفعله هو إرجاع
القيمة المرتجعة.
وهذا الرمز أنظف قليلاً لأنه لا يعود
إلا مرة واحدة في الأسفل ويسهل متابعته.
لذا فإن القيمة المعادة إما سالبة واحد إذا كانت حجة غير صالحة أو ستكون
المربع الفعلي الجذر إذا لم تكن حجة غير صالحة.
ويمكننا أيضًا أن نجعلها هذا بسيط من خلال عدم التحقق من
القيمة المرتجعة في الواقع ربما يكون من
الأسهل هنا قول شيء آخر وجعل جزء آخر من الأصل إذا.
لذلك إذا كان عددًا موجبًا ستجعلها أنظف بهذه الطريقة
ليس لديك عبارة if.
الآن نحن بحاجة إلى اختباره.
لنبدأ ونختبر هذا.
سنقوم فقط باستدعاء تعمل مجموعة من المرات.
سنقول اختبار الجذر التربيعي.
لن أفعل أي شيء طباعة فاخرة هنا.
سوف أتأكد فقط من أنني يمكن أن تضيف مجموعة من خطوط التغذية
بحيث يسهل قراءتها.
اضغط على زر الإدراج هناك.
حسنا. لذا الآن سأقوم بمجموعة من printfs حيث
سأرسل بعض البيانات الجيدة و val وبعض بيانات inval وسأقوم بتنسيقها بنفس الطريقة.
دعنا نقول فقط المكالمة الأولى سيكون الجذر التربيعي لما هي بعض الجذور التربيعية الصالحة
الصالحة.
حسنًا ، سنتحقق أولاً برقم سالب.
إذن سنقول فقط سالب 3 يجب أن يطبع خطأ.
خلاف ذلك ، سنختبرها مع بعض الأرقام الصحيحة.
إذن سنقول الجذر التربيعي لـ 16 وسنقوم فقط بتمرير عدد صحيح ، وسيتم تحويلهم ، وقد
أتلقى بعض التحذيرات.
حسنًا ، لا أريد الحصول على أي منها تحذيرات ، وسنفعل 165.
الآن دعونا نجري هذا ونختبره.
دعونا نأمل أن يتم تجميعها.
لدي خطأ إملائي مع تعويم.
الآن عندما أديرها ، آمل ، سنحصل على ناتج الجذر التربيعي الجيد.
إذن لدينا هنا سالب واحد.
وقد طبعنا السالب عشرات الحجة ، لذلك هذا جيد.
ثم الآخرون ، أنا نعتقد ، الجذور التربيعية الصحيحة.
لذلك يبدو مثل تعمل الوظيفة بشكل جيد.
فعلنا الجذر التربيعي للعدد 16 وهو 4 ، 25 وهو 5 ، 9 وهو
3 ، 165 هو 12. 85.
لذلك قمت ببعض الحسابات الخاطئة هناك.
كنت أحاول التفكير في 15 ضرب 15 ما يساوي 225.
لذا إذا وضعت 225 هنا ، فسيكون كذلك تعود إلى 15 كجذر تربيعي.
سأقدم هذا الكود المصدري حتى تتمكن
من تحليلها ، ولكن فهم إعلانات الوظائف ، فهم كيفية
تحديد دالة بنوع الإرجاع و المعلمات تمر البيانات
، فهم المتغيرات المحلية ، فهم كيف للعودة مرة واحدة فقط في الأسفل.
الخوارزمية نفسها ليس بهذه الأهمية.
آمل أن يكون هذا قد ساعد. شكرًا لك.