|
التعامل
مع الأعداد و الكلمات
و
القوائم و المتغيرات
مقدمة
:
تتعامل اللوجو مع جميع الأعداد الحقيقة
مثـل 1423
، 3.23
، أيضا تتعامل مع الكلمات ، وعادة تبدأ الكلمات بعلامة تنصيص و تنتهي
بمسافة خالية مثل :
"CAIRO
"X1
"BENHA
أما القوائم فتبدأ
بقوس مربع ] و تنتهي بمرافق
القوس[ و مثال ذلك :
[CAIRO] [MAHMOUD BADR][100 200 300]
و سوف نتناول
التعامل مع القوائم والأعداد والكلمات فيما
يلي :
1-
الكلمات WORDS:
تتعامل اللوجو مع
الكلمة على أنها مجموعة مـن
الرموز المتصلة و هذه الرموز يمكن ان تكون
خليط من الحروف و
الأرقام ، و إذا ما احتوت الكلمة على فراغ
فلن تعتبر كلمة ، أما إذا احتوت على علامة
الطرح أو القسمة أو
الجمع أو الضرب أو الرفع فإنها لن تعتبر
كلمة إلا إذ سبق العلامات السابقة
العلامة و مثال
ذلك :
|
"MAHMOUD BADR
|
ليست
كلمة لوجود فراغ بها
|
|
"AHMED-MAHMOUD
|
لوجود
علامة الطرح بها
|
|
"7*8
|
لوجود
علامة الضرب بها
|
والمثالين الأخيرين يمكن أن تعاملهم
اللوجو على أنهم
كلمتين بشرط وضع العلامة
قبل علامتي الضـرب و
الطرح السابقتين :
-MAHMOUD
"AHMED
*8
"7
و لكن الجملة "MAHMOUD
BADR يمكن
معالجتها علـــى أنها
كلمة إذا ما وضعنا في الفراغ
النقطــة "." أو الشرطة"
_ " و بذلك يمكن
معالجتها ككلمة كما يلي :
"MAHMOUD_BADR.
والكلمات قد تكون
مدخلات للأمر PRINT
و مثال ذلك
PR
"EGYPT
EGYPT
PR
"MAHMOUD_BADR
MAHMOUD_BADR
و إذا حاولت أن تدخل
أي كلمة لا تبدأ بعلامـة
التنصيص مثل DR
او كلمة تحتوى في وسطها
على فراغ مثل BADR
MAHMOUD
، فان اللوجو سوف تبحث في
أولياتها أو أسماء الإجراءات لديها ثم
ترد برسالة الخطأ
المعروفة و هي :
I
DON'T KNOW HOW TO DR
2-
القوائم LISTS :
القائمة في اللوجو
هي آي شئ يحتوى على عنصــر
واحد أو مجموعة من العناصر يفصل بينها
فراغ أو يوضع العنصر داخل قوس مربع أو توضع
القائمة كلهـا داخل
قوس مربع [] و مثال ذلك :
[DR MAHMOUD BADR]
[WHAT IS LOGO TURTLE LIKE
]
[10 20 30 30 40 50]
[DR\ MAHMOUD BADR [BENHA UNIVERSITY]]
و يمكن استخدامها
كمدخلات لأمر الطباعة PR
أيضا و مثال ذلك :
PR
[DR MAHMOUD BADR]
DR MAHMOUD BADR
PR
[10 20 30 30 40 50]
10 20 30 30 40 50
PR [DR\ MAHMOUD BADR [BENHA UNIVERSITY]] DR\ MAHMOUD BADR [BENHA UNIVERSITY]
و لكن الكلمة لا
تعادل القائمة .
و يمكنك استخدام
القوس المربع خاويا لتحسين
العرض و مثال ذلك :
TO
IMPROVE
PR
[ ]
PR
[BENHA UNIVERSITY,]
PR
[ ]
PR
[COLLOGE OF EDUCATION]
PR
[ ]
END
وإذا نفذت الإجراء
السابق فسوف تشاهد ما يلي :
IMPROVE
BENHA UNIVERSITY,
COLLOGE OF EDUCATION
و إذا ما احتوت
القائمة على فراغات في بدايتها
فان اللوجو سوف
تتجاهل ذلك .
3- الأولية FIRST
:
تمكنك الأولية FIRST
من اختيار أول حرف في الكلمة أو
أول عنصر في القائمة
و مثال ذلك :
PR
FIRST "MAHMOUD
M
أما القائمة :
PR
FIRST [MAHMOUD BADR]
MAHMOUD
وإذا ما كانت
القائمة فارغة فان الرسالة
التالية سوف تجدها :
first
[]
first
doesn't like [] as input.
وكذلك لا تقبل
الكلمة الخاوية :
FIRST
"
FIRST
doesn't like as input
و إذا ما احتوت
الكلمة على حرف واحد فإنها بالطبـع
تكتبه ، تأمل المثال التالي :
PR
FIRST FIRST [MAHMOUD BADR]
M
اختارت أولا MAHMOUD
أما FIRST
الثانية فاختارت أول حرف
فيها (M)
و هو الناتج.
و الإجراء التالي يتعرف على العدد 5
كأول عــدد في
قائمة تدخلها له :
TO KNOW :NLIST
IF (FIRST :NLIST) = 5 [PR "GOOD STOP ]
PR "BAD
END
KNOW
[5 7 9 0 8]
GOOD
KNOW
[7 8 5]
BAD
و
نلاحظ أن الأولية FIRST
تبحث في أول عنصر أو
حرف فقط ، لكننا و قد
نرغب في البحث عن
عناصر القائمة أو الكلمة
الأخرى.
4- الأولية BUTFIRST
:
الأولية BUTFIRST
و اختصارها BFتختار
كل الكلمة مع استبعاد
أول حرف أو تختار كل العناصر و تستبعد أول
عنصر ومثال ذلك :
"MAHMOUD
"PR
BUTFIRST
AHMOUD
PR BF [DR MAHMOUD BADR]
MAHMOUD BADR
إذن فالأوليتين FIRST
و BUTFIRST تتقاسما
الكلمة أو القائمة
في عملهما .
الآن دعنا نستخدم
الأولية BF
داخل إجراء مع المعاودة مع
ملاحظة أنها سوف تنتج شئ مثير ، لنجرب ذلك :
TO
PRIMEDW :WORD
IF :WORD = " [STOP]
SHOW :WORD
PRIMEDW BF :WORD
END
الآن لننفذ الإجراء
السابق :
PRIMEDW "MAHMOUD
MAHMOUD
AHMOUD
HMOUD
MOUD
OUD
UD
D
لنجرب الإجراء PRIMEDW
مع قائمة :
PRIMEDW
[DR MAHMOUD BADR]
DR MAHMOUD BADR
MAHMOUD
BADR
BADR
هنا يصبح القوس خاوي
فترد بالرسالة التالية قبـل
أن تخرج من الإجراء مع ملاحظة ان الإجراء
يتعامل في تصميمه مع كلمة :
The procedure
BF does not like [] as input PRIMEDW [DR MAHMOUD BADR]
[DR
MAHMOUD BADR]
[MAHMOUD
BADR]
[BADR]
[]
BF doesn't like
[] as input in PRIMEDW
لذا يمكنك تعديل
الإجراء PRIMEDW
كما يلي ليتعامل مع
القائمة :
TO
PRIMEDW :WORD
IF :WORD = " [STOP]
IF :WORD = [ ] [STOP]
PR :WORD
PRIMEDW BF :WORD
END
الآن يمكن لإجرائك
أن يتعامل مع الكلمات و القوائــم
في نفس الوقت ، و لكن اللوجو تضيف
الأولية EMPTYP
التي تقارن بالخواء سواء لكلمة أو لقائمة
، لذلــك يمكنك أن
تعيد كتابة الإجراء السابق لتتجنب خطأ
الخواء السابق كما يلي :
TO PRIMEDW :WORD
IF EMPTYP :WORD
[STOP]
PR :WORD
PRIMEDW BF :WORD
END
هنا لن ترد اللوجو
برسالة خطأ لأنها ستتعامل مع
فراغ الكلمة والقائمة على حدا سواء .
يمكننا الآن أن نتعرف على أي عنصر بالكلمة
أو الإجراء
باستخدام الأوليتين كما يلي :
TO
KNOW :NLIST
IF
(FIRST :NLIST) = 5 [PR "GOOD STOP]
KNOW BF :NLIST
PR "BAD
END
KNOW
[6 7 9 5 8]
GOOD
BAD
BAD
BAD
KNOW
[7 8 5]
GOOD
BAD
BAD
عندما ينادى الإجراء
نفسه يستبعد أول عنصر حتى يصبح
أول عنصر هو 5 حينئذ يرد
بالرسالة GOOD
، ثم تتذكر ما سبق نداؤه ووجوب الرد بـ BAD
، و إذا لم تحتوى
القائمة على العدد 5
فإنها ترد برسالة خطأ.
KNOW [7 8 1]
FIRST doesn't like [] as input in KNOW
[IF (FIRST :NLIST) = 5 [PR "GOOD STOP]]
*-التركيز
هنا على اختيار العنصر أو الحرف الأول و لكن
يمكننا أيضا أن نستبعد أو نختار الحرف
الأخير ؟
5-
الأولية LAST:
الأولية LAST
تمكننا من اختيار الحرف الأخير من كلمة أو العنصر الأخير من قائمة الآن
اكتب :
PR
LAST "MAHMOUD
D
PR
LAST 345.856
6
PRINT
LAST [DR MAHMOUD BADR]
BADR
نحن تمكننا هنا من
اختيار الحرف أو العنصر الأخير
، فهل يمكننا أن نختار كل الكلمة مع
استبعاد الحرف الأخير أو
اختيار كل القائمة مع استبعاد العنصر الأخير
؟
6- الأولية BUTLAST:
الأولية BUTLAST
و اختصارها BL
تمكنك من اختيار كـل
القائمة مع استبعاد العنصر الأخير ، أو
اختيار كــل الكلمة
مع استبعاد الحرف الأخير و مثال ذلك :
PR
BL "MAHMOUD
MAHMOU
PR
BL 345.856
345.85
PRINT
BL [DR MAHMOUD BADR]
DR MAHMOUD
لنحاول أن نستخدم
الأولية BL
بدلا من الأولية BF
في الإجراء PRIMEDD
كما
يلي :
TO PRIMEDD :WORD
IF
EMPTY :WORD
[STOP]
PR
:WORD
PRIMEDD
BL :WORD
END
PRIMEDD "MAHMOUD
MAHMOUD
MAHMOU
MAHMO
MAHM
MAH
MA
M
مناقشة :
1-
كيف
يمكن أن ندخل الجملة على أنها كلمة ؟
2-
ماذا
ينتج من الجملة PR FIRST"BADR
3-
ماذا
ينتج من الجملة PR LAST"BADR
4-
ماذا
ينتج من الجملة PR BF"BADR
5-
ماذا
ينتج من الجملة PR BL"BADR
6-
اذكر
مثال من عندك بحيث تؤدى آي من الأوليتين
FIRST
أو LAST
نفس الشيء .
7-
اكتب
إجراء يحسب عدد الحروف في كلمة تدخلها ويطبعه
.
8-
اكتب
إجراء و سميه METAL
و يحتوى الإجراءات
الفرعية التالية :
أ-إجراء
يبحث عن كلمة داخل قائمة :METAL1 :WORD :LIST
ب-إجراء
يبحث عن قائمة داخل القائمة :METAL2 :LIST1 :LIST2
جـ
إجراء يبحث عن حرف داخل كلمة :METAL3 :CHAR :WORD
7-
بناء القوائم و الجمل
7- أ - الأولية WORD
:
الأولية
WORD
تركب الكلمات ، أو الأرقام ،
فعندما تدخل لها مجموعة من الكلمات فإنها
تعالجهم كما لو
كانوا جملة و مثال ذلك :
PR
WORD 199 4
لاحظ أن العدد 4 يبتعد بمسافة عن
العدد 199
هنا تضمهم اللوجو
معا و يصبح العدد :
PR
WORD 199 4
1994
الآن جرب كتابة ما
يلي :
PR
(WORD "DR ". "MAHMOUD ". "BADR)
لاحظ أن عدد
المدخلات هنا خمسة و سوف تقوم اللوجو هنا
بحذف علامات التنصيص و المسافات الخالية
لذا ســوف يظهر لديك
المخرج التالي :
DR.MAHMOUD.BADR
*- الاسم بصورته
الجديدة غير مريح فقد وضعنا نقطة تلي كل اسم
حتى نميزه وإلا سوف يظهر الاسم كسلسلة متصلة و
لكن آلا توجد وسيلة مناسبة أخري تظهر الاسم
بشكل طبيعي و بالأحرى لا تحذف المسافات لخالية
من الاسم ؟
7- ب- الأولية SENTENCE:
تعالج الأولية SENTENCE
و اختصارها SE
الكلمـات و لا تحذف
الفراغ و مثال ذلك :
PR
SE "DR "MAHMOUD "BADR
هنا تحذف اللوجو
علامات التنصيص وتكتب الاسم كما
يلي :
PR SE "DR
"MAHMOUD "BADR
DR MAHMOUD
You don't say what to do
with BADR
هنا قبلت مدخلين
بينما أخرجت الثالث والآن أحط الجميع بقوس
هلالي :
PR
(SE "DR "MAHMOUD "BADR)
DR MAHMOUD BADR
آي
أن الأمر عند إحاطته بقوس هلالي يقبل اكثر من
مدخل .
* تعاملنا مع الكلمات
و الأرقام فكيف نتعامل مـع القوائم ؟
تمكننا الأولية SE
أيضا من معالجة القوائم و ذلك
بحذف القوس المربع الخارجي و مثال ذلك :
PR
SE [CAIRO] [IS] [CAPITAL] [OF] [EGYPT]
[CAIRO] [IS] [CAPITAL] [OF]
[EGYPT]
PR SE [[CAIRO] [IS]
[CAPITAL] [OF] [EGYPT]]
not enough inputs to SE
هنا بحثت لوجو فلم
تجد سوي مدخل واحد هو قائمة علي الرغم من
احتوائها علي قوائم ، احذف القوس المربع
الأول وجرب :
PR SE [CAIRO] [IS] [CAPITAL] [OF] [EGYPT]
CAIRO IS
You don't say what to do with [CAPITAL]
PR (SE [CAIRO IS CAPITAL OF EGYPT])
CAIRO IS CAPITAL OF EGYPT
ويمكن أن تعالج
الجملة SE
إحدى الكلمات ضمن القائمة كما يلي :
PR ( SE "CAIRO [[IS]
[CAPITAL] [OF] [EGYPT]])
CAIRO [IS] [CAPITAL] [OF]
[EGYPT]
أما الأرقام
فتعالجها ولكن لا تحذف المسافات الخالية
مثلا :
PR
SE "199 "4
199 4
PR
(SE "199 "4 " "1)
199 4 1
الآن تذكر برنامج
البيسك التالي :
10 INPUT NAME$
20 PRINT"WELCOM
";NAME$;",I'M HAPY TO MET YOU"
عندما تنفذ ذلك
البرنامج الصغير سوف يدور الحوار
كما يلي :
AHMED
WELCOM AHMED,I'M HAPY TO MET YOU
الآن لنصمم إجراء
بلغة اللوجو ينفذ ذلك :
TO WELCOM :NAME
PR
(SE WORD :NAME ",[I'M HAPY TO MET YOU])
END
WELCOM "AHMED
AHMED, I'M HAPY TO MET YOU
هنا استخدمنا
الأولية WORD
لإلحاق الفاصلة بالاسم فلديها
الاسم NAME
و الفاصلة ",
و هذا أمر شيق فيمكننا أن نعد برنامج
تفاعلي لإظهار
نواتج الضرب و مثال ذلك :
TO MULTP :X :Y
PR (SE :X* :Y [=]:Y [*]:X
[حاصل ضرب] )
END
MULTP 3 7
21
= 7 * 3 حاصل
ضرب
7-جـ
الأولية LIST
تمكننا الأولية LIST
من التعامل مع القوائم و حتى
يتضح الفرق بين الأولية LIST
و الأولية SE
نـورد المثال
التالي :
PR (SE [[CAIRO] [IS] [CAPITALOF] [EGYPT]])
CAIRO IS CAPITALOF EGYPT
الآن استبدل الأولية
SE
بالأولية LIST
و لاحظ الأقـواس
PR (LIST [CAIRO]
[IS] [CAPITALOF] [EGYPT])
[CAIRO] [IS] [CAPITAL OF]
[EGYPT]
و الفارق هو أن
الجملة SE
استقبلت 5 قوائم و
وضعتهم في قائمة
واحدة ، أما الأولية LIST
فأنشــأت قائمة تضم 3 عناصر وحافظت
عليهم كقوائم .
*-
الأوليتان LIST
و SE
تضع العناصر مرتبة هل يمكن التحكم في وضع بعض العناصر في
أول القائمـة أو في أخر القائمة ؟
7- ء- الأولية FPUT
و الأولية LPUT :
يشتق اسم الأولية FPUT
من الكلمتين FIRST PUT
أي ضع في
الأول ، أما اسم الأولية LPUT
فيشتق من الكلمتيـن LAST
PUT و يعنى ضع في
الأخر و مثال ذلك :
PR FPUT "1973. [OCTOBER WARE]
هنا تدمج الكلمة 1973.
في أول القائمة كما
يلي :
1973. OCTOPER WARE
أما الأولية LPUT
فتعمل على وضع المدخل في
آخر القائمة كما
يلي :
PR
LPUT "1973. [OCTOBER WARE]
OCTOPER WARE 1973.
و
لتوضيح عمل الأولية LPUT
نعرض الإجراء التالي
الذي يطبع مربعات الأعداد
العشرة الأولى :
TO ALIST :Y :LIST
IF :Y =10 [STOP]
PR LPUT :Y*:Y :LIST
ALIST :Y+1 :LIST
END
ندخل
Y=1و LIST=[
]قائمة
خاوية ALIST 1 [ ]
1
4
9
16
25
36
49
64
81
نحن طبعنا مربعات
الأعداد و لكننا لم نضيف شئ
للقائمة ، ففي الواقع
نحن ننشئ في كل مرة قائمة جديدة تحتوى على عنصر
واحد ، و لكن كيف يمكننـا أن
نضيف للقائمة ؟
هل تتذكر جملة
البيسك LET
X=70
لدينا
أولية مشابهة و هي MAKE
"X 70
و يمكننا أن نستعمل
الأولية MAKE
كما يلي :
MAKE
"LIST LPUT :X :LIST
هنا فرغنا القيمة
القديمة و وضعنا القيمة الجديـدة
في الأخر والآن تأمل الإجراء التالي :
TO ALIST1 :Y :LIST
IF :Y= 10 [STOP]
MAKE
"LIST LPUT (:Y *:Y) :LIST
PR :LIST
ALIST1 :Y+1 :LIST
END
الآن دعنا ننفذ
الإجراء ALIST1
ALIST1 1 []
1
1
4
1
4 9
1
4 9 16
1
4 9 16 25
1
4 9 16 25 36
1
4 9 16 25 36 49
1
4 9 16 25 36 49 64
1
4 9 16 25 36 49 64 81
القائمة خالية و لكن
العدد Y=1
و يتم تربيعه و وضعه
آخر القائمة - القائمة لا تحتوى سوى على 1 -
ثم يضاف على العدد قيمة Y
واحد و ينادى الإجراء نفسه
و هنا اصبح قيمة Y=2
فيتم تربيعه و وضعه في
آخر القائمة التي تحتوى الآن على عنصران و
هكذا حتى يصبح العدد
Y=11
هنا يتوقف الإجراء عن التنفيذ .
*-
استبدل LPUT
بـFPUT في
الإجراء ALIST1
*-
أحيانا نرغب في معرفة
عدد عناصر القائمة أو استخراج
عنصر بترتيب معين من القائمة . فكيف
يتم ذلك ؟
7- هـ الأولية COUNT:
و تستخدم لمعرفة عدد
المفردات بالقائمة و فيما يلي
أمثلة :
pr count [80 60 40 1 5 7]
عدد
عناصر القائمة هو ستة لذا تطبع العدد
6 يمكننا أيضا أن
نطبع عدد حروف كلمة
PR COUNT "MAHMOUD
7
أما القائمة فتطبع
عدد عناصرها :
PR
COUNT [[DR ][MAHMOUD][BADR]]
3
*- تعلمنا حتى الآن
استخراج العنصر الأول بالأولية
FIRST
والعنصر الأخير في القائمة
بالأوليـة LAST
، فهل يمكن استخراج آي مفردة ؟
7- و الأولية ITEM
:
تساعدنا الأولية ITEM
على استخراج عنصر بترتيب معين
أو حرف بترتيب معين في
كلمة و مثال ذلك :
PR
ITEM 3 "MAHMOUD
H
[OF] [EGYPT]] [CAPITAL]
PR ITEM 3[[CAIRO] [IS]
CAPITAL
و إذا ما كان رقم
المفردة المستخرجة أكبر من عدد
مفردات القائمة فترد اللوجو برسالة خطأ و
مثال ذلك
PR ITEM 7[[CAIRO] [IS][OF] [EGYPT][CAPITAL] ]
ITEM doesn't like 7 as input
و تفيد بأن عدد
المفردات أقل من رقم المفـردة
المطلوبة .
7- ز -اختيار
المفردات عشوائيا :
تمكننا الأولية RANDOM
n
من اختيار عدد عشوائي
محصور
بين صفر و n-1
و هذا يجنبنا رسالة الخطـأ
السابقة إذا ما طلبنا مفردة رقمها أكبر من
عدد مفردات القائمة ، ولكن لا يساعد
بالطبع على استخراج مفردة
معينة و فيما يلي أمثلة توضح ذلك :
PR
RANDOM 100
59
PR
RANDOM 18
5
و لكن لاحظ أن
الأولية RANDOM
n
تختار عدد أقل من n
و بالتالي لن تختار العدد n
أبدا، ولكن يمكنـك أن تصحح
الأمر جزئيا بأن تضيف احتمال اختياره بالصيغة
التالية :
RANDOM n+1
حيث n
تشير إلى عدد مفردات القائمة .
الآن تأمل الإجراء
التالي :
TO UNIVERSITY
MAKE "LIST [[BENHA][ZAGAZIG][EIN SCHAMES]
[CAIRO]]
PR ITEM (1+RANDOM COUNT :LIST) :LIST
END
الآن نفذ الإجراء UNIVERSITY:
UNIVERSITY
ZAGAZIG
مناقشة
:
1-
أعط
مثلا تعطى فيه الأوليتان SE
و LIST
تخرجا نتائج مختلفة .
2-
اكتب
إجراء يحسب قيمة Y
و يطبع الرسالة التالية:
3-
THE AVERAGE OF Y IS 50 %
4-
هل
يمكن للأولية FPUT
تضع قوائم و كلمات داخل القائمة .
5-
هل
يمكن للأولية COUNT
أن تحسب عدد أرقام عدد وعدد حروف كلمة ؟ اذكر
مثال .
6-
هل
يمكن للأولية ITEM
أن تخرج رقم من عدد و حرف من كلمة ؟
7-
ماذا
ينتج من تنفيذ السطر التالي :
8-
PR PRODUCT COUNT :LIST ITEM 4 :LIST
9-
حيث
القائمة هي :
[BB
6 T 9 HE6I]
أسئلة
تمهيدية :
أ-
كيف يمكنك التعرف على المتغيرات الشاملة
الموجودة في الذاكرة
؟ و كيف يمكنك التخلص مما
لا ترغب من تلك المتغيرات ؟
ب-
كيف يمكنك التخلص من كل المتغيرات الشاملة
الموجودة بالذاكرة دفعة واحدة ؟
جـ
كيف يمكن الاستعلام عن وجود اسم متغير معين
بالذاكرة ، و تنفيذ عملية مشروطة؟
8- الاستعلام
عن الكلمات :
تزودنا لوجو
مايكروسوفت بالأمر wordp
الذي يخرج كلمة true
إذا كان المدخل كلمة ، و يخرج كلمة False
إذا لم يكن المدخل كلمة .
Show
Wordp "ahmed
true
Show
Wordp 1
True
Show
Wordp []
False
9-
الاستعلام عن القوائم :
يمكنك
الاستعلام عن القوائم بالأمر listp
، فيخرج كلمة true
إذا كان المدخل قائمة ، ويخرج كلمة false
إذا لم يكن المدخل قائمة .
Show listp "ahmed
False
Show listp 1
False
Show listp []
True
10- الاستعلام
عن الأعداد :
الأمر
numberp
يخرج كلمة true
إذا كان المدخل عدد ، ويخرج كلمة false
إذا كان المدخل غير ذلك .
show numberp "10
true
show numberp "a
false
show numberp [10]
false

|