الانتقال إلى المحتوى

تمثيل البيانات

A-Level علوم الحاسوب · الموضوع 13

درس فيديو لهذا الموضوع افتح صفحة الفيديو
15:16

أنواع البيانات المحددة من قبل المستخدم

سيخزن حقل النص العادي أي بيانات بلا رادع. اطلب نوع مركبة، وكتب شخص ما "موز" — سيقبل البرنامج ذلك دون اعتراض. ولكن إذا كنت…

سرد باللغة الإنجليزية · ترجمة مدمجة بالإنجليزية + الصينية

13.1

أنواع البيانات المعرفة من قبل المستخدم

المنهج
يجب أن يكون المرشحون قادرين على: ملاحظات وإرشادات
أظهر فهمًا لسبب ضرورة الأنواع المعرفة من قبل المستخدم
عرّف واستخدم الأنواع غير المركبة بما في ذلك: المعدودة (Enumerated)، المؤشر (Pointer)
عرّف واستخدم أنواع البيانات المركبة بما في ذلك: المجموعة (Set)، السجل (Record) والكائن/الفئة (Class/Object)
اختر وتصمم نوع بيانات معرف من قبل المستخدم مناسب لمشكلة معطاة

المصدر: منهج كامبريدج الدولي

الأنواع المدمجة (INTEGER، REAL، STRING، CHAR، BOOLEAN) تغطي أبسط الحالات. للمشاكل الأكثر تعقيدًا يمكنك تعريف أنواع بيانات معرفة من قبل المستخدم، مما يجعل الكود أوضح والمترجم أكثر صرامة.

لماذا هي مطلوبة

النوع المدمج STRING يسمح لك بتخزين قيم غير منطقية في حقل يجب أن يحتوي على أحد قيم قانونية محدودة؛ بينما النوع المعرف من قبل المستخدم يمكنه تقييده. الكيانات الحقيقية تكون عادةً مجموعة من القيم بأنواع مختلفة. وDECLARE Taxi : Vehicle أكثر وضوحًا (توثيق ذاتي) من DECLARE Taxi : STRING.

"وصف الغرض من نوع البيانات المعرف من قبل المستخدم (علامتان).** نوع بيانات عرّفه المبرمج، مُبنى من أنواع موجودة (مدمجة)، بحيث يمكن تمثيل بيانات خاصة بالمسألة عندما لا يتوفر نوع مدمج مناسب. كلا الجزأين يمنحان العلامة: عرّفه المبرمج ومبني على أنواع موجودة. يقبل المصحح أيضًا عبارة "لتسهيل قراءة البرنامج وصيانته" كنقطة داعمة، ولكن ليس بمفردها.

"اشرح ما يُقصد بالأنواع غير المركبة والأنواع المركبة" (أربع درجات). النوع غير المركب يُعرّف بدون الإشارة إلى نوع آخر: فهو يحتوي على قيمة واحدة، مثل عدد صحيح، أو عدد حقيقي، أو قيمة مُعدَّدة. والنوع المركب هو مجموعة من الأنواع الأخرى (والتي قد تكون هي بدورها مركبة): وهو يحتوي على عدة قيم تحت مُعرف واحد، مثل سجل، أو مجموعة، أو مصفوفة، أو فئة. اذكر مثالاً مع كل تعريف؛ فالامتحان يطلب مثالاً واحداً فقط.

الأنواع غير المركبة

النوع المُعدَّد

النوع المُعدَّد له قيم تمثل قائمة ثابتة من الثوابت المسماة:

TYPE Vehicle = (M100, M230, T101, T102, T120, T150)
DECLARE MyTaxi : Vehicle
MyTaxi ← T102

الأسماء هي قيم من النوع الجديد (مخزنة داخلياً كأعداد صحيحة صغيرة)؛ ولا يمكن تعيين أي شيء خارج القائمة. الاستخدامات: أيام الأسبوع، الألوان، رموز الحالة.

"اذكر ما يُقصد بالنوع البياناتي المُعدَّد." نوع غير مركب عرّفه المستخدم بإدراج جميع قيم الممكنة (بالترتيب). وبما أن القيم مرتبطة، فيمكن مقارنتها والانتقال بينها: باستخدام TYPE Month = (January, February, ..., December)، فإن الاختبار IF ThisMonth > June合法 (صحيح)، وتُخزّن القيم داخلياً كأعداد صحيحة. يتكون الكود الوهمي من ثلاثة أجزاء ويطلب الامتحان درجة لكل منها: الكلمة المفتاحية TYPE، والمُعرف مع =، والقائمة داخل الأقواس مفصولة بفاصلة.

مثال محلل. اكتب كوداً وهمياً لتعريف نوع مُعدَّد لأيام فتح المدرسة (من الاثنين إلى الجمعة)، وأعلن متغيراً من ذلك النوع ضمه إلى الأربعاء.

TYPE SchoolDay = (Monday, Tuesday, Wednesday, Thursday, Friday)
DECLARE Today : SchoolDay
Today ← Wednesday

لا يمكن للمتغير من النوع المُعدَّد أن يُعطى قيمة خارج القائمة، وهذا هو جوهر الأمر: Today ← Saturday خطأ عند وقت الترجمة، بينما STRING كان سيقبل "Saturdy".

نوع مُعدَّد Vehicle بالقيم المسماة الثابتة M100, M230, T101, T102, T120 و T150؛ ومتغير من هذا النوع قد يحتوي على واحد منها فقط
النوع المُعدَّد هو قائمة ثابتة من القيم المسماة

النوع المؤشر

يحتوي المؤشر على العنوان الذاكرةي لمتغير آخر (أو NULL لـ "لا هدف"). تبني المؤشرات هياكل ديناميكية (قوائم مربوطة، أشجار) وتمرر إشارات دون نسخ.

TYPE PNode = ^TNode    // pointer to a TNode
DECLARE p : PNode
p ← NEW TNode
p^.Value ← 42          // dereference to reach the fields

إن فك الإحالة (p^) يعني الوصول إلى المتغير الذي يشير إليه.

"اذكر ما يُقصد بنوع بيانات المؤشر." نوع غير مركب قيمته هي العنوان الذاكرةي لـ (إشارة إلى) متغير من نوع معين. يعلن الكود الوهمي النوع برمز caret قبل النوع الذي يشير إليه، ويطلب الامتحان سطرًا واحدًا محددًا:

TYPE SelectParts = ^Parts        // a pointer to a value of type Parts
DECLARE Chosen : SelectParts
Chosen ← ^Keyboard               // Chosen now holds the address of Keyboard
OUTPUT Chosen^                   // dereference: the value stored at that address

المؤشرات هي مما تُبنى عليه القوائم المربوطة الديناميكية أو الشجرة الثنائية (الموضوع 19): كل عقدة تحتوي على مؤشر للتعقب. تُفقَد درجتان عادة هنا: كتابة نوع المؤشر وكأنه يحتوي على القيمة نفسها، ونسيان رمز caret عند قراءة المؤشر.

مؤشر p يحتوي على عنوان ويشير إلى TNode يحتوي على Value = 42 وحقل Next؛ f^ يفك الإحالة للوصول إلى حقول العقدة، مثل p^.Value
المؤشر يحتوي على عنوان؛ p^ يفك الإحالة للوصول إلى حقول العقدة

الأنواع المركبة

النوع المركب (واحد من الأنواع البياناتية المركبة) يجمع عدة قيم تحت اسم واحد.

مجموعة: تجميع غير مرتب حيث كل قيمة فريدة
المجموعة هي تجميع غير مرتب لقيم فريدة
سجل Student بحقول Name, Age, Grade و Enrolled، كل منها من نوع مختلف
السجل يجمع حقولاً من أنواع مختلفة تحت اسم واحد
  • سجل (الموضوع 10) — حقول من أنواع مختلفة في كتلة TYPE ... ENDTYPE.
  • مجموعة — تجميع غير مرتب لقيم فريدة، مع عمليات إضافة، وإزالة، واختبار الانتماء، واتحاد، وتقاطع:
DECLARE Available : SET OF Colour
Available ← {Red, Blue}
IF Green IN Available THEN
    ...
ENDIF
  • فئة / كائن — نوع الفئات المركب OOP، يدمج حقول البيانات (خصائص) مع العمليات عليها (طرق). الكائن هو حالة من حالة الفئة:
CLASS Taxi
    PRIVATE Capacity : INTEGER
    PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
        RETURN Capacity
    ENDFUNCTION
ENDCLASS

اختيار النوع

استخدم المُعدَّد لقيمة من قائمة ثابتة، والمؤشر للتوجيه غير المباشر، والسجل لمجموعة حقول، والمجموعة لتجميع فريد غير مرتب، والفئة عندما تحتاج إلى الحالة و السلوك معًا.

"صف نوع البيانات العادي المجموعة" (ثلاث درجات). نوع مركب يحتوي على تجميع من قيم من نفس النوع، بدون ترتيب معين وبدون تكرار؛ يمكن إضافة القيم وإزالتها، واختبار انتماء قيمة. أعلن النوع باستخدام SET OF، ثم عرّف ثابت مجموعة بقيمها بين أقواس:

TYPE EvenNumbers = SET OF INTEGER
DEFINE Evens (2, 4, 6, 8, 10, 12) : EvenNumbers
TYPE SymbolSet = SET OF CHAR
DEFINE Operators ('+', '-', '*', '/') : SymbolSet

"صف نوع البيانات العادي السجل" (ثلاث درجات). نوع مركب يتكون من عدد ثابت من الحقول (العناصر)، لكل منها مُعرف خاص ونوع خاص، يُشار إليها collectively بمُعرف واحد؛ يتم الوصول إلى الحقول باستخدام علامة النقطة.

مثال محلل. اكتب كوداً وهمياً لإعلان نوع سجل ClubMember لعضو في نادٍ: الاسم الأول، الاسم الأخير، رمز العضوية (عدد صحيح)، تاريخ الانضمام، وما إذا كانت الرسوم مدفوعة؛ ثم أعلن متغيراً وضمه لحقلين.

TYPE ClubMember
    DECLARE FirstName : STRING
    DECLARE LastName : STRING
    DECLARE Code : INTEGER
    DECLARE DateJoined : DATE
    DECLARE FeesPaid : BOOLEAN
ENDTYPE

DECLARE NewMember : ClubMember
NewMember.LastName ← "Chen"
NewMember.FeesPaid ← TRUE

كل حقل يحتاج إلى سطر DECLARE خاص به مع نوع مناسب، تنتهي الكتلة بـ ENDTYPE، ويُ accesses الحقل كـ variable.field. عند طلب اختيار نوع لكل حقل، طابقه مع البيانات: الرمز الذي يُقارن فقط هو STRING إذا كان يمكن أن يحتوي أحرفاً، وINTEGER إذا كان مطلوباً الحساب أو الترتيب؛ نعم/لا هو BOOLEAN؛ التاريخ هو DATE. الحقل الذي يمكن أن يأخذ أحد قيم معدودة few (مثل نوع حيوان أليف، لون) هو الذي يجب جعله نوعاً مُعدَّداً.

مصفوفة من أربع سجلات ClubMember مرسومة كصفوف من الحقول، مع إشارة Members[3].LastName تستخرج حقلاً واحداً لعنصر واحد، وعملية إسناد تكتب حقلاً واحداً لعنصر آخر
مصفوفة من السجلات: كل عنصر هو سجل كامل، والفهرس يختار العنصر، ونقطة تختار الحقل

سجلات في المصفوفات والملفات. الجدول الذي يحتوي على عدد كبير من الأعضاء هو DECLARE Members : ARRAY[1:100] OF ClubMember؛ ثم Members[3].LastName هو حقل واحد لعنصر واحد، ودورة تكرار عبر الفهرسة تعالج كل سجل. السجل هو أيضًا الوحدة الطبيعية التي تُكتب وتُقرأ من ملف (أسفل)، سجل واحد لكل PUTRECORD أو WRITEFILE.

مثال محلول. نوع مركب Pet يخزن اسم كل حيوان أليف (سلسلة نصية)، ونوعه (إحداهما: كلب، قطة، أرنب أو هامستر)، ووزنه بالكيلوجرام (عدد حقيقي). عرّف الأنواع وأعلن عن متغير.

TYPE Species = (Dog, Cat, Rabbit, Hamster)
TYPE Pet
    DECLARE Name : STRING
    DECLARE Kind : Species
    DECLARE Weight : REAL
ENDTYPE
DECLARE MyPet : Pet
MyPet.Kind ← Rabbit

يتم تعريف النوع المُعدَد أولاً، لأن السجل يستخدمه: الترتيب مهم في الكود الوصفي كما هو الحال في المترجم.

الفئات في الكود الوهمي. الفئة class هي النوع المركب الذي يحمل أيضاً السلوك. يطلب الامتحان الإعلان مع تحديد خصائصها PRIVATE، بنائياً (constructor) باسم NEW يقوم بتعيينها، وPUBLIC طرق للحصول عليها أو تغييرها:

CLASS Appointment
    PRIVATE PatientName : STRING
    PRIVATE Treatment : STRING
    PRIVATE Medication : STRING
    PUBLIC PROCEDURE NEW(Name : STRING, Treat : STRING, Med : STRING)
        PatientName ← Name
        Treatment ← Treat
        Medication ← Med
    ENDPROCEDURE
    PUBLIC FUNCTION GetTreatment() RETURNS STRING
        RETURN Treatment
    ENDFUNCTION
ENDCLASS

DECLARE Visit : Appointment
Visit ← NEW Appointment("A. Chen", "filling", "none")
OUTPUT Visit.GetTreatment()

الخصائص خاصة بحيث لا يمكن تغييرها إلا من خلال الطرق (التغليف، الموضوع 20)؛ المنشئ هو إجراء يُدعى NEW بمعامل واحد لكل خاصية؛ والـ getter هو دالة تُرجع الخاصية. كل واحدة من هذه تمثل علامة منفصلة.

استكشف

معمل مفاهيم البرمجة

صل الأمثلة بالفكرة البرمجية التي تمثلها.

مفردات تدريب
English العربية
user-defined type/ˈjuːzə dɪˈfaɪnd taɪp/ النوع المحدد من قبل المستخدم
field/fiːld/ حقل
record/ˈrekɔːd/ سجل
set/set/ مجموعة
class/klæs/ كلاس
composite type/ˈkɒmpəzɪt taɪp/ النوع المركب
enumerated type/ɪˈnjuːməreɪtɪd taɪp/ نوع معداد
pointer/ˈpɔɪntə/ مؤشر
linked list/lɪŋkt lɪst/ قائمة مرتبطة
dereference/ˌdiːˈrefrəns/ متابعة
object/ˈɒbdʒekt/ الجسم
attributes/ˈætrɪbjuːts/ صفات
methods/ˈmeθədz/ الطرق
constructor/kənˈstrʌktə/ الدالة الإنشائية
File organisation/faɪl ˌɔːɡənaɪˈzeɪʃn/ تنظيم الملفات
13.2

تنظيم الملفات والوصول إليها

المنهج
يجب أن يكون المرشحون قادرين على: ملاحظات وإرشادات
أظهر فهمًا لطرق تنظيم الملفات واختر طريقة مناسبة لتنظيم الملفات والوصول إلى الملف لمشكلة معطاة بما في ذلك: المتسلسل (Serial)، التسلسلي (Sequential) (باستخدام حقل المفتاح)، العشوائي (Random) (باستخدام مفتاح السجل)
أظهر فهمًا لطرق الوصول إلى الملفات بما في ذلك: الوصول التسلسلي للملفات المتسلسلة والتسلسلية. الوصول المباشر للملفات التسلسلية والعشوائية
أظهر فهمًا لـ خوارزميات التجزئة (Hashing algorithms) صف واستخدم خوارزميات تجزئة مختلفة لقراءة البيانات وكتابتها في ملف عشوائي/تسلسلي

المصدر: منهج كامبريدج الدولي

تنظيم الملف هو كيفية ترتيب البيانات؛ والوصول إلى الملف هو كيف يصل البرنامج إلى السجل.

  • ملف تسلسلي — سجلات بـالترتيب المضاف فيه، بدون فرز. الوصول تسلسلي فقط؛ الإضافة سريعة؛ البحث بطيء. يُستخدم للسجلات وسجلات التدقيق.
  • ملف متتابع — سجلات مرتبة حسب مفتاح. البحث أسرع (يمكنك التوقف مبكرًا أو استخدام البحث الثنائي)؛ الإدراج بطيء (يجب تحريك السجلات). يُستخدم للملفات الرئيسية التي يتم تحديثها دفعة واحدة.
  • ملف عشوائي (ملف الوصول المباشر) — سجلات عند مواقع محسوبة من المفتاح (غالبًا بواسطة دالة تجزئة). الوصول المباشر بالمفتاح سريع جدًا؛ القراءة بترتيب المفاهيم أصعب. يُستخدم لجداول الاستعلام الكبيرة وحسابات العملاء.
صف من صناديق السجلات من الأول إلى السادس بالترتيب الذي تمت إضافته، مع سهم إضافة وإشارة بداية الملف
ملف تسلسلي: تُحفظ السجلات بالترتيب الذي تمت إضافته به
صف من صناديق سجلات العملاء بقيم مفاتيح تصاعدية، يظهر السجلات المرتبة بترتيب المفاتيح
ملف متتابع: تُرتب السجلات حسب حقل مفتاح
مفتاح سجل يمر عبر دالة تجزئة لحساب رقم slot، مع وضع السجل في ذلك الـ slot من الملف
ملف عشوائي: تقبع السجلات عند مواقع محسوبة من المفتاح

الطريقتان للوصول هما الوصول التسلسلي (قراءة من البداية إلى النهاية) والوصول المباشر (القفز مباشرة إلى موقع معروف). طابق البنية مع العملية المهيمنة: استعلامات المفتاح الفردي تفضل العشوائية؛ التقارير بترتيب معين تفضل المتتابع.

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

سلسلتان من الخطوات: الوصول المباشر يجزئ المفتاح ليصل إلى عنوان، وينتقل مباشرة إليه ويقرأ أو يكتب السجل؛ الوصول التسلسلي يفتح الملف، ويقرأ السجلات واحدة تلو الأخرى من البداية المقارنت المفاتيح حتى يتم العثور على السجل أو الوصول إلى نهاية الملف *الطريقتان للوصول كإجراءات: الوصول المباشر يحسب أين يبحث؛ الوصول التسلسلي يبحث في كل مكان بالتناوب

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

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

التعامل مع الملفات في الكود الوصفي. يتوقع الام العبارات القياسية، ويضع Paper 3 خوارزميات تستخدمها:

المهمة العبارات
فتح ملف نصي OPENFILE "Scores.txt" FOR READ (أو FOR WRITE، الذي ينشئ أو يطوي، أو FOR APPEND)
قراءة أو كتابة سطر READFILE "Scores.txt", Line و WRITEFILE "Scores.txt", Line
اختبار نهاية الملف WHILE NOT EOF("Scores.txt")
إغلاق CLOSEFILE "Scores.txt"
فتح ملف عشوائي OPENFILE "Stock.dat" FOR RANDOM
الانتقال إلى موضع سجل SEEK "Stock.dat", Address
قراءة أو كتابة سجل كامل GETRECORD "Stock.dat", Item و PUTRECORD "Stock.dat", Item

مثال محلول. ملف عشوائي Stock.dat يحتوي على سجلات من نوع StockItem، مخزنة عند العنوان المعطى بواسطة ItemID MOD 100. اكتب كودًا وصفيًا يخزن عنصرًا جديدًا عند عنوانه المجزأ إذا كان هذا الموقع فارغًا، والإبلاغ عن الموقع إذا كان مستخدمًا بالفعل.

DECLARE Item, Existing : StockItem
DECLARE Address : INTEGER
INPUT Item.ItemID, Item.Description, Item.Quantity
Address ← Item.ItemID MOD 100
OPENFILE "Stock.dat" FOR RANDOM
SEEK "Stock.dat", Address
GETRECORD "Stock.dat", Existing
IF Existing.ItemID = 0 THEN
    // 0 marks an empty position
ENDIF
    SEEK "Stock.dat", Address
    PUTRECORD "Stock.dat", Item
    OUTPUT "Stored at ", Address
ELSE
    OUTPUT "Position ", Address, " is in use"
ENDIF
CLOSEFILE "Stock.dat"

تفقد مخطط العلامات نقطتين: SEEK قبل كل GETRECORD أو PUTRECORD (لأن القراءة تحرك المؤشر، لذا ابحث مرة أخرى قبل الكتابة)، وفتح الملف FOR RANDOM وإغلاقه في النهاية. لنسخ سجلات ملف عشوائي إلى ملف آخر، كرر على العناوين باستخدام SEEK، GETRECORD من ملف واحد وPUTRECORD إلى الآخر، متجاوزًا المواقع الفارغة.

استكشف

مسار الوصول إلى الملف

اتبع ملفاً من التخزين إلى البرنامج وعده بأمان.

مفردات تدريب
English العربية
serial file/ˈsɪərɪəl faɪl/ ملف تسلسلي
sequential file/siːˈkwenʃl faɪl/ ملف متتابع
random file/ˈrændəm faɪl/ ملف عشوائي
direct access/daɪˈrekt ˈækses/ الوصول المباشر
hash function/hæʃ ˈfʌŋkʃn/ دالة التجزئة
sequential access/siːˈkwenʃl ˈækses/ الوصول المتتابع
deterministic/dɪˌtɜːmɪˈnɪstɪk/ حتمي
collision/kəˈlɪʒn/ اصطدام
linear probing/ˈlɪnɪə ˈprəʊbɪŋ/ التفتيش الخطي
chaining/ˈtʃeɪnɪŋ/ السلاسل المترابطة
load factor/ləʊd ˈfæktə/ معامل التحميل
overflow area/ˌəʊvəˈfləʊ ˈeərɪə/ منطقة التداخل
overflow/ˌəʊvəˈfləʊ/ الانحياز (overflow)
شاهد الدرس
13.2

التشفير (Hashing)

دالة التشفير (أو خوارزمية التشفير) تأخذ مفتاح السجل وتنتج عنوانًا يُخزن فيه السجل. الخوارزمية الجيدة سريعة وحتمية وتوزع المفاتيح بالتساوي.

خوارزميات التشفير الشائعة لمكان存储器 $N$: خوارزمية الباقي address ← key MOD N؛ الطي (تقسيم المفتاح، جمع الأجزاء، قسمة N)؛ تشفير النص (جمع رموز الأحرف، قسمة N).

التصادم هو عندما يولد مفتاحان نفس العنوان. ثلاث طرق لحل هذه المشكلة:

الاستراتيجية آلية العمل المقايضة
الفحص الخطي استخدام الموقع الحر التالي (مع الدوران) بسيطة، لكن المفاتيح تتكتل
الربط المتسلسل يشير كل موقع إلى قائمة مربوطة من السجلات لا تكتل، لكنه يستهلك ذاكرة أكثر
إعادة التشفير تطبيق دالة تشفير ثانية يوزع المفاتيح، لكنه يتطلب عملًا إضافيًا
حل تصادم حيث يشفر المفتاحان A و B إلى الموقع 2. يضع الفحص الخطي B في الموقع الحر التالي (3)؛ ويحتفظ الربط المتسلسل بموقع 2 مشيرًا إلى قائمة مربوطة لـ A ثم B
حل تصادم التشفير: يستخدم الفحص الخطي الموقع الحر التالي؛ بينما يحافظ الربط المتسلسل على قائمة مربوطة لكل موقع

