الخوارزمياتالعوامل - التمرين السادس
المطلوب
أكتب برنامج لحساب قيمة المتغير S
النهائية.
إرشادات
إذا ركزت قليلاً في عمليات القسمة الظاهرة في الصورة فستجد أن ناتج عمليات القسمة سيكون في كل مرة على الأغلب يحتوي على فاصلة عشرية كالتالي:
1
, -0.5
, 0.33
, -0.25
, 0.2
.
- لذلك بما أننا ننوي تخزين ناتج عمليات قسمة في المتغير
S
فهذا يعني أنه يجب أن يكون معرف كـdouble
حتى لا نخسر أي رقم يحتوي على فاصلة عشرية يضاف عليه أو يطرح منه. - و بما أن قيمة العداد
i
ستدخل في كل عملية قسمة يتم إجراءها فهذا يعني أنه يجب أن يكون أيضاً معرف كـdouble
حتى لا نخسر أي رقم يحتوي على فاصلة عشرية ينتج عن عملية القسمة.
النتيجة المطلوبة
طريقة التحليل
- الرقم الموجود في الأعلى هو دائماً الرقم 1.
- الرقم الموجود في الأسفل يبدأ من 1 وصولاً إلى 100 و هو عبارة عن قيمة العداد المستخدم في الحلقة في كل دورة.
الخوارزمية
كود الجافا
public class Sum_Odd_And_Even_Numbers { public static void main (String[] args) { double S=0; for (double i=1; i <=100; i++) { if ( i%2 == 1) { S = S + (1/i); } else if ( i%2 == 0) { S = S - (1/i); } } System.out.print("S= " +S+ "\n"); } }
شرح الكود
double S=0;
- هنا قمنا بتعريف المتغير
S
لتخزين المجموع لذلك أعطيناه القيمة 0 كقيمة أولية.
for (double i=1; i <=100; i++) { if ( i%2 == 1) { S = S + (1/i); } else if ( i%2 == 0) { S = S - (1/i); } }
- هنا قمنا بإنشاء حلقة من 1 إلى 100 و في كل دورة تزيد قيمة العداد 1.
- في كل دورة يقوم البرنامج بفحص قيمة العداد
i
كالتالي:- يبدأ بالشرط الأول فيسأل نفسه, هل هي عدد مفرد؟
إذا كان الجواب نعم, سيتم زيادة (الناتج من قسمة 1 علىi
) على قيمةS
القديمة, ثم تخزين الناتج النهائي فيS
من جديد. - إذا لم تكن عدد مفرد ينتقل إلى الشرط الثاني, فيسأل نفسه: هل هي عدد مزدوج؟
إذا كان الجواب نعم, سيتم إنقاص (الناتج من قسمة 1 علىi
) من قيمةS
القديمة, ثم تخزين الناتج النهائي فيS
من جديد.
- يبدأ بالشرط الأول فيسأل نفسه, هل هي عدد مفرد؟
- ملاحظة: أيضاً في المنطق إذا لم يكن الرقم مفرد فإنه حتماً مزدوج.
إذاً كان بإمكاننا وضع جملةelse
بدل جملةelse if
.
في الواقع هنا يفضّل وضعelse
لكي لا تجعل الكمبيوتر يقوم بتحليل قيمة العداد ليعرف إذا كانت مزدوجة أم لا.
لأنها حتماً ستكون مزدوجة إذا قام بفحصها أولاً و لم يجدها مفردة. - إذا أردت أن يكون الكود ممتازاً فعليك كتابة البرنامج بهذه الطريقة:
public class Sum_Odd_And_Even_Numbers { public static void main (String[] args) { double S=0; for (double i=1; i <=100; i++) { if ( i%2 == 1) { S = S + (1/i); } else { S = S - (1/i); } } System.out.print("S= " +S+ "\n"); } }