البرنامج التعليمي للغة C++
تبدأ الأقسام الأولى من دليل تعليمي سوف نتناول المواد الأساسية المقدمة بالفعل في الوحدتين الأخيرتين، كما توفر مزيدًا من المعلومات حول المفاهيم المتقدمة. إنّ سنركز في هذه الوحدة على الذاكرة الديناميكية، والمزيد من التفاصيل حول الكائنات والفئات. كما يتم تقديم بعض الموضوعات المتقدمة، مثل التوريث، وتعدد الأشكال، والقوالب، الاستثناءات ومساحات الاسم. وسندرسها لاحقًا في دورة C++ المتقدمة.
تصميم مرتكز على العناصر
هذا ممتاز البرنامج التعليمي حول التصميم الموجه الكائنات. سنطبق المقدمة هنا في مشروع هذه الوحدة.
التعلُّم بالمثال الثالث
ينصب تركيزنا في هذه الوحدة على اكتساب المزيد من التدريب باستخدام المؤشرات، التصميم، والصفائف متعددة الأبعاد، والفئات/الكائنات. عليك العمل على ما يلي: الأمثلة. لا يمكننا التأكيد بما فيه الكفاية على أن السبيل إلى أن تصبح مبرمجًا جيدًا هي الممارسة ثم التمرّن ثم التمرّن!التمرين الأول: مزيد من التدريب باستخدام المؤشرات
إذا كنت بحاجة إلى مزيد من التدريب باستخدام المؤشرات، يُرجى الاطّلاع على هذا الذي يغطي جميع جوانب المؤشرات ويقدّم العديد من أمثلة البرامج.
ما هو مُخرج البرنامج التالي؟ يُرجى عدم تشغيل البرنامج أرسم صورة الذاكرة لتحديد الناتج.
void Unknown(int *p, int num); void HardToFollow(int *p, int q, int *num); void Unknown(int *p, int num) { int *q; q = # *p = *q + 2; num = 7; } void HardToFollow(int *p, int q, int *num) { *p = q + *num; *num = q; num = p; p = &q; Unknown(num, *p); } main() { int *q; int trouble[3]; trouble[0] = 1; q = &trouble[1]; *q = 2; trouble[2] = 3; HardToFollow(q, trouble[0], &trouble[2]); Unknown(&trouble[0], *q); cout << *q << " " << trouble[0] << " " << trouble[2]; }
بعد تحديد الناتج يدويًا، شغِّل البرنامج لمعرفة ما إذا صحيح.
التمرين رقم 2: مزيد من التدريب على الفصول الدراسية والعناصر
إذا كنت بحاجة إلى تدريب إضافي باستخدام الفئات والكائنات، هنا هو مورد يمر عبر فئتين صغيرتين. الحصول على بعض لإجراء التمارين.
التمرين رقم 3: المصفوفات متعددة الأبعاد
ننصحك باستخدام البرنامج التالي:
.
const int kStudents = 25; const int kProblemSets = 10; // This function returns the highest grade in the Problem Set array. int get_high_grade(int *a, int cols, int row, int col) { int i, j; int highgrade = *a; for (i = 0; i < row; i++) for (j = 0; j < col; j++) if (*(a + i * cols + j) > highgrade) // How does this line work? highgrade = *(a + i*cols + j); return highgrade; } int main() { int grades[kStudents][kProblemSets] = { {75, 70, 85, 72, 84}, {85, 92, 93, 96, 86}, {95, 90, 83, 76, 97}, {65, 62, 73, 84, 73} }; int std_num = 4; int ps_num = 5; int highest; highest = get_high_grade((int *)grades, kProblemSets, std_num, ps_num); cout << "The highest problem set score in the class is " << highest << endl; return 0; }
يوجد سطر في هذا البرنامج مكتوب عليه "كيف يعمل هذا الخط؟" - هل يمكنك فهم ذلك؟ يمكنك الاطّلاع هنا على توضيحنا.
كتابة برنامج يعمل على إعداد مصفوفة ثلاثية الأبعاد ويملأ البُعد الثالث مع مجموع الفهارس الثلاثة جميعها. إليك الحلّ الذي نقدّمه.
التمرين رقم 4: مثال على تصميم OO الشامل
وفيما يلي ملخص مثالاً على التصميم الموجه للكائنات، والذي يمر عبر العملية من البداية إلى النهاية. تمت كتابة الكود النهائي بلغة Java لكنّك ستتمكن من قراءتها بنظرك إلى مدى قادمة.
يُرجى تخصيص بعض الوقت لدراسة هذا المثال بالكامل. إنّه وتوضيح العملية وأدوات التصميم التي تدعمها.
اختبار الوحدة
مقدمة
يعد الاختبار جزءًا مهمًا من عملية هندسة البرامج. اختبار الوحدة هو نوع معين من الاختبارات، يفحص وظائف اختبار واحد صغير وحدة رمز المصدر.يتم دائمًا اختبار الوحدة بواسطة المهندس، عادةً ما تتم في نفس الوقت الذي يقومون فيه بترميز الوحدة. سائقي الاختبار الذين المستخدمة لاختبار فئتي المؤلف وقاعدة البيانات هي أمثلة على اختبارات الوحدة.
تتمتع اختبارات الوحدة بالخصائص التالية. إنّها...
- اختبار مكوِّن بمعزل
- تكون حاسمة
- يتم تعيينها عادةً بفئة واحدة
- تجنب التبعيات على الموارد الخارجية، مثل قواعد بيانات، ملفات، شبكة
- التنفيذ بسرعة
- يمكن تنفيذها بأي ترتيب
هناك أطر ومنهجيات آلية توفر الدعم الاتساق في اختبار الوحدات في مؤسسات هندسة البرامج الكبيرة. هناك بعض أطر عمل اختبار الوحدات مفتوحة المصدر المتطورة، والتي سنتعلمه لاحقًا في هذا الدرس.
في ما يلي توضيح للاختبارات التي يتم إجراؤها كجزء من اختبار الوحدات.

في إطار مثالي، نختبر ما يلي:
- يتم اختبار واجهة الوحدة للتأكّد من تدفّق المعلومات إلى داخلها وخارجها. بشكل صحيح.
- يتم فحص هياكل البيانات المحلية للتأكد من أنها تخزن البيانات بشكل صحيح.
- يتم اختبار شروط الحدود للتأكد من عمل الوحدة بشكل صحيح على الحدود التي تحدّ من المعالجة أو تحدّ من إمكانية معالجتها
- نختبر المسارات المستقلة من خلال الوحدة للتأكد من أن كل مسار،
وبالتالي يتم تنفيذ كل عبارة في الوحدة مرة واحدة على الأقل.
- أخيرًا، علينا التحقّق من التعامل مع الأخطاء بشكل صحيح.
نسبة استخدام رموز الصفحة
في الواقع، لا يمكننا الوصول إلى "تغطية الرمز البرمجي" كاملة باستخدام الاختبارات. تغطية التعليمة البرمجية هي طريقة تحليل تحدد أجزاء البرنامج جميع الأنظمة الأساسية (التغطية) من خلال مجموعة حالة الاختبار والأجزاء لم يتم تنفيذه. إذا حاولنا تحقيق تغطية بنسبة 100%، سنقضي وقتًا أطول كتابة وحدة الاختبار أكثر من كتابة التعليمة البرمجية الفعلية! ننصحك بالتوصل إلى وحدة لجميع المسارات المستقلة لما يلي. يمكن أن يصبح هذا بسرعة حسابية دالة أسّية.

في هذا الرسم التخطيطي، لا يتم اختبار الخطوط الحمراء، بينما لا يتم اختبار الخطوط غير الملونة اختباره.
وبدلاً من محاولة إجراء تغطية كاملة، نركّز على إجراء اختبارات تعزّز ثقتنا. أن الوحدة تعمل بشكل صحيح. نختبر أمورًا مثل:
- الحالات الفارغة
- اختبارات النطاق، مثل اختبارات القيم الموجبة أو السالبة
- الحالات الحدّية
- حالات الإخفاق
- اختبار المسارات التي يُرجّح أن يتم تنفيذها في معظم الوقت
أُطر عمل اختبار الوحدة
تستخدم معظم أطر اختبار الوحدات التأكيدات لاختبار القيم أثناء تنفيذ مسار. التأكيدات هي عبارات تتحقق مما إذا كان الشرط صحيحًا. تشير رسالة الأشكال البيانية نتيجة لتأكيد ما يمكن أن تكون ناجحة، أو فشلاً غير فادح ، أو فشلاً فادحًا. بعد على أي تأكيد، يستمر البرنامج بشكل طبيعي إذا كانت النتيجة نجاحًا أو فشلاً غير فادح. فإذا حدث فشل فادح، فإن الدالة الحالية يتم إلغاء هذا الإجراء.
تتألف الاختبارات من رمز يُعِدّ الحالة أو يتلاعب بالوحدة، إلى جانب مع عدد من التأكيدات التي تتحقق من النتائج المتوقعة. إذا كانت جميع التأكيدات في الاختبار ناجحًا، بمعنى أنه يكون صحيحًا، ثم نجح الاختبار؛ أو فإنها تفشل.
تحتوي الحالة الاختبارية على اختبار واحد أو أكثر. نقوم بتجميع الاختبارات في حالات الاختبار التي تعكس بنية التعليمة البرمجية التي تم اختبارها. في هذه الدورة، سنستخدم تمثل وحدة التكلفة لكل نقطة كإطار عمل لاختبار الوحدات. باستخدام إطار العمل هذا، يمكننا كتابة اختبارات الوحدات في لغة C++ وتشغيلها تلقائيًا، مع تقديم تقرير حول النجاح أو الإخفاق من الاختبارات.
تثبيت وحدة التكلفة لكل نقطة
نزِّل رمز CPPUnit من SourceForge. ابحث عن الدليل المناسب وضع ملف tar.gz فيه. ثم أدخل اتباع الأوامر (في Linux أو Unix)، واستبدال ملف cppunit المناسب الاسم:
gunzip filename.tar.gz tar -xvf filename.tar
إذا كنت تستخدم نظام التشغيل Windows، فقد تحتاج إلى البحث عن أداة لاستخراج tar.gz الملفات. الخطوة التالية هي تجميع المكتبات. يمكنك التغيير إلى دليل تكلفة النقرة (cppunit). هناك ملف INSTALL يقدّم تعليمات محددة. عادةً، عليك تشغيله:
./configure make install
إذا واجهت مشاكل، راجِع ملف INSTALL. عادةً ما يتم إنشاء في دليل cppunit/src/cppunit. للتحقق من نجاح التجميع، انتقل إلى الدليل cppunit/examples/simple واكتب "make". في حال حذف يتم تجميع كل شيء بشكل جيد، فأنت على استعداد.
يتوفر برنامج تعليمي ممتاز هنا. يُرجى الاطّلاع على هذا البرنامج التعليمي وإنشاء فئة الأعداد المركّبة، وفئة الأرقام المرتبطة بها لاختبارات الوحدة. هناك عدة أمثلة إضافية في دليل cppunit/examples.
لماذا يجب أن أفعل ذلك؟؟
يُعدّ اختبار الوحدة مهمًا للغاية في المجال لعدة أسباب. انتهى على دراية بالفعل لسبب واحد: وهو: نحتاج إلى طريقة ما للتحقق من عملنا وتطوير الرمز البرمجي. وحتى عندما نطور برنامجًا صغيرًا جدًا، فإننا نفكر بشكل فطري كتابة نوع من المدقق أو السائق للتأكد من أن برنامجنا يقوم بما هو متوقع.
من الخبرة الطويلة، يعرف المهندسون أن فرص نجاح البرنامج في المحاولة الأولى صغيرة للغاية. تعتمد اختبارات الوحدات على هذه الفكرة من خلال إجراء الاختبار برامج الفحص الذاتي والتكرار. تحل الادعاءات بدلاً من فحص الإخراج. ونظرًا لسهولة تفسير النتائج (أداة اختبار إما بنجاح أو فشل)، يمكن إجراء الاختبارات مرارًا وتكرارًا، مما يوفر شبكة أمان تجعل التعليمة البرمجية أكثر مرونة للتغيير.
دعنا نضع هذا بعبارات ملموسة: عندما ترسل التعليمة البرمجية النهائية لأول مرة إلى CVS، فهي تعمل بشكل مثالي. ويستمر في العمل بشكل مثالي لبعض الوقت. بَعْدَ ذَلِكْ يومًا ما، سيغير شخص آخر رمزك سوف ينكسر شخص ما قريبًا أو لاحقًا التعليمة البرمجية. هل تعتقد أنّهم سيلاحظون ذلك من تلقاء أنفسهم؟ لا أعتقد ذلك. ولكن عندما وكتابة اختبارات الوحدة، فهناك أنظمة يمكنها تشغيلها تلقائيًا كل يوم. ويُطلق على هذه الأنظمة التكامل المستمر. لذلك عندما يحتاج هذا المهندس يقوم X بخرق الرمز، وسيرسل النظام رسائل إلكترونية سيئة إليه إلى أن يتم حل المشكلة. بها. حتى لو كان المهندس X هو أنت!
بالإضافة إلى مساعدتك في تطوير البرامج والحفاظ على أمانها في مواجهة التغيير، اختبار الوحدة:
- إنشاء مواصفات قابلة للتنفيذ ووثائق تظل متزامنة مع التعليمات البرمجية. أو بعبارةٍ أخرى، يمكنك أن تقرأ اختبار الوحدة للتعرف على السلوك الذي تدعمه الوحدة.
- تساعدك في فصل المتطلبات عن عملية التنفيذ. نظرًا لأنك تؤكد على سلوكًا مرئيًا خارجيًا، تُتاح لك الفرصة للتفكير فيه بشكل صريح بدلاً من خلط الأفكار حول كيفية تنفيذ السلوك.
- إتاحة التجربة إذا كانت لديك شبكة أمان لتنبيهك بالوقت وقمت بكسر سلوك الوحدة، فأكثر عرضة لتجربة أشياء وإعادة تهيئة تصميماتك.
- تحسين تصميماتك. غالبًا ما تتطلب منك كتابة اختبارات الوحدة الشاملة ما يلي: لجعل التعليمة البرمجية أكثر قابلية للاختبار. غالبًا ما تكون التعليمة البرمجية القابلة للاختبار أكثر وحدات من الرمز غير القابل للاختبار الرمز.
- الحفاظ على الجودة العالية: يمكن أن يتسبب خطأ صغير في نظام مهم في جعل الشركة أن تخسر ملايين الدولارات، أو الأسوأ من ذلك، سعادة المستخدم أو ثقته. تشير رسالة الأشكال البيانية شبكة الأمان التي توفرها اختبارات الوحدة هذا الاحتمال. من خلال اكتشاف الأخطاء مبكرًا، كما أنها تمكن فرق ضمان الجودة من قضاء الوقت في عمليات سيناريوهات الفشل، بدلاً من الإبلاغ عن الإخفاقات الواضحة.
خصِّص بعض الوقت لكتابة اختبارات الوحدة باستخدام CPPUnit لتطبيق قاعدة بيانات Composer. يُرجى الرجوع إلى الدليل cppunit/examples/ للحصول على المساعدة.
How Google works (طريقة عمل Google)
مقدمةتخيل أن هناك راهبًا في العصور الوسطى ينظر إلى آلاف المخطوطات في أرشيفات ديره."أَيْنَ تِلْكَ الْأُغْنِيَة بِصَوْت أرسطو..."
ولحسن حظه، أن المخطوطات يتم ترتيبها حسب المحتوى ونقشها مع رموز خاصة لتسهيل استرجاع المعلومات الموجودة في لكل منها. وبدون مثل هذا التنظيم، سيكون من الصعب جدًا العثور على مخطوطة.
نشاط تخزين المعلومات المكتوبة واستردادها من المجموعات الكبيرة يُسمى استرجاع المعلومات (IR). أصبح هذا النشاط أكثر فأكثر مهمة على مر العصور، خاصةً مع اختراعات مثل الورق والضغط عليه. كان هذا المكان مشغولاً بعدد قليل فقط من الأشخاص. دِلْوَقْتِي، ومع ذلك، يشارك مئات الملايين من الأشخاص في استرجاع المعلومات كل يومهم عندما يستخدمون محرك بحث أو يبحثون في سطح المكتب.
بدء استرداد المعلومات
على مدار 30 عامًا، ألفت الدكتورة "سوس" 46 كتابًا للأطفال. كانت كُتبه تُقال من القطط والأبقار والأفيال، ومن هم الأشخاص، والقبضات واللوراكس. هل تتذكر؟ في أي قصة كانت هذه الكائنات؟ ما لم تكن أحد الوالدين، يمكن للأطفال فقط تخبرك أي مجموعة من قصص دكتور سوس تضم الكائنات:
(COW وBEE) أو CROWS
سنطبق بعض نماذج استرجاع المعلومات الكلاسيكية لمساعدتنا في حل هذه المشكلة المشكلة.
هناك نهج واضح وهو القوة الغاشمة: احصل على جميع قصص دكتور سوس الـ 46 وابدأ السابقة. لاحظ أي كتاب يحتوي على الكلمتين COW وBEE، لكل كتاب، في الوقت نفسه، ابحث عن الكتب التي تحتوي على الكلمة CROWS. تمثل أجهزة الكمبيوتر أهمية كبيرة أسرع في ذلك من نحن. إذا كان لدينا كل النصوص من كتب الدكتور سوس في شكل رقمي، على سبيل المثال كملفات نصية، يمكننا استخراج الملفات من بينها. بالنسبة إلى صغيرة مثل كتب الدكتور سوس، فإن هذه التقنية تعمل بشكل جيد.
ومع ذلك، هناك العديد من الحالات التي نحتاج فيها إلى مزيد من الإجراءات. على سبيل المثال، المجموعة جميع البيانات الموجودة على الإنترنت حاليًا كبيرة جدًّا لدرجة أن grep لا يمكنه التعامل معها. نحن أيضًا لا فقط إذا كنا نريد المستندات التي تطابق شرطنا، فقد اعتدنا على وتصنيفها وفقًا لمدى صلتها بالموضوع.
وهناك طريقة أخرى إلى جانب grep، وهي إنشاء فهرس للمستندات في مجموعة قبل إجراء البحث. يشبه الفهرس في الأشعة تحت الحمراء الفهرس في الجزء الخلفي من الكتاب المدرسي. نُنشئ قائمة بجميع الكلمات (أو العبارات) في كل قصة الدكتور سوس، مع استبعاد كلمات مثل "ال" و"و" وغيرها من الروابط، وحروف الجر وما إلى ذلك (تُسمى كلمات الإيقاف). ثم نمثل هذه المعلومات بطريقة تسهل العثور على المصطلحات وتحديد القصص التي يواجهونها.
أحد التمثيل المحتمل هو مصفوفة تحتوي على القصص في الجزء العلوي، المصطلحات المدرجة في كل صف. يشير الرقم "1" في عمود إلى أن العبارة تظهر في قصة هذا العمود.
يمكننا عرض كل صف أو عمود كمتجه بت. يشير متجه البت للصف التي يظهر فيها المصطلح في المقالات الإخبارية. يشير متجه البت في العمود إلى المصطلحات في القصة.
بالعودة إلى مشكلتنا الأصلية:
(COW وBEE) أو CROWS
نأخذ متجهات البت لهذه المصطلحات ونجري أولاً بعض الشيء، ثم استخدام OR على النتيجة من منظور البت.
(100001 و010011) أو 000010 = 000011
والإجابة عن هذا السؤال: "السيد براون كان مو! هل يمكنك ذلك؟" وThe Lorax. هذا رسم توضيحي نموذج الاسترداد المنطقي، وهو نموذج "المطابقة التامة".
افترض أننا كنا سنوسع المصفوفة لتشمل جميع قصص دكتور سوس وجميع المصطلحات ذات الصلة في القصص. ستنمو المصفوفة بشكل كبير، ومن المهم الملاحظة هو أن معظم الإدخالات ستكون 0. ربما لا تكون المصفوفة هي الأفضل تمثيلاً للفهرس. نحتاج إلى إيجاد طريقة لتخزين بيانات 1 فقط.
بعض التحسينات
وتُسمى البنية المستخدمة في الأشعة تحت الحمراء لحل هذه المشكلة الفهرس المقلوب. فنحن نحتفظ بقاموس للعبارات، ثم نضع قائمة لكل مصطلح. يسجّل المستندات التي تظهر فيها المصطلح. تُسمّى هذه القائمة مشاركات. جديدة. تعمل القائمة المرتبطة بشكل فردي لتمثيل هذه البنية كما هو موضح أدناه.
إذا لم تكن على دراية بالقوائم المرتبطة، ما عليك سوى إجراء بحث على Google على "
في لغة C++"، وستجد العديد من الموارد التي تصف كيفية إنشاء واحد،
وكيفية استخدامها. وسنتناول ذلك بمزيد من التفصيل في وحدة لاحقة.
يُرجى العلم أنّنا نستخدم معرِّفات المستندات (DocIDs) بدلاً من اسم قصة. نفرز أيضًا معرّفات DocID هذه لأنّها تسهّل معالجة طلبات البحث.
كيف نعالج استعلامًا؟ بالنسبة للمشكلة الأصلية، نجد أولاً منشورات COW ثم قائمة منشورات BEE. ثم "ندمج" هذه البيانات معًا:
- الاحتفاظ بالعلامات في كلتا القائمتين والاطّلاع على قائمتَي المنشورات في الوقت نفسه.
- في كل خطوة، قارن مستند DocID المشار إليه بكلا المؤشرين.
- إذا كانا متطابقين، ضَع معرّف DocID هذا في قائمة النتائج، وإلا قدِّم مؤشر الماوس. للإشارة إلى معرِّف docID الأصغر حجمًا.
إليك كيفية إنشاء فهرس مقلوب:
- يمكنك تعيين مستند DocID لكل مستند مهم.
- بالنسبة إلى كل مستند، حدد المصطلحات ذات الصلة به (رمز مميز).
- لكل مصطلح، أنشئ سجلاً يتكون من المصطلح، ومعرّف المستند (DocID)، حيث والتكرار في ذلك المستند. لاحظ أنه يمكن أن يكون هناك العديد سجلات مصطلح معين إذا ظهر في أكثر من مستند واحد.
- ترتيب السجلات حسب المصطلح.
- قم بإنشاء القاموس وقائمة المنشورات بمعالجة سجلات فردية المصطلح، وأيضًا دمج السجلات المتعددة للمصطلحات التي تظهر في أكثر من مستند واحد أنشئ قائمة مرتبطة من معرّفات DocID (بترتيب). على كل المصطلح أيضًا معدل تكرار، وهو مجموع الترددات عبر جميع السجلات لعبارة البحث.
المشروع
ابحث عن مستندات طويلة بنص عادي يمكنك تجربتها. تشير رسالة الأشكال البيانية إنشاء فهرس مقلوب من المستندات، باستخدام الخوارزميات الموضحة أعلاه. ستحتاج أيضًا إلى إنشاء واجهة لإدخال الاستعلامات ومحركًا لمعالجتها يمكنك العثور على شريك مشروع في المنتدى.
فيما يلي عملية محتملة لإكمال هذا المشروع:
- أول شيء يجب القيام به هو تحديد استراتيجية لتعريف المصطلحات في الوثائق. قم بعمل قائمة بجميع كلمات الإيقاف التي يمكنك التفكير فيها، واكتب دالة يقرأ الكلمات في الملفات، ويحفظ البنود، ويزيل كلمات الإيقاف. قد تضطر إلى إضافة المزيد من كلمات الإيقاف إلى قائمتك أثناء مراجعة قائمة المصطلحات من التكرار.
- اكتب حالات اختبار CPPUnit لاختبار دالتك، وملف makefile لجلب كل شيء معًا لتصميمك. تحقق من ملفاتك في CVS، خاصةً إذا كنت والعمل مع الشركاء. قد ترغب في البحث عن كيفية فتح مثيل CVS للمهندسين عن بُعد.
- إضافة معالجة لتضمين بيانات الموقع، أي الملف ومكان المعالجة أو تحديد موقع الملف؟ قد ترغب في معرفة عملية حسابية لتحديد رقم الصفحة أو رقم الفقرة.
- اكتب حالات اختبار وحدة القياس CPP لكي تتمكّن من اختبار هذه الوظيفة الإضافية.
- قم بإنشاء فهرس مقلوب وتخزين بيانات الموقع في سجل كل مصطلح.
- اكتب المزيد من حالات الاختبار.
- تصميم واجهة للسماح للمستخدم بإدخال استعلام.
- باستخدام خوارزمية البحث الموضحة أعلاه، يمكنك معالجة الفهرس المقلوب إرجاع بيانات الموقع للمستخدم.
- تأكد من تضمين حالات الاختبار لهذا الجزء الأخير أيضًا.
كما فعلنا في جميع المشروعات، استخدم المنتدى والدردشة للعثور على شركاء المشروع ولمشاركة الأفكار.
ميزة إضافية
يُطلق على خطوة المعالجة الشائعة في العديد من أنظمة الأشعة تحت الحمراء اسم الاستنباط. تشير رسالة الأشكال البيانية الفكرة الرئيسية وراء الاشتقاق هي أن المستخدمين يبحثون عن معلومات حول "استرداد" سيكون مهتمًا أيضًا بالمستندات التي تحتوي على معلومات تحتوي على كلمة "استرداد"، "تم الاسترجاع" و"تم استرداده" وما إلى ذلك يمكن أن تكون الأنظمة عرضة للأخطاء بسبب إلى جذور سيئة، لذلك هذا صعب بعض الشيء. على سبيل المثال، قد يرغب المستخدم المهتم في "استرجاع المعلومات" قد تحصل على مستند بعنوان "معلومات عن جولدن كلاب الاسترجاع" بسبب اشتقاق جذوعها. تعد الخوارزمية المفيدة للاشتقاق خوارزمية Porter: