دورة جافا: الطريق لإحتراف البرمجة من الصفر

 

7. الجمل في لغة البرمجة جافا

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

كيفية بناء هذه الجمل وما هي وما معنى الجمل الشرطية والحلقات، كل هذا سنراه بإذن الله في هذا الدرس بالتفصيل.

 

-- الجمل البسيطة

-- الجمل المركبة

-- الجمل الشرطية

-- الحلقات

-- إضافة : continue و-break في الحلقات

 

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

statements

 

أنواع هاته الجمل في لغة الجافا هي أربعة، الجمل البسيطة، وهي الجمل التي تحتوي على أمر بسيط معين، الجمل المركبة هي الجمل التي تتكون من أكثر من أمر واحد وتكون بين الحاصرتان ( {} )، الجمل الشرطية وهي الجمل التي تنفذ فقط عند تحقق شرط ما، وهي if و if-else وجملة switch. 

النوع الأخير هي الحلقات ولها مبدأ واحد وهو : تنفيذ أمر ما إلى حين عدم تحقق شرط معين! مثال : ما دام i أصغر من 10 إطبع جميع الأعداد أصغر منه. في الأمثلة تحت سنفصل بإذن الله أكثر.

 

 1.7 الجمل البسيطة

الجمل البسيطة في لغة البرمجة جافا تتكون من أوامر بسيطة كإسناد أو تهيئة للقيم أو إستدعاء للوظائف،وما يميزها هو أنها يتم تنفيذها في قطعة واحدة.

مثال تهيئة وإسناد القيم :

Value


فكما نرى يتم بناء هذه الجملة بنوع بيانات، متغير وبعد ذلك تهيئة هذا المتغير. ويجب عدم نسيان الفاصلة المنقوطة في أخر هذه الجمل !!! وهذه أمثلة لأكواد من هذا النوع وكذلك لكيفية إستدعاء وظيفة من كلاس ( كالوظيفة isnan.Yanam )


public class statement {
    public static void main(String[] args) {

        System.out.println("ahlan wa sahlan!");
        int i = 4;         // تهيئة قيمة
        i = 6;             // إسناد قيمة
        double a = 16.7;
        insan.Yanam();   // Method
    }
}

 2.7 الجمل المركبة 

وهي كما جاء في الوصف في أول هذه الفقرة هي الجمل المتكونة من أكثر من أمر ومحصورة بين الحاصرتان.

مبدأ هذا النوع هو جمع عدد من الأوامر بين الحاصرتان من أجل تلخيصها، وتكوين جملة مركبة، والتي عادةً ما نجدها في تركيب الوظائف أو وسط الجمل الشرطية، إذا لاحظنا ملاحظة بسيطة في الكود الذي كتبناه على الجمل البسيطة سنكتشف جملة مركبة!

قلنا في درس أول الخطوات في جافا أن البرنامج يحتوي على كلاسات عديدة أو كلاس واحدة وكل كلاس تحتوي على وظائف عديدة أو وظيفة واحدة. والكلاس التي انشأناها اسمها statement وتحتوي على وظيفة رئيسية اسمها main وإن دققنا النظر سنرى أن هذه الوظيفة تبدأ من الحاصرة الثانية : ( } ) وتنتهي عند الحاصرة الثالتة ( { ) وكل ما بين هاتين الحاصرتين يعتبر جملة مركبة!

إذاً يمكننا أن نقول أن الجمل المركبة ما هي إلا مجموعة من الجمل البسيطة!

morakaba

3.7 الجمل الشرطية

 نأتي لنوع مهم من أنواع الجمل في لغة البرمجة جافا وهو نوع الجمل الشرطية التي تمثل جزء ربما تجده في أي برنامج مكتوب بلغة جافا!  

الجمل الشرطية تنفذ فقط عند تحقق شرط معين، فكأنما نقول للمترجم : إذا تحقق هذا الشرط نفذ هذه الجملة، وإلا لا تنفذها. يعني أن هذه الجمل تبقى متجاهلة من طرف المترجم إن لم يتحقق شرطها. كما يمكن إضافة جملة يمكن تنفيذها عند عدم تحقق الشرط الأول هذه الحالة تعرف ب-if else. إذاً مبدأ هذه الجمل هو كالتالي :

if-statement

جافا تقدم ثلاث جمل من هذه الجمل الشرطية الجملة if، الجملة if else، والجملة switch.

 

1.3.7 جملة if

جملة if هي أبسط الجمل الشرطية فهي تحتوي على شرط، عند تحققه ينفذ أمر معين. تركيبتها كالتالي :


if (الشرط)
 الأمر;
// مثال
public static void main(String[] args) {
        int age = 20;
        if (age >= 18)
            System.out.println("you are an Adult");
    }

 في هذا المثال نرى أن جملة if تتكون من شرط وأمر، وفي المثال نسأل إن كان العمر أكبر من أو يساوي 18، في هذه الحالة العمر يساوي 20, إذاً الشرط محقق سيتم طباعة أن الشخص بالغ أو راشد، إن لم يتحقق الشرط ( مثلاً إن قمنا بإسناد قيمة 17 للمتغير age ) فسوف يتجاهل المترجم الجملة ولن ينفذ الأمر.

 

2.3.7 جملة if else

if else ما هي إلا إمتداد لجملة if. ففي هذه الأخيرة لا نتطرق لما سيحصل إن كان عمر المستخدم مثلاً 17 سنة، وبهذا لن يحصل أي شيء إن لم يتحقق شرط عمر المستخدم أكبر من أو يساوي 18! هذه الحالة تعالجها if else فكانما تقول للمترجم :

نفذ أمر طباعة "أنت شخص بالغ" في حالة كان عمر هذا الشخص أكبر من أو يساوي 18، أما إن لم يكن فنفذ أم أخر!

المثال التالي يوضح أكثر :


public class IfElseStatement {
    public static void main(String[] args) {

        int age = 17;

        if (age >= 18)
            System.out.println("you are an Adult!");

        else
            System.out.println("you are still young!");
    }
}

 في هذا المثال نرى كيف تم معالجة حالة إن كان الشرط غير محقق، إذاً ف-if else هي عبارة عن إمتداد ل-if 

في جافا يمكنك أن تذهب أكثر من هذا! فهي تقدم لك إمتداد أخر وهو else if، بهذه الجملة يمكنك تخصيص مجال الشروط أكثر فمثلاً يمكنك إضافة : (else if(age <= 18 && age >= 13

فهنا مثلاً نعالج حالة معينة وهي عندما يكون عمر المستخدم ما بين 12 سنة و-18 سنة وهي مرحلة المراهقة ( أنا لست أخصائياً في المجال النفسي أو السوسيولوجي لتحديد عمر المراهقة لكن هذه الأرقام هي فقط أمثلة ) ونحيي هذه الشريحة من الأشخاص بتحية أهلاً بك يا مراهق.


public class IfElseStatement {
    public static void main(String[] args) {

        int age = 15;
        if (age >= 18)
            System.out.println("you are an Adult!");

        else if(age <= 18 && age >= 12)
            System.out.println("ahlan teenager!");

        else
            System.out.println("you are still young!");
    }
}

 في هذا البرنامج ستطبع كلمة : ahlan teenager لماذا ؟ لأن المترجم سيأخد بعين الإعتبار فقط حالة else if عندما يكون عمر المستخدم 15.

ملاحظة : يمكن إستبدال جملة else if بجملة if فقط وسيشتغل البرنامج بشكل عادي. فقط من أجل الوضوح ( ربما! ) نستعمل else if.

 

3.3.7 جملة switch

دعنا نتعمق بعض الشيء ونكتب برنامج متكامل يربط الأعداد بالأيام، فمثلاً سنطلب من المستخدم إدخال رقم ما بين 1 و 7 ( وهي عدد أيام الأسبوع ) بعد ذلك سنربط هذه الأعداد بالأيام، فكمثال إن قام بإدخال العدد 1 فسنقوم بطباعة " يوم الإثنين "، 2 " يوم الثلاثاء " .. وهكذا.

كل ما نحتاجه في هذا الدرس قد رأيناه مسبقاً، لهذا يجب أن تعلم جيداً أنك الأن لك القدرة على كتابة هذا البرنامج بأكمله بمفردك!

أرجوك حاول بالمساعدة التالية أن تكتب برنامجك بنفسك : 

-- تركيبة أو بنية جملة switch هي على الشكل التالي :


public class SwitchStatement
{
    public static void main(String args[]){
        int number = 0;
        // يجب أن نبرمج كيفية الطلب من المستخدم إدخال عدد
        // ...
        
        switch(number)
        {
        case 1:
            System.out.println("alyawm howa : Monday!");
            break;
        case 2:
            // ...
            // ...
            
        default:
            System.out.println("min fadlik give a number!");
        }
    }
}

-- المرجو الرجوع لدرس قراءة سطر الإدخال في الجافا لأنه مهم ومهم جداً!!! فبمساعدته يمكننا برمجة طريقة إدخال المستخدم للأعداد.

الأن ما عليك إلا المباشرة بالبرمجة! فكل ما تحتاجه أخدتة.

 

لمشاهدة الحل :

{slide=إضغط علي لترى الحل }


import java.util.Scanner;
public class SwitchStatement
{
    public static void main(String args[]){
        
        int number = 0;
        Scanner input = new Scanner(System.in);
        System.out.println("please give a number between 1 and 7 : ");
        number = input.nextInt();
        input.close();
        
        switch(number)
        {
        case 1:
            System.out.println("alyawm howa : Monday!");
            break;
        case 2:
            System.out.println("alyawm howa : Tuesday!");
            break;
        case 3:
            System.out.println("alyawm howa : Wednesday!");
            break;
        case 4:
            System.out.println("alyawm howa : Thursday!");
            break;
        case 5:
            System.out.println("alyawm howa : Friday!");
            break;
        case 6:
            System.out.println("alyawm howa : Saturday!");
            break;
        case 7:    
            System.out.println("alyawm howa : Sunday!");
            break;
        default:
            System.out.println("Please give no String or a number not between 1 and 7!");
        }
    }
}

{/slide}

جملة switch تتكون من ثلاث أجزاء مهمة الجزء switch وبينه نكتب المتغير، الجزء الثاني هو case وهي تماماً كالشرط الذي يوجد بداخل if، والجزء الثالث هو break، وبهذا الأمر نقوم بمعالجة كل حالة لوحدها وفي الأخير فقط الخروج من هذه الحالة وذلك لمعالجة حالة أخرى.

هناك جزء أخر هو default وهو مقابل else وينفذ عند عدم تحقق أي شرط من الشروط، في المثال السابق، عند إدخال المستخدم رقم 10 فلن يجد المترجم هذه الحالة معالجة لذلك يذهب مباشرةً ل-default ويقوم بتنفيذها.

 

 4.3.7 Dangling else

مشكل dangling else يقع عندما تحاول كتابة جملة if متبوعة بجملة if أخرى وبعد ذلك تكتب جملة else على أنها تنتمي ل-if الأولى! وهذا كله بدون أقواس! كالمثال التالي :


public class DanglingElse
{
    public static void main(String args[]){
        int a = 0;
        int b = 0;
        if (a == 0)
            if(b == 0)
                a = 1;
        else
            b = 1;
    }
}

المترجم سيعطي إنتماء else ل-if الأخيرة، وهذا خطأ (فليس هذا ما أردت برمجته!) . ويمكنك التحقق من ذلك على برنامج اكليبس وذلك بتحديد الكود بأكمله والضغط (على الويندوز : ctrl + i، على الماك : cmd + i ) فسترى أن اكليبس قد أزاح جملة else لتكون في صف واحد مع ال-if الأخيرة.

كما يمكن أن تعتقد أنك عند تنفيذ البرنامج وإعطاء a مخالفة لصفر، فإن النتيجة ستكون b = 1 ! وهذا لن يقع إلى حين أن تعطي قيمة مخالفة ل-b. 

المشكل يمكن التغلب عليه بإضافة الأقواس الضرورية على الشكل التالي :


public class DanglingElse
{
    public static void main(String args[]){
        int a = 0;
        int b = 0;
        if (a == 0)
        {
            if(b == 0)
                a = 1;
        }
        
        else
            b = 1;
    }
}

ما يمكنني أن انصح به هو عند برمجة الجمل الشرطية يجب دائماً كتابة أوامر هاته الجمل بين الحاصرتان ( {} ) وذلك لتجنب مشكل dangling else. كما لا يجب الإستخفاف بالمشكل.

 

4.7 الحلقات 

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

جافا تعريف ثلاث أنواع من الحلقات : حلقة while، حلقة do while وحلقة for.

 

1.4.7 حلقة while

حلقة while وكما ترجمتها للغة العربية فمعناها ما دام أو طالما.. فلها شرط وأمر، وهذا الأخير يكرر إلى حين عدم تحقق الشرط.

هذه الحلقة بنيتها على الشكل التالي :

While

مثال : البرنامج التالي يقوم بطباعة الأعداد أصغر من 100 وعند وصوله للعدد 100 يقوم بطباعة "intahayna" :


public class OneToHundred
{
    public static void main(String args[]){
        {
            int i = 1;                                                       
            while (i <= 100) {   
                System.out.println (i);       
                i++;                          
            }
            System.out.println ("intahayna!");
        }
    }
}

2.4.7 حلقة do while

 حلقة do while هي نفسها حلقة while بكتابة مختلفة مع إختلاف واحد وهو أن do while يتم تنفيذها على الأقل مرة واحدة، حتى وإن لم يتحقق الشرط! للتأكد من ذلك قمنا بكتابة نفس البرنامج السابق بطريقة do while ولكن هذه المرة قمنا بتهيئة المتغير i ب-101، النتيجة كنت هي :

101

intahayna

أما في البرنامج الأول ( فقط ب-while ) عندما قمنا بتهيئة المتغير ب-101 حصلنا على النتيجة التالية :

intahayna

 DoWhile

إذاً الفرق ما بين while و-do while هو أن الأولى تنفذ فقط عند تحقق الشرط فعلاً، بينما الثانية، do while، تنفذ على الأقل مرة واحدة وذلك لوجود الشرط في أخر هذه الجملة، ولأن المترجم يقوم بتنفيذ البرنامج من الفوق للتحت ( كيف يلاحظ ويترجم المترجم الكود هو ليس معروف أو واضح لكن الظاهر أنه من الفوق للتحت ) فإنه يعطي i قيمته وينفذ البرنامج وفي أخر الحلقة يلاحظ أن هناك شرط فيقف الترجمة ويخرج من الحلقة :


public class OneToHundred
{
    public static void main(String args[]){
        {
            int i = 101;     
            do
            {   
                System.out.println (i);       
                i++;                          
            }
            while (i <= 100);
            System.out.println ("intahayna!");
        }
    }
}

وكما قيل فإن النتيجة ستكون 101. 

ملاحظة مهمة جداً !!!!!!!! : في حلقة do while لابد من كتابة while خارج الحاصرتان ( {} ) وفي أخر جملة while لابد من عدة نسيان الفاصلة المنقوطة ( ; )

 

3.4.7 حلقة for

 جميع الحلقات وكما ذكرنا في أول هذا الدرس لها نفس الدور وهو تكرار تنفيذ أمر معين إلى حين عدم تحقق الشرط. والحلقة for هي ليست إستثناء في هذه المجموعة.

بنية حلقة for هي كالتالي :

for-loop 

 -- تهيئة أو إسناد المتغير : تهيئة المتغيرات واسنادها تم التحدث عنها بشكل كافي في درس أنواع البيانات والمتغيرات، ومعناها حجز قيمة بدئية في الذاكرة للمتغير، أو اعطاؤه قيمة جديدة.

 -- الشرط : هنا الشرط الذي يجب أن يؤخد بعين الإعتبار عند تكرار الأمر. فعند عدم تحققه يغادر المترجم الحلقة.

-- التحديث : التحديث يمكنك أن تجده في جميع الحلقات، فهو ليس حكرا على for فقط! وهو يقوم بتحديث للجمل أو الأوامر التي بين الحاصرتان.

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

public class ForLoop
{
    public static void main(String args[]){
        int i;
        for (i=0; i<10; i++) {
            System.out.println (i);
        }
    }
}

كما نرى في هذا المثال، المتغير تم تهيئته في الأول ب i = 0، الشرط هنا هو أن i يجب أن تكون أصغر قطعاً من 10، وأما التحديث هنا هو إضافة 1 في كل حلقة ( يعني في المرة الأولى يدخل ب-i =0 ليطبع لنا العدد 0، ويرفع i ب-1 ثم يدخل مرة أخرى ويطبع 1 ويرفع i ب-1، يطبع إثنين... وهكذا ).

 

5.7 إضافة : continue و-break في الحلقات

 

break 1.5.7 

break موجودة في كل من while -do ،while و-for، وعندما يصل المترجم لهذه الجملة فإنه يغادر الحلقة مباشرةً، كما لها إمتداد أخر ويمكن تخصيصها أكثر، كأن تبرمجها عند جملة معينة أو أمر في الحلقة وعند وصول المترجم لهذه الجملة، يغادرها فقط.

لنلاحظ المثال التالي :


public class BreakState
{
    public static void main(String args[]){
        int i;
        for (i=0; i<10; i++)
        {
            System.out.print(" " + i);
            if(i==4) break;
        }
    }
}

في المثال قمنا ببرمجة حلقة for عادية! نقول فيها كلما كان i أصغر قطعاً من 10 يجب عليه طباعة العدد.. يعني 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. لكن وبعد جملة الطباعة قمنا بإضافة حلقة if لنقول للمترجم إنتبه! أنا لا أريدك أن تطبع لي كل الأعداد، ولكن عند وصول i للعدد 4 يجب عليك مغادرة الحلقة! وطباعة النتيجة.

 

2.5.7 continue

هذه الجملة تسبب إعادة تنفيذ الحلقة مرة أخرى، أو أنها تتخطى قيمة معينة لتمكن المترجم من إكمال تنفيذه للبرنامج وتجاهل هذه القيمة المعينة.

وهذا المثال يوضح ذلك بطريقة جميلة وواضحة، وهو يحسب مقلوب الأعداد فمثلاً إن اعطيناه رقم 5 فسيحسب مقلوبه على الشكل التالي : 1/5 وهكذا.. ولأن المشكلة في الكسر أن المقام لا يجب أن يكون 0، ولذلك اخترنا هذا المثال لينتمكن من تخطي الصفر.

المثال :


public class ContiStatement
{
    public static void main(String args[]) {
        double i;
        for (i=-5.; i<=5.; i++) {
            if(i==0.) continue;
            System.out.println("The inverse is : " + 1./i);
        }
    }
}

 إذاً وكما نرى فإن المترجم قد تخطى الرقم 0.

 

درسنا قد إنتهى، الدرس القادم سيأخدنا مباشرةً للبرمجة الغرضية التوجه.