• 0
مصطفى 36a2

انتقل من ++C إلى جافا بسلاسة

سؤال

السلام عليكم ورحمة الله وبركاته 
بداية : هذا المقال موجّه لمن لديه معرفة مسبقة متوسطة في لغة ++C
الفكرة من هذا المقال(والذي قد يتبع بمقالات أخرى إن شاء الله تعالى )
هو توفير الوقت اللازم لتعلم لغة جافا انطلاقا من معرفتك المسبقة بلغة ++C
لا يمكنني الجزم بأن أي لغة أخرى تعلمتها مسبقاً ستمكنك من قراءة هذا المقال مع الفهم لكل الجزئيات ولكن هذا وارد بنسبة تفوق 70%

 

 

لنبدأ على بركة الله :
برنامج بسيط .. وطباعة Hello World :)
في لغة جافا يجب تغليف كل شيء ضمن صف class ... حتى البرنامج الرئيسي يجب أن يكون ضمن صف 
وصف البرنامج الرئيسي يجب ان يحمل نفس اسم الملف الرئيسي ذو اللاحقة java
وبذلك ستجد أي برنامج جافا يحتوي 
public class FileName { }
 
الدالة الرئيسية اسمها main  تحديداً ويبحث عنها البرنامج الذي سينفذ الكود ليبدأ ...
ولكن لا يكفي أن نكتب القيمة المعادة قبلها void مثلاً
يجب تحديد محددات الرؤية public ويجب تعريفها كstatic  ..
كما أنها يجب أن تأخذ وسيط سلسلة نصية String[]ParamName
هذا قد يزعج المبرمجين المتعودين على حرية main()وفقط في ++C  ...
إذا ستجد في كل برامج جافا الكود التالي :
public class FileName {public static void main(String[]StringName) { }}
الآن يمكننا البدء ببرنامجنا الأول ..
الكائن System  يحتوي (من ضمن الامور الكثيرة التي يحتويها) على أغراض ودوال التعامل مع الخرج
من هذه الأغراض objects الغرض out وهو دفق stream الخرج المعياري standard اي الconsole
وبذلك لطباعة أي عبارة او متحول ..  نستعمل 
System.out.print(X);
يوجد تابعان رئيسيان للطباعة print لطباعة المحتوى بشكل طبيعي println يطبع محرف نهاية السطر print line
ومن العمليات الأساسية في لغة جافا عملية سلسلسة السلاسل :D ..أقصد concatenation  وتتم بربط السلاسل ب + 
وكذلك يمكننا ربط سلسلة مع رقم بالعملية + ..
هل تحمست للبدء ؟
يمكنك نحميل بيئة جافا Eclipse من هنا ... اختر Eclipse IDE for Java EE Developers,
ويُفضل أن تتبع الtutorial الموجود فيها لمعرفة كيف تنشئ مشروعا جديدا ..
برنامجنا البسيط :
public class HelloWorld {public static void main(String[]s) {int x=0x36a2;System.out.println("Hello World!"+x);}}
سنضيف الآن تابع الدخل ... وهو عمليّا كائن(غرض) من نوع Scanner
ويحتاج في الباني(constructor) إلى وسيط هو دفق Stream الدخل
في لغة جافا لا يوجد مؤشرات ... كما أن الحجز للكائنات دائما يتم بطريقة ديناميكية باستخدام new
بذلك يكون إنشاء الكائن كما يلي:
static Scanner sc = new Scanner(System.in); 
الصف Scanner هو صف غير عام ... يحتاج إلى جلب محتواه من الحزمة التالية
java.util.Scanner كما نجلب محتوى مكتبة بواسطة #include
وذلك باستخدام التعليمة import
وبذلك نضيف الكود التالي في رأس البرنامج 
import java.util.Scanner;
والآن ... كيف نجلب المحتوى من الدخل ونخزنه في متحول ؟ 
سيكون هذا باستخدام توابع (طرق methods(الكائن الذي أنشأناه من الصف Scanner
بعض الأمثلة :
int a=sc.nextInt();byte b=sc.nextByte();double c=sc.nextDouble();float d=sc.nextFloat();System.out.println(a+b+c+d);
المثال السابق سيطبع مجموع الأرقام ... أما إذا أردنا أن يقوم ب concatenation :
int a=sc.nextInt();byte b=sc.nextByte();double c=sc.nextDouble();float d=sc.nextFloat();System.out.println(""+a+b+c+d);
البرنامج التالي سيأخذ طول الضلعين القائمين في مثلث ويطبع طول
import java.util.Scanner;public class Tutorial {static Scanner sc = new Scanner(System.in); public static void main(String[]s) {double c=sc.nextDouble();double d=sc.nextDouble();System.out.print("\n"+Math.sqrt(c*c+d*d)+"\n");}}
لاحظ استخدام الطريقة sqrt من الصف Math دون انشاء كائن من math وذلك لأنه صف مجرد يسمح باستخدام توابعه دون انشاء كائن منه
لتعريف مصفوفة نستخدم التركيب النحوي التالي 
byte[]b;byte[]c={1,2,113,54,4};
في جافا لا تتم عمليات التحويل بين الانماط بهذه السهولة فمثلاً
byte[]d={1,2,113,541,4};
سيتسبب في خطأ تحويل بين الأنواع... 
هذا قد يبدو غبياً لمبرمجي ++C ولكن بصراحة هذا هو الترتيب والأناقة التي يتحدث عنها جماعة java
لكن ما سيزعجك فعلاً هو أن جملة شرطية مثل
if(1){}
ستسبب خطأ ... عدم القدرة على التحويل من int إلى boolean :P
________________________________________________________
بنى التحكم في سير البرنامج مماثلة تماماً لتلك في C باستثناء عبارة goto فهي غير موجودة 
وهذه بعض الأمثلة ..
byte[]b={1,2,113,54,4};for(int i=0;i<5;i++)System.out.println(b[i]);for(int i=0;i<5;System.out.println(b[i++]))break;int i=0;while(i<10)System.out.print("HI"+i++);do{System.out.println("GO");i++;continue;}while(i<15);if(i<20){System.out.print("الحمد لله");}else{System.out.print("بفضل الله");}
قد تجد أنه من المثير إمكانية كتابة النص باللغة العربية :)
 
إذا انظر إلى هذا :D

ملاحظة : انسخه والصقه في eclipse فهو لا يظهر جيدا هنا.

int متحول=4;System.out.println(متحول);
نكتفي بهذا القدر لليوم ... أرجو أن يكون المقال مفيداً ... وأسأل الله أن يوفقني للمزيد
والله ولي التوفيق
تم تعديل بواسطه مصطفى 36a2
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0




السلام عليكم ورحمة الله وبركاته

في جافا يمكننا تعريف توابع خاصة بنا لتقوم بـجزء من العمل بشكل مستقل

نقوم بتعريف التابع كما يلي في داخل class الرئيسي والذي يحمل اسم الملف



public static void main(String[]a)//the main method 
{
 
}
public static void function()//new method
{
 
}


لا يتطلب استدعاء التابع أن يكون معرّفاً قبل موضع استدعائه كما في لغة C يكفي أن يكون موجوداً !

ولاستدعائه كما العادة نكتب اسمه ونمرر وسطاءه بين قوسين



function();


والآن لنكتب بعض المحتوى في التابع .. رأينا في المقال السابق أنه لتعريف سلسلة نصية نكتب



String S;


لاحظ أن كلمة String تبدأ بحرف كبير ... وفي java هذا يعني بأن هذا صف class وليس نوعاً عادياً مثل int

ولذلك .. فإن  S يعتبر كائنا وليس متحولاً .... كائن له توابعه وأغراضه

ومن هذه التوابع ...



S.equals(AnotherStringTocompare);


وهو تابع boolean يعيد true عند تساوي السلسلتين النصيتين تماماً ... وfalse عدا ذلك

هذا برنامج ..يعطي مثالاً على إنشاء تابع واستدعائه ..واستخدام التابع equals

 



import java.util.Scanner;
public class Second {
static Scanner S=new Scanner(System.in);
public static void main(String[]a)
{
function();
}
public static void function()
{
String a=S.nextLine();
if(a.equals("السلام عليكم"))
{
System.out.println("وعليكم السلام");
}
else
{
System.out.println("Hello!");
}
}
}


ختاماً ... انظر إلى قطعة الكود هذه ما أجملها :)