للبحث: شفر المفتاح، اقرأ ذلك الموقع؛ إذا تطابقت المفاتيح فقد انتهيت، وإلا تابع استراتيجية الحل حتى تتطابق المفاتيح أو تصل لموقع فارغ. للإضافة: شفر المفتاح، اكتب في ذلك الموقع أو الموقع الحر التالي. حافظ على عامل التحميل (السجلات ÷ المواقع) أقل من 70% تقريبًا للحصول على عمليات بحث تقارب O(1).

"اشرح ما يقصده بخوارزمية التشفير في سياق الوصول إلى الملفات" (ثلاث علامات). عملية حسابية (دالة) تُجرى على حقل المفتاح في السجل لتنتج قيمة تُستخدم كعنوان (مكان) يُخزن فيه السجل في الملف ويتم استرداده منه. نفس العملية الحسابية على نفس المفتاح تعطي دائمًا نفس العنوان، ولهذا يمكن العثور على السجل مجددًا دون الحاجة للبحث.

"اذكر طريقتين للتغلب على مشكلة التصادم." (1) الفحص الخطي (العنوان المفتوح): تخزين السجل في الموقع الحر التالي بعد العنوان المحسوب، مع الدوران إلى البداية إذا لزم الأمر؛ للاسترجاع، ابدأ من العنوان المشفر واقرأ للأمام حتى يتطابق المفتاح. (2) منطقة فائض أو الربط المتسلسل: تخزين السجل المتصادم في منطقة فائض منفصلة (أو قائمة مربوطة مرتبطة بالعنوان)، والتي يتم البحث فيها تسلسليًا بعد فشل العنوان الرئيسي في التطابق. أي طريقة تكفي؛ وصف عملية الاسترجاع بالإضافة إلى التخزين.

مثال محلول. ملف عشوائي يحتوي على 11 موقعًا للسجلات، مرقمة من 0 إلى 10، وخوارزمية التشفير هي Address ← Key MOD 11. تم تخزين سجلات ذات مفاتيح 1250، 1381، 1452، 1613 و 1470 بنفس الترتيب، باستخدام الفحص الخطي. أين يذهب كل سجل، واصف كيف يتم استرجاع المفتاح 1470.

$1250 \bmod 11 = 7$؛ $1381 \bmod 11 = 6$؛ $1452 \bmod 11 = 0$؛ $1613 \bmod 11 = 7$، حدث تصادم مع 1250، لذا 1613 يأخذ الموضع الحر التالي، 8؛ $1470 \bmod 11 = 7$ مرة أخرى، والمواضع 7 و8 مشغولة، لذا 1470 يذهب إلى 9. لاسترجاع 1470: احسب $7$، اقرأ الموضع 7 (المفتاح 1250، لا تطابق)، اقرأ 8 (1613، لا)، اقرأ 9 (1470، تم العثور عليه). إذا تم الوصول إلى موضع فارغ قبل التطابق، فإن السجل غير موجود في الملف. التصادمات هي ثمن الملف الصغير: خوارزمية التجزئة الجيدة توزع المفاتيح بالتساوي، ويُحافظ على الملف أقل بكثير من الامتلاء الكامل حتى تظل المسارات قصيرة.

استكشف

جدول تجزئة

راقب كيف يتم تحويل كل مفتاح إلى حاوية. التجزئة الجيدة توزع المفاتيح بحيث تبقى عمليات البحث سريعة.

13.3

الأعداد العشرية العائمة

المنهج
يجب أن يكون المرشحون قادرين على: ملاحظات وإرشادات
صف تنسيق الأعداد الحقيقية العائمة الثنائية استخدم صيغة المتمم الثاني (Two's complement). افهم تأثير تغيير تخصيص عدد البتات إلى الجزء العشري (Mantissa) والأس (Exponent) في تمثيل عدد عشري عائم
حول الأعداد الحقيقية العائمة الثنائية إلى عشري والعكس
قم بـ توحيد (Normalise) الأعداد العشرية العائمة افهم أسباب التوحيد
أظهر فهمًا لعواقب أن التمثيل الثنائي هو مجرد تقريب للعدد الحقيقي الذي يمثله (في بعض الحالات) افهم كيف يمكن أن يحدث انخفاض (Underflow) وزيادة (Overflow)
أظهر فهمًا بأن التمثيلات الثنائية يمكن أن تؤدي إلى أخطاء التقريب

المصدر: منهج كامبريدج الدولي

لتخزين أعداد حقيقية ذات أحجام مختلفة جدًا، تستخدم الحواسيغة تنسيق الأعداد العائمة — وهو شكل ثنائي للتدوين العلمي، مع حقلين:

  • الجزء الكسري (Mantissa) — الأرقام المعنوية.
  • الأس (Exponent) — قوة 2 التي تُضرب بها.

يُخزن كلاهما كأعداد صحيحة بصيغة المتمم الثنائي. القيمة هي

$$\text{number} = \text{mantissa} \times 2^{\text{exponent}}.$$

اقرأ الجزء الكسري ككسر ثنائي — أول بت بعد الفاصلة قيمته $1/2$، التالي $1/4$، ثم $1/8$، وهكذا. لذا 0.1010000 هي $1/2 + 1/8 = 0.625$؛ مع أس 00000010 (= 2) تكون القيمة $0.625 \times 2^{2} = 2.5$.

بايتان من القيم المكانية: جزء كسري 8 بت بإشارة وکسور من النصف إلى 1/128، وأس متمم ثنائي 8 بت من -128 إلى 1
القيم المكانية للجزء الكسري 8 بت والأس 8 بت

التحويل

  • ثنائي → عشري: اقرأ الجزء الكسري (استخدم قواعد المتمم الثنائي إذا كان سالبًا) ككسر، اقرأ الأس كعدد صحيح مسبق الإشارة، ثم اضرب الجزء الكسري في $2^{\text{exponent}}$.
  • عشري → ثنائي: اكتب العدد ككسر ثنائي × قوة 2، ثم تخزن الجزء الكسري والأس بالتنسيقات المتفق عليها.

مثال محلول. عدد له جزء كسري 10110000 وأس 00000011. أوجد قيمته العشرية.

الأس 00000011 هو $+3$. يبدأ الجزء الكسري بـ 1، لذا فهو سالب. مقروءً كـ 1.0110000 بالمتمم الثنائي، قيمة بت الإشارة هي $-1$ وبتات الكسر تضيف $\tfrac{1}{4} + \tfrac{1}{8} = 0.375$، لذا الجزء الكسري هو $-1 + 0.375 = -0.625$. ثم

$$\text{number} = -0.625 \times 2^{3} = -5.0.$$

مثال محلول. اخزن $+2.5$ بهذا التنسيق.

بالثنائي $2.5 = 10.1$. مكتوبًا ككسر طبيعي، $2.5 = 0.101 \times 2^{2}$. لذا الجزء الكسري هو 01010000 (بت إشارة 0، ثم .101) والأس هو 00000010 ($= 2$).

تنسيق الامتحان: متمم ثنائي، جزء كسري وأس

تُحدد الامتحان تنسيقًا مثل 10 بتات للمقدار و6 بتات للأس، وكلاهما بنظام المتمم الثنائي. تقع النقطة الثنائية للمقدار بعد أول بت (بت الإشارة)، لذا يكون المقدار الموجب 0.xxxxxxxxx والسالب 1.xxxxxxxxx؛ والأس هو عدد صحيح موجه عادي. كل عملية تحويل تستخدم نفس الخطوات الثلاث: اقرأ المقدار ككسر (قواعد المتمم الثنائي إذا بدأ بـ 1)، واقرأ الأس كعدد صحيح، واضرب في $2^{\text{exponent}}$.

مثال محلول (من ثنائي إلى عشري). المقدار 0101100000، الأس 000011.

المقدار: $0.101100000_2 = \tfrac{1}{2} + \tfrac{1}{8} + \tfrac{1}{16} = 0.6875$. الأس: $000011_2 = 3$. القيمة: $0.6875 \times 2^{3} = 5.5$.

مثال محلول (مقدار سالب). المقدار 1011000000، الأس 000010.

يبدأ المقدار بـ 1، لذا فهو سالب. قيمته $-1 + 0.011000000_2 = -1 + (\tfrac{1}{4} + \tfrac{1}{8}) = -0.625$؛ الأس $= 2$؛ القيمة $-0.625 \times 4 = -2.5$. (أو بدلاً من ذلك، خذ المتمم الثنائي للمقدار 0101000000 $= 0.625$، وأضف إشارة السالب). أس سالب مثل 111110 $= -2$ يؤدي إلى القسمة بدلاً من الضرب: مقدار قدره $0.5$ مع هذا الأس يساوي $0.5 \times 2^{-2} = 0.125$.

مثال محلول (من عشري إلى ثنائي). احفظ $+6.5$ و$-6.5$ بتنسيق 10 بتات و6 بتات، بشكل مطوَّق.

$6.5 = 110.1_2 = 0.1101_2 \times 2^{3}$، لذا المقدار هو 0110100000 والأس 000011. بالنسبة لـ $-6.5$، خذ المتمم الثنائي للمقدار: 1001100000 (تحقق: $-1 + 0.0011_2 = -1 + 0.1875 = -0.8125$، و$-0.8125 \times 8 = -6.5$)، الأس 000011 دون تغيير. لا تنتقل الإشارة إلى الأس؛ العدد السالب له مقدار سالب.

التطويق

يتم تطبيع الرقم عندما يكون أول بت ذي أهمية مباشرة بعد الفاصلة الثنائية (بدون أصفار بادئة مهدرة). هذا يعظم الدقة، لأن كل بت في الجزء الكسري يحمل معلومات. للتطبيع، انقل الجزء الكسري لليسار ونقص الأس (أو انقل لليمين وزد الأس) حتى يكون أول بت ذي أهمية في مكانه؛ القيمة تتغير. بالنسبة للأجزاء الكسرية السالبة (بإكمال الاثنان)، يتبع بت الإشارة (1) مباشرةً 0.

التعرف على الشكل المطوّق وإنتاجه. يبدأ المقدار الموجب المطوّق بـ 01؛ والسالب بـ 10. لذا 0011000000 ليس مطوّقًا (أزح لليسار بمكان واحد وانقص واحدًا من الأس: 0110000000، الأس أقل بمقدار واحد) و1100000000 ليس كذلك أيضًا (أزح لليسار حتى يصبح النمط 10...). يجب أن يقابل كل إزاحة لليسار للمقدار طرح واحد من الأس، وإلا ستتغير القيمة.

"اشرح لماذا تُخزن الأعداد بصيغة مطوّقة" (درجتان). (1) يعطي أقصى دقة (دقة) لعدد البتات المتاحة، لأنه لا تُهدر بتات على أصفار بادئة (أو آحاد بادئة للعدد السالب)؛ (2) لكل عدد حينئذٍ تمثيل فريد، مما يسمح بمقارنة الأعداد؛ و(3) يستغل أفضل استخدام للنطاق المتاح. أي اثنتان من هذه النقاط تكفي.

تطويق 0.0011010 مع أس 4: أزح المقدار لليسار مرتين وانقص الأس بمقدار 2، مما يعطي 0.1101000 مع أس 2 — نفس القيمة، بدون أصفار بادئة مهدرة
التطويق: أزح المقدار لليسار لإزالة الأصفار البادئة، مع إنقاص الأس بنفس المقدار

التقريب وأخطاء التدوير

العديد من الأعداد الحقيقية العشرية لا يمكن تخزينها بدقة في النظام الثنائي — مثلاً $0.1_{10}$ هو الكسر الثنائي المتكرر $0.000110011\ldots_{2}$، والذي يجب قطعه. العواقب:

  • أخطاء التدوير تتراكم عبر عمليات عديدة (0.1 + 0.2 ليست بالضبط 0.3).
  • فشل المقارنات — لا تختبر ever حقيقيًا بالمساواة. اختبر أن الفرق أصغر من حد تحمل صغير، IF Difference < 0.000001، حيث يُؤخذ الفرق بالطريقة الصحيحة أو عبر دالة قيمة مطلقة تحددها السؤال. ABS غير موجود في ورقة الإضافة 9618 أو دليل الشيفرات الوهمية، لذا لا تفترض أنه موجود: يقول الدليل أن أي دالة يحتاجها السؤال ستُعطى.
  • طرح قيمتين متقاربتين يفقد الدقة.
  • الانهمار (نتيجة أكبر من نطاق الأس) والفوق انهمار (نتيجة أصغر من الصفر، تدور إلى الصفر) يحدثان عندما ينفذ نطاق الأس.

للحاجة إلى الدقة (مثل العملة)، استخدم النقطة الثابتة أو BCD بدلاً من النقاط العائمة.

ثلاثة كلمات 16-بت مقسمة بشكل مختلف بين الجزء الكسري والأس: اثنا عشر وأربعة بتات للدقة مع نطاق صغير، وثمانية وثمانية للتوازن، وأربعة واثني عشر لنطاق ضخم مع قيم خشنة
نفس إجمالي عدد البتات مقسوم بطريقتين: بتات المقدار تشتري الدقة، وبتات الأس تشتري النطاق، ولا يمكن لأحدهما أن ينمو إلا على حساب الآخر

"صِف تأثير تغيير تخصيص البتات" (ثلاث درجات). مع عدد ثابت من البتات، زيادة المقدار وتقليل الأس يمنح دقة أعلى (أرقام معنوية أكثر، أخطاء تدوير أقل) لكن نطاقًا أصغر (أكبر وأصغر القيم التي يمكن تخزينها تنكمش)؛ زيادة الأس تفعل العكس: نطاق أكبر على حساب الدقة. اذكر التأثيرين والاتجاهين.

الأكبر والأصغر. في تنسيق 10 بت للمعامل (mantissa)، و6 بت للأس (exponent)، فإن أكبر عدد موجب له معامل 0111111111 ($= 1 - 2^{-9}$) وأس 011111 ($= 31$): حوالي $2^{31}$. أصغر عدد موجب طبيعي له معامل 0100000000 ($= 0.5$) وأس 100000 ($= -32$): $0.5 \times 2^{-32} = 2^{-33}$. أكثر عدد سالب له معامل 1000000000 ($= -1$) وأس $31$: $-2^{31}$.

"اشرح ما يُقصد بالانهمار والفوق انهمار." الانهمار يحدث عندما تكون نتيجة الحساب أكبر من أكبر عدد يمكن تمثيله، بحيث يحتاج الأس إلى بتات أكثر مما يمتلكه؛ الفوق انهمار يحدث عندما تكون النتيجة أصغر من أصغر (غير صفري) عدد يمكن تمثيله، قريبة جدًا من الصفر بحيث لا يستطيع الأس التعبير عنها، فتُخزن كصفر. كلاهما ناتج عن نطاق الأس، وليس نطاق المقدار.

لماذا يمثل التمثيل الثنائي مجرد تقريب. يمكن للكسر الثنائي أن يمثل مجاميع $\tfrac{1}{2}, \tfrac{1}{4}, \tfrac{1}{8}, \ldots$ فقط بدقة؛ وقيمة مثل $0.1$ أو $\tfrac{1}{3}$ لها توسع ثنائي لا نهائي، وبما أن المانتيسا تحتوي على عدد ثابت من البتات، فإن القيمة المخزنة هي الأقرب التي تتسع. الفرق هو خطأ التقريب؛ وهو صغير لعدد واحد لكنه يتراكم عبر عمليات الحساب المتكررة (قد لا يعطي جمع $0.1$ عشر مرات نتيجة $1$ بالضبط)، ولهذا السبب لا ينبغي أبداً اختبار الأعداد الحقيقية للمساواة الدقيقة.

استكشف

بناء عدد عشري عائم

قلب بتات المقام والمُدرَج لصنع قيمة، والتحقق مما إذا كانت مُعدَّلة.

استكشف

تعديل عدد عشري عائم

مرر بخطوات التعديل. نقل المقام لإزالة الأصفار الرائدة المهدرة — وضبط المُدرَج للمطابقة — يحافظ على القيمة نفسها لكن يستهلك كل بت للدقة.

مفردات تدريب
English العربية
floating-point/ˈfləʊtɪŋ pɔɪnt/ نقاط عائمة
mantissa/mænˈtɪsə/ المقام
exponent/ekˈspəʊnənt/ الأس
two's complement/tuːz ˈkɒmplɪmənt/ تكميل اثنان
normalised/ˈnɔːməlaɪzd/ منظم
rounding errors/ˈraʊndɪŋ ˈerəz/ أخطاء التقريب
underflow/ˌʌndəˈfləʊ/ انحدار
fixed-point/fɪkst pɔɪnt/ نقاط ثابتة
BCD/ˌbiː siː ˈdiː/ BCD
precision/prɪˈsɪʒn/ الدقة
range/reɪndʒ/ المدى
شاهد الدرس
13.3

التعريفات التي يقبلها المصحح

تُصنّف أسئلة التعريف بناءً على صياغة ثابتة. احفظ هذه التعريفات بدقة، وقدم إجابة واحدة فقط.

مصطلح تعريف
نوع بيانات مُعرّف بواسطة المستخدم نوع بيانات تم تعريفه بواسطة المبرمج، بناءً على أنواع موجودة، لتمثيل بيانات خاصة بالمسألة
نوع غير مركب نوع تم تعريفه دون الرجوع إلى نوع آخر؛ يحتوي على قيمة واحدة (عدد صحيح، حقيقي، مذكور، مؤشر)
نوع مركب نوع يتكون من أنواع أخرى؛ يحتوي على عدة قيم تحت معرّف واحد (سجل، مجموعة، مصفوفة، فئة)
نوع مذكور نوع غير مركب يتم تعريفه عن طريق سرد جميع قيم الممكنة له، بالترتيب
نوع مؤشر نوع غير مركب تكون قيمته عنوان الذاكرة لمتغير من نوع معين
مجموعة نوع مركب يحتوي على مجموعة من قيم نوع واحد، غير مرتبة وبدون تكرار
سجل نوع مركب يحتوي على عدد ثابت من الحقول، لكل منها معرّف ونوع خاص به، يتم الوصول إليها باستخدام علامة النقطة
فئة نوع مركب يدمج بين الخصائص (البيانات) والطرق (الإجراءات والدوال) التي تعمل عليها؛ الكائن هو مثال على الفئة
ملف تسلسلي سجلات مخزنة واحداً تلو الآخر بالترتيب الذي تمت إضافتها فيه
ملف متتابع سجلات مخزنة واحداً تلو الآخر بترتيب حقل المفتاح
ملف عشوائي سجلات مخزنة في عناوين تُحسب من مفاتيحها بواسطة خوارزمية التجزئة
الوصول المتتابع قراءة السجلات تباعاً من بداية الملف حتى العثور على المطلوب
الوصول المباشر حساب عنوان السجل من مفتاحه والذهاب مباشرة إلى ذلك الموقع
خوارزمية التجزئة عملية حسابية على مفتاح السجل تعطي العنوان الذي يُخزن ويُسترجع منه السجل
تصادم مفتاحان مختلفان ينتجان نفس العنوان
المانتيسا الجزء من العدد العائم الذي يحمل بتاته المعنوية، ككسر بمتمم الاثنين
الأس عدد صحيح بمتمم الاثنين يعطي أس功率 Two الذي يُضرب فيه المانتيسا
مقيّس عدد عائم يبدأ مانتيساه بـ 01 (موجب) أو 10 (سالب)، بحيث لا تُهدر بتات في الأصفار أو الآحاد الرائدة
فائض نتيجة كبيرة جداً لا يمكن تمثيلها بعدد البتات المتاحة
نقص نتيجة غير صفر صغيرة جداً لا يمكن تمثيلها، لذا تُخزن كصفر
خطأ التقريب الفرق بين عدد حقيقي وأقرب قيمة يمكن للتمثيل الثنائي استيعابها
13.3

نصائح للامتحان

  • إعلانات الكود الوهمي تُعلَم سطراً بسطر: TYPE ... = (...) للأنواع المذكورة، TYPE ... = ^... للمؤشرات، TYPE ... = SET OF ... ثم DEFINE ... (...) : ... للمجموعات، TYPE ... DECLARE ... ENDTYPE للسجلات، CLASS ... PRIVATE ... PUBLIC PROCEDURE NEW ... ENDCLASS للفئات.
  • طابق النوع مع البيانات: قيم اسمية ثابتة، مذكور؛ مجموعة حقول مختلفة، سجل؛ مجموعة من القيم الفريدة، مجموعة؛ بيانات وسلوك، فئة؛ عنوان، مؤشر.
  • تنظيم الملفات هو كيفية تخزين السجلات؛ وصول الملفات هو كيفية إيجادها. ملفات التسلسل والمصفوفات تُقرأ بشكل متتابع؛ ملفات العشوائية تستخدم الوصول المباشر عبر تجزئة المفتاح. البحث المتتابع لملف متتابع يمكن أن يتوقف مبكراً؛ أما في ملف تسلسلي فلا يمكن.
  • كود وهمي لملف عشوائي: OPENFILE ... FOR RANDOM، SEEK قبل كل GETRECORD أو PUTRECORD، CLOSEFILE في النهاية. اذكر كيفية حل التصادم عند وصف التجزئة.
  • الأعداد العائمة: المانتيسا ككسر بمتمم الاثنين (بعد بت الإشارة)، والأس كعدد صحيح، اضرب في $2^{\text{exponent}}$؛ أزل يساراً واطرح واحدًا من الأس لتقييسه؛ المانتيسا تشتري الدقة، والأس يشتري النطاق.
  • الإجابات القياسية الثلاث "اشرح": لماذا نقيّس (الدقة، الشكل الفريد، النطاق)، تأثير إعادة تخصيص البتات (الدقة مقابل النطاق)، ولماذا $0.1$ لا يمكن تخزينه بدقة (كسر ثنائي لا نهائي في مانتيسا محدودة).

أخطاء شائعة

  • كتابة DECLARE بدلاً من TYPE لنوع جديد، أو ترك ENDTYPE؛ الإعلان عن مجموعة بدون SET OF، أو نوع مذكور بوضع علامات اقتباس حول قيمه.
  • وضع إشارة العدد العائم في الأس؛ الإشارة هي أول بت في المانتيسا.
  • قراءة المانتيسا السالبة وكأنها إشارة ومقدار؛ بل هي متمم اثنين، لذا 1011000000 هي $-0.625$، وليست $-0.375$.
  • نقل المانتيسا للتقييس دون تغيير الأس، أو تغييره بالطريقة الخاطئة (النقل يساراً، الأس لأسفل).
  • وصف الملف العشوائي بأنه "بترتيب عشوائي"؛ السجلات تقع في عناوين محسوبة من مفاتيحها.
  • القول بأن الوصول المتتابع يقرأ "الملف بأكمله" لملف متتابع؛ يتوقف عند encountering مفتاح أكبر.
  • شرح التجزئة دون ذكر ما يُستخدم له القيمة المحسوبة (العنوان لتخزين واسترجاع السجل)، أو دون طريقة للتعامل مع التصادمات.
  • تعريف الفائض بأنه "كثير من الأرقام" بدلاً من نتيجة تتجاوز أكبر قيمة قابلة للتمثيل، أو لوم المانتيسا عليه.

دروس تفاعلية حول هذا الموضوع

ا-working عليه خطوة بخطوة، مع تمارين تحقق فوري.

أوراق الامتحانات السابقة

المزيد من المواضيع في A-Level علوم الحاسوب

تسجيل الدخول أو إنشاء حساب

IGCSE, A-Level & AP