
المتغيرات و أنواع البيانات في لغة دارت
طباعة البيانات على الشاشة, بإمكانك أن تُفكّر بأن في البرمجة تقوم بإخبار الحاسب بما تريده و سوف يقوم جهاز الكمبيوتر بتنفيذ كل ما تريده منه, على سبيل المثال نريد برنامج يأمر الحاسوب بأن يطبع كلمة “Programmer Tech” و يقوم الحاسوب بتنفيذ هذا الأمر و عرضه لك على الشاشة.
void main(){ print("Programmer Tech"); }
قمنا بكتابة الأمر print وهو أمر طباعة البيانات على الشاشة في دارت و من ثم فتحنا قوسين ‘()’ و وضعنا ما نريد طباعته يبن الأقواس و قمنا بوضع علامة ‘;’ في نهاية السطر.
المتغيرات في دارت DART VARIABLES
المتغير (Variable) هو مخزَن يستخدم للإشارة إلى موقع الذاكرة في ذاكرة الكمبيوتر الذي يحتوي على قيمة لهذا المتغير, و يمكن تغيير هذه القيمة أثناء تنفيذ البرنامج.
في لغة برمجة Dart، يتم استخدام المتغيرات لتخزين البيانات والقيم خلال تنفيذ البرنامج. يمكن تعريف المتغيرات باستخدام الكلمة الرئيسية “var”، والتي تسمح بتعيين أي نوع للمتغير تلقائيًا عند تعيين القيمة الأولية. هناك أيضًا كلمات رئيسية خاصة بأنواع المتغيرات المحددة مثل “int” و “double” و “String” و “bool” وغيرها.
عندما تنشئ متغير في لغة dart فهذا يعني أنك تخصص بعض المساحة في الذاكرة لهذا المتغير و يعتمد حجم كتلة الذاكرة المخصصة و نوع القيمة التي تحتوي عليها بشكل كامل على نوع المتغير.
كل شيء في dart عبارة عن كائن بما فيها أنواع البيانات الأساسية التي يتم اعتبارها في جافا, عندما نقوم بتهيئ أي كائن طالما لم يتم تعيين قيمة تكون القيمة الافتراضية خالية و هي أيضاً كائن.
إليك بعض الأمثلة على تعريف المتغيرات في Dart:
var x = 5; // تعريف متغير تلقائي بنوع int وقيمة 5 var name = 'John'; // تعريف متغير تلقائي بنوع String وقيمة 'John' int age = 25; // تعريف متغير من نوع int وتعيين قيمة محددة له double pi = 3.14; // تعريف متغير من نوع double وتعيين قيمة محددة له bool isActive = true; // تعريف متغير من نوع bool وتعيين قيمة محددة له // الأمثلة أعلاه هي فقط أمثلة لتوضيح الفكرة ويمكن تعريف المتغيرات بأسماء وقيم مختلفة حسب احتياجات البرنامج.
علاوة على ذلك، يمكن تعيين القيمة “null” للمتغيرات باستخدام علامة الاستفهام، مما يعني أن المتغير لا يحتوي على أي قيمة بشكل افتراضي:
int? nullableVariable = null; // تعريف متغير قابل للإلغاء بنوع int وقيمة null .
هذه بعض الأمثلة الأساسية لتعريف المتغيرات في لغة برمجة Dart. هناك المزيد من الأنواع والمفاهيم المتعلقة بالمتغيرات في Dart، ويمكن استكشافها للحصول على مزيد من المعرفة والفهم العميق للغة.
أنواع البيانات في دارت Dart Data Type
لغة برمجة Dart توفر العديد من أنواع البيانات المختلفة التي يمكن استخدامها في البرامج.عند إنشاء أي مُتغير في البرمجة فإنه يكون له نوع بيانات مرتبطة به, و في لغة دارت هناك أنواع من البيانات التي يمكننا إستخدامها و هي:
- الأعداد Numbers: تستخدم لتمثيل قيم عددية في لغة دارت و هي مقسومة لـ ثلاثة أنواع (int, double, num).
- النصوص Strings: هي سلسلة من الحروف التي يتم استخدامها في لغة دارت.
- قيم منطقية Boolean: تستخدم من أجل تمثيل القيم المنطقية و لها قيمتين منطقيتين فقط و هما (True) أو (False).
- القوائم Lists: القوائم في دارت شبيهة بالمصفوفات في لغات البرمجة الأخرى و يستخدم هذا النوع لتمثيل مجموعة من العناصر المرتبة.
- الخرائط Maps: شبية بالقواميس في بايثون و هو عبارة عن كائن يتم تخزين البيانات فيه على شكل زوج مفتاح و قيمة و ترتبط كل قيمة بمفتاح خاص بها و يتم استخدامها للوصول إلى قيمتها المقابلة.
أنواع الأعداد:
- int: يُستخدم لتمثيل الأعداد الصحيحة، مثل 1 و -10 و 100.
- double: يُستخدم لتمثيل الأعداد العشرية، مثل 3.14 و -0.5 و 2.71828.
نصوص وحروف:
- String: يُستخدم لتمثيل النصوص، مثل “Hello, World!” و “Dart is awesome!”.
- char: في Dart، لا توجد نوع محدد للحروف، بل يتم تمثيل الحروف كسلاسل نصية تحتوي على حرف واحد فقط.
قيم منطقية:
- bool: يُستخدم لتمثيل القيم المنطقية (الصحيح أو الخطأ)، إما true أو false.
أنواع البيانات المركبة:
- List: يتم استخدامه لتمثيل مجموعة مرتبة من القيم. قد تحتوي على قيم من أي نوع.
- Map: يتم استخدامه لتمثيل مجموعة من القيم المرتبطة بمفاتيح. يتم تعيين قيمة لكل مفتاح.
- Set: يتم استخدامه لتمثيل مجموعة فريدة من القيم، حيث لا يسمح بالقيم المتكررة.
أنواع البيانات الأخرى:
- dynamic: يتم استخدامه لتمثيل أي نوع، ويمكن تغيير نوع القيمة المخزنة فيه أثناء تنفيذ البرنامج.
- var: يتم استخدامه لتعريف المتغيرات وتحديد نوعها تلقائيًا بناءً على القيمة المعينة لها.
هذه هي بعض الأنواع الأساسية في لغة برمجة Dart. يمكن استخدامها لتعريف المتغيرات وتنظيم البيانات في البرامج بطرق مختلفة. بالإضافة إلى ذلك، يمكن للمطورين إنشاء أنواع بيانات مخصصة باستخدام التعريفات الخاصة بهم.
ما هي الفرق بين الـ List والـ Map في لغة برمجة Dart؟
الـ List والـ Map في لغة برمجة Dart هما نوعان مختلفان يستخدمان لتنظيم البيانات، ولكل منهما استخدامات وخصائص مختلفة. إليك الفرق بينهما:
List:
- الـ List يُستخدم لتمثيل مجموعة مرتبة من القيم.
- يُمكن تخزين القيم في الـ List بترتيب محدد، ويمكن الوصول إلى القيم بواسطة مؤشر الفهرس (index) الذي يبدأ من 0.
- يُمكن أيضًا إضافة وحذف العناصر من الـ List بسهولة باستخدام الدوال المتاحة مثل add() و remove().
مثال على الـ List:
List<int> numbers = [1, 2, 3, 4, 5]; .
Map:
- الـ Map يُستخدم لتمثيل مجموعة من القيم المرتبطة بمفاتيح.
- يتكون الـ Map من أزواج مفتاح/قيمة، حيث يتم تعيين قيمة لكل مفتاح.
- يمكن الوصول إلى القيم في الـ Map عن طريق المفتاح، وليس بواسطة مؤشر الفهرس.
- لا يسمح الـ Map بتكرار المفاتيح، وعند تعيين قيمة جديدة لمفتاح موجود، يتم تحديث القيمة الحالية.
مثال على الـ Map:
Map<String, int> studentScores = {'John': 90, 'Jane': 85, 'Alice': 95}; .
باختصار، الفرق الرئيسي بين الـ List والـ Map هو أن الـ List يُستخدم لتخزين مجموعة مرتبة من القيم، بينما يُستخدم الـ Map لتخزين مجموعة من القيم المرتبطة بمفاتيح. يعتمد اختيار النوع المناسب على طبيعة البيانات التي ترغب في تنظيمها والوصول إليها في برنامجك.
هل يمكن استخدام الـ Map لتخزين القيم بترتيب محدد؟
في لغة برمجة Dart، الـ Map لا يقوم بتخزين القيم بترتيب محدد. عند استخدام الـ Map، لا يتم ضمان ترتيب القيم بناءً على ترتيب إضافتها. بدلاً من ذلك، يتم تخزين القيم في الـ Map بناءً على المفاتيح المرتبطة بها.
الـ Map يتكون من أزواج مفتاح/قيمة، وعند الوصول إلى القيم في الـ Map، يتم استخدام المفتاح للعثور على القيمة المرتبطة به. يتم تخزين الأزواج في الـ Map بطريقة تسمح بإجراء عمليات البحث والوصول الفعالة إلى القيم.
إذا كنت بحاجة إلى ترتيب محدد للقيم، يمكنك استخدام الـ List بدلاً من الـ Map. يمكنك تخزين القيم في الـ List بالترتيب المطلوب والوصول إليها باستخدام مؤشر الفهرس (index).
هل يمكن استخدام الـ List لتخزين القيم بمفاتيح محددة؟
في لغة برمجة Dart، الـ List لا يقوم بتخزين القيم بمفاتيح محددة. الـ List يُستخدم لتمثيل مجموعة مرتبة من القيم دون وجود مفاتيح مرتبطة بها. يتم الوصول إلى القيم في الـ List باستخدام مؤشر الفهرس (index) الذي يبدأ من 0.
على سبيل المثال، إذا كان لديك List يحتوي على قيم من نوع int، يمكنك الوصول إلى قيمة محددة في الـ List باستخدام مؤشر الفهرس كالتالي:
List<int> numbers = [10, 20, 30, 40, 50]; int value = numbers[2]; // الوصول إلى القيمة في المؤشر 2 (30)
إذا كنت بحاجة إلى تخزين القيم بمفاتيح محددة، فيمكنك استخدام الـ Map بدلاً من الـ List. يمكنك تعيين قيمة لكل مفتاح واستخدام المفتاح للوصول إلى القيمة المرتبطة به.
هل يمكنني استخدام الـ List لتخزين القيم المتكررة؟
نعم، يمكنك استخدام الـ List لتخزين القيم المتكررة في لغة برمجة Dart. الـ List في Dart تسمح بتكرار القيم داخلها بحرية.
في الـ List، يمكنك إضافة عناصر متكررة دون قيود. على سبيل المثال، يمكنك إضافة نفس القيمة عدة مرات إلى الـ List كما يلي:
List<int> numbers = [1, 2, 2, 3, 3, 3]; .
في المثال أعلاه، تم تكرار القيمتين 2 و 3 عدة مرات في الـ List.
عند الوصول إلى القيم في الـ List، يمكنك استخدام مؤشر الفهرس (index) كما ذكرت سابقًا. يمكنك أيضًا استخدام دوال البحث والتلاعب بالعناصر مثل contains() و indexOf() و remove() للتعامل مع القيم المتكررة في الـ List.
هل يمكنني استخدام دالة remove() لإزالة جميع القيم المتكررة من الـ List؟
لا، دالة remove() في لغة برمجة Dart تُستخدم لإزالة أول ظهور لقيمة محددة من الـ List وليس لإزالة جميع القيم المتكررة.
إذا كنت ترغب في إزالة جميع القيم المتكررة من الـ List، يمكنك استخدام مجموعة من الطرق المختلفة. إليك بعض الأمثلة:
1 – استخدام الدالة toSet() و toList(): يمكنك تحويل الـ List إلى مجموعة (Set) باستخدام دالة toSet()، وسيؤدي ذلك إلى إزالة القيم المتكررة. ثم يمكنك تحويل المجموعة إلى List مرة أخرى باستخدام دالة toList().
List<int> numbers = [1, 2, 2, 3, 3, 3]; List<int> uniqueNumbers = numbers.toSet().toList();
2 – استخدام الدالة removeWhere(): يمكنك استخدام دالة removeWhere() لإزالة القيم المتكررة بناءً على شرط محدد. في هذه الحالة، يمكنك استخدام مجموعة (Set) لتتبع القيم المكررة.
List<int> numbers = [1, 2, 2, 3, 3, 3]; Set<int> uniqueSet = Set<int>(); numbers.removeWhere((num) => !uniqueSet.add(num));
في المثالين أعلاه، ستحصل على قائمة جديدة uniqueNumbers أو numbers بدون القيم المتكررة.
شروط كتابة المتغيرات في لغة دارت
- أن لا يحتوي أسم المٌتغير على إحدى الكلمات المحجوزة (Keywords).
- ممكن أن يحتوي أسم المتغير على حروف و أرقام.
- لا يمكن أن يحتوي أسم المتغير على فراغات و حروف خاصة باستثناء التسطير أندرسكور (_) و (dollar sign).
- لا يجوز أن يبدأ اسم المتغير برقم.
مثال 1
يتم أستخدام نوع البيانات الرقمية في هذا المثال
void main() { int num1 = 23; double num2 = 68.5; print(num1); print(num2); var a = num.parse("1"); var b = num.parse("2.69"); var c = a+b; print("Product = ${c}"); }
أنشأنا متغير رقمي صحيح num1 و قيمته هي 23 و أنشأنا متغير آخر نوعه double و هو num2 و قيمته 68.5 ثم قمنا بطباعة المتغيرين عبر الدالة print الخاصة بالطباعة.
ثم قمنا بإنشاء متغير var a و قيمته نصية هي 1 و متغير نصي آخر و هو b و قيمته هي 2.69 و متغير ثالث c و قيمته هي ناتج جمع المتغيرين a و b و المتغيرين قمنا بتحويلهم للأرقام عبر أستخدام num.parse و بعدها قمنا بطباعة ناتج جمع هذين المتغيرين أي طباعة قيمة c.
عند تشغيل الكود
23
68.5
Product = 3.69
مثال 2
يتم أستخدام نوع البيانات النصية في هذا المثال.
void main() { String string = 'Prog''rammer''Tech'; String str = 'Ahmed and '; String str1 = 'Muhammad'; print (string); print (str + str1); }
قمنا بإنشاء متغير نصي يحتوي على ثلاثة قيم و بعدها أنشأنا متغيرين نصيين و هما str و str1 و بعد ذلك قمنا بطباعة المتغير الأول و المتغيرين الثاني و الثالث قمنا بعملية جمع أي دمع القيم مع بعضها.
عند تشغيل الكود
ProgrammerTech
Ahmed and Muhammad
مثال 3
يتم أستخدام نوع البيانات المنطقية في هذا المثال
void main() { String a = 'Programmer '; String a1 = 'Tech'; bool val = (a==a1); print (val); }
أنشأنا متغيرين نصية و هما a و a1 و لهم قيم نصية مختلفة ثم أنشأنا متغير للبيانات المنطقية و هو val و قيمته وضعنا a تساوي a1 ثم طلبنا طباعة النتيجة.
عند تشغيل الكود يكون الناتج
false
نلاحظ بأنه طبع لنا false لأن قيمة المتغير الأول غير مشابهة للمتغير الثاني.
مثال 4
يتم أستخدام نوع البيانات القوائم Lists في هذا المثال
void main() { List a = new List(3); a[0] = 'Muhammad'; a[1] = 'Ahmed'; a[2] = 'Muhammad'; print(a); print(a[0]); }
أنشأنا متغير List و هو a أي سوف نقوم بتعريف قائمة بها ثلاثة قيم و تكون قيمة الأول هي Muhammad و قيمة الثاني Ahmed و قيمة الثالث هي Muhammad ثم قمنا بعد ذلك بطباعة كامل محتوى القائمة a و بعده أيضاً قمنا بطلب طباعة قيمة الأندكس الأول 0 من القائمة.
عند تشغيل الكود
[Muhammad, Ahmed, Muhammad]
Muhammad
نلاحظ في السطر الأول من الناتج أنه طبع لنا الثلاثة قيم لأنه طلبنا كامل العناصر, و بعده في السطر الثاني طبع لنا Muhammad لأنه القيمه الأولى 0.
مثال 5
يتم أستخدام نوع البيانات خرائط Maps في هذا المثال
void main() { Map a = new Map(); a['First Name'] = 'Muhammad'; a['Second Name'] = 'Turkey'; a['Third Name'] = 'Alush'; print(a); }
عرّفنا متغير Map و هو a و هذا المتغير به ثلاثة قيم و هي ألأسم الأول و ألأسم الثاني و ألأسم الثالث و قيم المتغير نصية, ثم قمنا بطباعة الخريطة أي المتغير a.
عند تشغيل الكود
{First Name: Muhammad, Second Name: Turkey, Third Name: Alush}
نلاحظ بأنه طبع لنا القيم أي القيمة و مفتاحها كالقاموس.