تمرينات

تمرين 7.1
كود:
public static void main (String[] args) {
  loop (10);
}
 
public static void loop (int n) {
  int i = n;
  while (i > 1) {
    System.out.println (i);
    if (i%2 == 0) {
      i = i/2;
    } else {
      i = i+1;
    }
  }
}
a. ارسم جدولاً يبين قيم المتغيرين i وn خلال تنفيذ الحلقة. يجب أن يحتوي الجدول على عمود واحد لكل متغير وسطر واحد لكل تكرار.
b. ما هو خرج هذا البرنامج؟

تمرين 7.2

لنقل أنك أعطيت رقماً، a، وأنك تريد معرفة جذره التربيعي. إحدى الطرق هي تخمين الناتج، x0، ثم تحسين ذلك التخمين باستخدام المعادلة التالية:
x1 = (x0 + a/x0 ) /2 (7.2)
مثلاً، إذا أردت معرفة الجذر التربيعي للعدد 9، وبدأت مع العدد x0 = 6، ثم
x1 = (6+ 9/6)/2 = 15/4 = 3.75 ، وهو أقرب إلى الجواب الصحيح.
يمكنك إعادة الإجراء نفسه، باستخدام x1 لحساب x2، وهكذا. في هذه الحالة، x2 = 3.075 و
x3 = 3.00091 . حيث يتقارب الرقم بسرعة إلى الإجابة الصحيحة (3).
اكتب عملية باسم squareRoot تأخذ عدداً من نوع double كمعامل وتعيد الجذر التربيعي التقريبي لذلك المعامل، باستخدام هذه الخوارزمية. لا يمكنك استخدام العملية الجاهزة Math.sqrt.
كما توقعتَ لأول وهلة، عليك استخدام a/2، عمليتك يجب أن تتكرر حتى تصل إلى عددين تقريبيين متتاليين يكون الاختلاف يبنهما أقل من 0.0001؛ بكلام آخر، حتى تصبح القيمة المطلقة لـ xn – xn-1 أقل من 0.0001. يمكنك استعمال العملية الجاهزة Math.abs لحساب القيمة المطلقة.

تمرين 7.3

في التمرين 6.9 كتبنا إصداراً تعاودياً من power، يأخذ عدداً عشرياً x وعدداً صحيحاً n ويعيد xn. الآن اكتب عملية تكرارية للقيام بنفس الحسبة.

تمرين 7.4

يقدم القسم 6.8 عملية تعاودية تحسب العاملي. اكتب إصداراً تكرارياً من factorial.

تمرين 7.5

إحدى طرق حساب ex هي استعمال السلسلة المنشورة اللانهائية
ex = 1 + x + x2/2! + x3/3! + x4/4! + ... (7.3)
إذا كان اسم متغير الحلقة اسمه i، عندئذ يكون العنصر رقم i مساوياً xi /i!.
a. اكتب عملية باسم myexp تجمع n من الحدود الأولى من السلسلة المبينة أعلاه. يمكنك استخدام عملية factorial من القسم 6.8 أو النسخة التكرارية التي كتبتها في التمرين السابق.
b. يمكنك جعل هذه العملية أكثر فاعلية إذا أدركت أنه في كل تكرار يكون بسط الحد هو نفس بسط الحد السابق مضروباً بـ x والمقام هو نفس المقام السابق مضروباً بـ i. استفد من هذه الملاحظة للتخلص من العمليتين Math.pow وfactorial، بعدئذ تأكد من أن النتيجة لاتزال نفسها.
c. اكتب عملية اسمها check تأخذ معامل وحيد، x، وتطبع قيم x، وMath.exp(x) وmyexp(x) لقيم مختلفة للمتغير x. يجب أن يبدو الخرج مشابهاً لما يلي:
1.0 2.708333333333333 2.718281828459045
مساعدة: يمكنك استخدام المحرف "\t" لطباعة علامة جدولة بين أعمدة الجدول.
d. غير عدد الحدود في السلسلة (المتحول الثاني الذي ترسله check إلى myexp) وانظر إلى تأثير ذلك على دقة النتيجة. اضبط هذه القيمة حتى تتوافق القيمة التقريبية مع الإجابة "الصحيحة" عندما يكون x يساوي 1.
e. اكتب حلقة في main تستدعي check مع القيمة 0.1، 1.0، 10.0 و100.0. كيف تتغير دقة النتيجة مع تغير قيمة x؟ قارن عدد الخانات المتوافقة بين القيم الحقيقية والمقدرة بدلاً من حساب الفرق بين القيمتين.
f. أضف حلقة في main تتحقق من العملية check مع القيم -0.1، -1.0، -10.0، و -100.0. ضع تعليقاً على الدقة.

تمرين 7.6

من الطرق الممكنة لحساب هو استخدام المنشور اللانهائي التالي
(7.4)
بكلام آخر، نحتاج لجمع سلسلة من الحدود حيث يعطى الحد رقم i بالصيغة . اكتب عملية باسم guess تأخذ x وn كمتحولات وتعيد مجموع n حد من الحدود الأولى من السلسلة. يجب عدم استخدام factorial أو pow.