System.out.println("0x36a2".equals("0x36a2"));





تم تعديل بواسطه مصطفى 36a2
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هذه الفقرة تتحدث عن العمليات Operators ... وهنا ننبه اخوتنا جماعة php  وpython  إلى وجود بعض التعليمات الجديدة عليهم ... 
العمليات في جافا مماثلة تماماً لتلك في C  مع اضافات محدودة ... كما أنه لا يمكن استخدام ! مع النوع int كما ذكرنا ..فهي عملية بوليانية boolean

في هذا الكود أمثلة على بعض العمليات في جافا ...والمطابقة لاستعمالها في C ... 
 

public class Second { 	public static void main(String[]a)	{			function(14);				}	public static void function(int  a)	{		System.out.println(a+"<<1=\t"+(a<<1));//shifting left		System.out.println(a+"*2=\t"+(a*2));//multiplication				System.out.println(a+">>1=\t"+(a>>1));//shifting right		System.out.println(a+"/2=\t"+(a/2));//division                System.out.println(a+"%5=\t"+(a%5));//modulation				System.out.println(a+"+2=\t"+(a+2));//summation		System.out.println(a+"-2=\t"+(a-2));//subtraction				System.out.println(a+"^5=\t"+(a^5));//logical xor		System.out.println(a+"|5=\t"+(a|5));//logical or		System.out.println(a+"&5=\t"+(a&5));//logical and				System.out.println("~"+a+"=\t"+~a);//logical not		System.out.println("-"+a+"=\t"+(-a));//unary minus	}}

الكود السابق سيطبع ما يلي :

 

14<<1= 2814*2= 2814>>1= 714/2= 714+2= 1614-2= 1214^5= 1114|5= 1514&5= 4~14= -15-14= -14

هناك عملية ازاحة نحو اليمين في جافا <<< تقوم بإزاحة البتات كلها حتى بت الإشارة وتملأ أصفارا على اليسار ...بينما تقوم العملية << بإزاحة البتات ما عدا بت الإشارة ... (هذا ما يحدث في C بالنسبة للعملية <<   )
ولا ننسى التعليمة الثلاثية الرائعة ؟  : ... سترى مثالً عنها في نهاية هذه الفقرة :)
تعليمات الإسناد أيضاً مماثلة لها في C :
 

= += -= *= /= %= &= ^= |= <<= >>= >>>=

ولا ننسى طبعاً عمليتي الزيادة بواحد والانقاص بواحد ... وهما تماماً مثل C  .. ويوجد postfix و prefix   .. .
 

postfix :    expr++ exp--prefix  :    ++expr --expr

وطبعا تعليمات المقارنة المنطقية ... والعمليات المنطقية مطابقة لها في C.. مع وجود اختلاف( هناك عملية في جافا تسمى instanceof ..عملية منطقية تعيد true|false .)
 

< > <= >= instanceof == !=(logical AND)  &&(logical OR)   ||

تختبر التعليمة instanceof فيما اذا كان الوسيط الايسر من النوع المذكور على الجانب الايمن للعملية ... وهي مفيدة جدا في حال استعمال الصفوف والوراثة .. باستخدامها يمكمما معرفة فيما اذا كان الكائن وريثاُ لنوع ما ...(نتطرق اليها لاحقا)
_______________________________________________________
أغفلنا في الفقرة السابقة بنية التحكم switch وهي مطابقة لتلك في C  (فلينتبه من تعود استخدام switch في php  فهي لا تقبل الا قيمة int وهناك محددات أخرى )
الكود التالي يبين استخدام switch  ويعطي مثالاً على تابع له قيمة معادة .. ويأخذ وسيطاً ... كما يوضح أن استخدام التوابع مماثل لاستخدامها في C
 

import java.util.Scanner;public class Second {	static Scanner S=new Scanner(System.in); 	public static void main(String[]a)	{			System.out.println(talk(S.nextLine()));				}	public static String talk(String in)	{		int x=in.length();		String out="What?";		switch(x)		{			case 1:out="O";break;			case 2:out="Hi";break;			case 3:out="Yes";break;			case 4:out="Good";break;			case 5:out="Please";break;			case 6:out="But why";break;		}		return out;	}}

قواعد switch مماثلة لها في C ...
كما تلاحظ اخي الكريم ... متابعة الاختلافات امر بسيط وييسر العملية التعليمية .... فمعظم اللغات متشابهة ,لذلك ساعد على نشر فكرة : تعلم C ويمكنك بعدها تعلم اي لغة برمجة من نفس المستوى ..

ختاماً انظر إلى روعة قطعة الكود التالية :

System.out.println(S.nextLine().equals("0x36a2")?"الحمد لله":"الشكر لله");
تم تعديل بواسطه مصطفى 36a2
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

تم تعديل بواسطه مصطفى 36a2
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أحسن الله إليك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وإياكم أخي أحمد ... أرجو أن يكون فيه فائدة ... وتوفير وقت على المتعلمين إن شاء الله .. 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

import java.util.Random;import java.math.BigInteger;public class Example {	public static void main(String[]args){		Random a=new Random();		System.out.println(a);		System.out.println(a.getClass());		System.out.println(a.nextInt());		int max =0x36a2;		System.out.println(a.nextInt(max));		System.out.println(a.nextGaussian());//White Noise in communication engineer				BigInteger x=new BigInteger("2");		System.out.println(x.pow(10000));//Don't open your mouth when see the output				String s=x.toString();		for(int i=0;i<s.length();i++)			System.out.print(s.charAt(i));//s is a string but we can use it like an array using charAr		System.out.println();				System.out.println(Integer.parseInt("1234")+1);	}}
تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله بك اخ مصطفى موضوع مفيد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .