1 / 39

تراكيب البيانات

قسم علوم الحاسوب و تكنولوجيا المعلومات تخصص دبلوم البرمجيات و قواعد البيانات. الوحدة الثانيــة المصفوفات أحاديـة و ثنائيــة الأبعــاد. تراكيب البيانات. المادة العلمية إعداد أ. محمود رفيق الفـــرَّا http://mfarra.cst.ps. مدرسـا المساق/ أ. محمود رفيق الفـــرَّا. 2010-2011. محاور المحاضرة.

Télécharger la présentation

تراكيب البيانات

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. قسم علوم الحاسوب و تكنولوجيا المعلومات تخصص دبلوم البرمجيات و قواعد البيانات الوحدة الثانيــة المصفوفات أحاديـة و ثنائيــة الأبعــاد تراكيب البيانات المادة العلمية إعداد أ. محمود رفيق الفـــرَّا http://mfarra.cst.ps مدرسـا المساق/ أ. محمود رفيق الفـــرَّا 2010-2011

  2. محاور المحاضرة • المقصود بتراكيب البيانات • الهدف من تعلم تراكيب البيانات • طباعة عناصر المصفوفة • تخزين معلومات في المصفوفـة • استبدال عناصر في المصفوفات • حذف عنصر من المصفوفة دون تأثير • إضافة عنصر دون تأثير • مفهوم دراسة الخوارزميات • التعامل مع الـArrayList مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  3. بذكرك ربنـا نحيــا • الذكر لمن دخل السوق لا إله إلا الله وحده لا شريك له، له الملك وله الحمد يحيي ويميت وهو حي لا يموت بيده الخير وهو على كل شيء قدير عن عمر بن الخطاب رضي الله عنه أن رسول الله صلى الله عليه وسلم قال: من دخل السوق فقال: لا إله إلا الله وحده لا شريك له، له الملك وله الحمد يحيي ويميت وهو حي لا يموت بيده الخير وهو على كل شيء قدير "كتب الله له ألف ألف حسنة ومحا عنه ألف ألف سيئة ورفع له ألف الف درجة. [حسنه الألباني] مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  4. المقصود بتراكيب البيانات ؟ • هي بناء منطقي كبير من عناصر البيانات أو مجموعات منظمة من عناصر البيانات تعامل كوحدة واحدة، مثل المصفوفات أو السجلات. • تستخدم من أجل تسهيل بناء تطبيقات محددة مثل تخزين معلومات طلبة أو تخزين معلومات زبائن أو طلبات للبيع و الشراء أو معالجة لبيانات مستند ما, و غير ذلك.

  5. أنواع تراكيب البيانات • تنقسم تراكيب البيانات إلى عدة أنواع يناظر كل منها أسلوباً خاصاً في تصميم البرامج والمعالجة الالكترونية و هي: • هياكل بيانات خطية : و فيها يتم تخزين البيانات متجاورة في الذاكرة مثل المصفوفات و المكدسات و السلاسل المترابطة و غير ذلك. • هياكل بيانات شجرية: و فيها يتم تخزين البيانات بصورة تماثل تركيبة الأشجار حيث تتجاور معلومات و تتباعد معلومات بناءً على بيانات منطقية محددة و مثال ذلك ما يعرف بـ Tree. • هياكل بيانات شبكية: و هي تشابه الشجرية إلا أن العناصر هنا قد ترتبط مع أكثر من عنصر من المستوى العلوي و هو ما يعرف بـ Graph مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  6. الهدف من تعلم تراكيب البيانات؟ • علم تراكيب البيانات هو من العلوم الغير أساسيـة في عالم البرمجـة, بمعنى يمكنك تطوير البرمجيات دون الحاجة له, و لكن!! • ظهرت الحاجة لعلم تراكيب البيانات بهدف زيادة جودة البرمجيات من حيث سرعة التنفيذ, و تقليل كمية الذاكرة المستخدمة. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  7. التعامل مع عناصر المصفوفة؟ • بما أنَّ المصفوفة سواءً الأحاديـة أو الثنائيـة تعتبر مجموعة من العناصر (المتغيرات) المتجاورة يزيد عنوان الواحدة عن التي قبلها بعدد ثابت هو 1 فإن التعامل مع هذه العناصر سيكون سهلا من خلال استخدام التكرارات للوصول للعناصر ثم القيام بالعملية التي نرغب في القيام بها سواء طباعة, تخزين, بحث, ترتيب, حذف و غير ذلك مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  8. طباعة عناصر المصفوفة؟ static void Main(string[] args) { string[] names = { "Ali", "Mahmoud", "Hussam", "Ala" }; for (int i = 0; i < names.Length; i++) Console.WriteLine("The next name is "+names[i]); Console.Read(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  9. طباعة عناصر المصفوفة؟ • من الطرق الأخرى لتعريف المصفوفة –عند معرفة عناصر سلفا- كما يلي: string[] names = { "Ali", "Mahmoud", "Hussam", "Ala" };و في هذه الحالة يتعرف المترجم على عدد عناصر المصفوفة بشكل ضمني. • من الدوال التي يكثر استخدامها للتعامل مع المصفوفات دالة length و هي تستخدم لإعادة عدد عناصر المصفوفة. • يستخدم الامر Console.WriteLine للطباعة كما تشاهد في السطر 5 بينما الامر Console.Read للقراءة. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  10. طباعة عناصر المصفوفة static void Main(string[] args) { string[,] names = { {"Ali", "Mahmoud"}, {"Hussam", "Ala"} }; for (int i = 0; i < names.GetLength(0); i++) Console.WriteLine("The next name is " + names[i,0]+" “ + names[i,1]); Console.Read(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  11. طباعة عناصر المصفوفة • من الطرق الأخرى لتعريف المصفوفة ذات البعدين كما يلي تشاهد في السطر الثالث. • من الدوال التي يكثر استخدامها للتعامل مع المصفوفات ذات البعدين دالة GetLength(0)و هي تستخدم لإعادة عدد عناصر المصفوفة في الصف الواحد, بينما عند استبدال القيمة 0 بالقيمة 1 فإنها ستعيد عدد العناصر في العمود. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  12. تخزين معلومات في مصفوفـة أحاديـة • تخزين المعلومات داخل المصفوفات في عموم التطبيقات يتم بشكل آلي, و ذلك لمعلومات يتلقاها التطبيق إما من المستخدم و إما من مصدر خارجي (قاعدة بيانات, ملفات معلوماتية). • لهذا فأنت دائما بحاجة إلى تقدير حجم المصفوفة التي تحتاجها, معرفة نوع البيانات, و تحتاج كذلك إلى تخزين البيانات بصورة صحيحة و ترتيب صحيح. • لهذا نحن بحاجة إلى استخدام جملة تكرار بالإضافة إلى جملة قراءة القيم. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  13. تخزين معلومات في مصفوفـة أحاديـة static void Main(string[] args) { int[] id = new int[5]; for (int i = 0; i < 5; i++) id[i] =int.Parse(Console.ReadLine()); Console.WriteLine("==== The numbers in Array are ====="); for (int i = 0; i < 5; i++) Console.WriteLine(" Next Number is " + id[i]); Console.ReadLine(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  14. تخزين معلومات في مصفوفـة أحاديـة • من المعروف سلفا أن القيم التي يتم إدخالها من خلال جمل الإدخال يعتبرها المترجم من النوع نص string و لكي نخزنها في مصفوفة من النوع الصحيح نحتاج إلى تحويل النوع و هو ما يمكن فعله من خلال الدالة Parse كما هو واضح في السطر الخامس. • الكود بدءً من السطر السادس لا يعتبر لتخزين القيم و إنما لطباعة القيم التي تم إدخالها. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  15. تخزين معلومات في مصفوفـة ثنائيـة • تخزين المعلومات داخل المصفوفات في عموم التطبيقات يتم بشكل آلي, و ذلك لمعلومات يتلقاها التطبيق إما من المستخدم و إما من مصدر خارجي (قاعدة بيانات, ملفات معلوماتية). • لهذا فأنت دائما بحاجة إلى تقدير حجم المصفوفة التي تحتاجها, معرفة نوع البيانات, و تحتاج كذلك إلى تخزين البيانات بصورة صحيحة و ترتيب صحيح. • لهذا نحن بحاجة إلى استخدام جملة تكرار بالإضافة إلى جملة قراءة القيم. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  16. تخزين معلومات في مصفوفـة ثنائيـة static void Main(string[] args) { string[,] names = new string[2, 3]; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) names[i, j] = Console.ReadLine(); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) Console.Write(names[i, j]); Console.WriteLine(); } Console.Read(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  17. تخزين معلومات في مصفوفـة ثنائيـة • من خلال المثال السابق قمنا بتخزين الاسم الثلاثي لشخصين, و لهذا كانت المصفوفة تحتوي على صفين (للشخصين) و ثلاثة أعمدة (كل عمود يحتوي على جزء من الاسم الثلاثي). • و طالما كنا نمتلك تكرار أفقي (الأعمدة) و عمودي (الصفوف) فنحن نحتاج لتكرارين كل واحد منهما يعالج اتجاه. مستخدما جمل الطباعة قم بالتعديل على المثال السابق بحيث ترشد المستخدم لإدخال الأسماء على الشكل التالي أدخل الجزء 1 من اسم الشخص الأول أدخل الجزء 2 من اسم الشخص الأول أدخل الاسم الثالث للشخص الأول و هكذا ... مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  18. استبدال عناصر في المصفوفات • من العمليات المشهورة في البرمجة استبدال قيم العناصر و هو ما يعرف باسم swap, حيث نقوم باستبدال قيم العنصر الثالث مع الخامس مثلا • و للقيام بهذه المهمة نحتاج إلى استحداث متغير كـ (مخزن مؤقت) يتم فيه تخزين قيمة أحد المتغيرين. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  19. استبدال عناصر في المصفوفات static void Main(string[] args) { int[] numbers = { 3, 5, 7, 23, 56, 12 }; int x; x = numbers[0]; numbers[0] = numbers[1]; numbers[1] = x; Console.WriteLine(" "); Console.WriteLine(" The elements of array after swap"); for (int i = 0; i < numbers.Length; i++) Console.WriteLine(" "+numbers[i]); Console.Read(); } قم بتطبيق هذا المفهوم مع مصفوفة ثنائيـة الأبعاد مخزن بهاالاسماء مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  20. بذكرك ربنـا نحيــا • الذكر لمن ركب الدابـة الله أكبر ... الله أكبر ... الله أكبر ... سبحان الله ... سبحان الله ... سبحان الله ... سبحان الذي سخَّر لنا هذا و ما كنـَّا له موقنين و إنا إلى ربنا لمنقلبون مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  21. حذف عنصر من المصفوفة دون تأثير • حذف العنصر من المصفوفة لا يعني استبداله بالقيمة صفر !! بل يقصد به إزالة وجوده و الحفاظ على بقية العناصر. • هذا يعني أننا نحتاج إلى كتابة قيمة على القيمة المراد حذفها. • حذف العنصر قد يتم بطريقين هما/ • طلب حذف عنصر بالقيمة (مثال: حذف العنصر ذو القيمة 10) • طلب حذف عنصر بالعنوان(مثال: حذف العنصر الثالث) مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  22. 1 2 3 4 5 6 7 9 8 9 1 2 3 4 5 7 8 9 10 11 13 14 6 12 0 array 2 7 9 12 15 23 30 45 15 77 80 88 90 99 Null 0 1 2 3 4 5 7 8 9 10 11 13 14 6 12 array 2 7 9 12 23 30 45 15 77 80 88 90 99 99 حذف عنصر من المصفوفة دون تأثير 0 1 2 3 4 5 7 8 9 10 11 13 14 6 12 array 2 7 9 12 15 23 30 45 70 77 80 88 90 99 To delete the 5’th cell 15 مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  23. حذف عنصر من المصفوفة دون تأثير static void Main(string[] args) { int[] id = { 10, 12, 11, 45 }; // to delete the value 12 int i; for ( i = 0; i < id.Length-1; i++) { if (id[i] == 12) { break; } } for (int j =i ; j < id.Length-1; j++) id[j] = id[j + 1]; for (int k = 0; k < id.Length; k++) Console.WriteLine(" "+id[k]); Console.Read(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  24. حذف عنصر من المصفوفة دون تأثير static void Main(string[] args) { int[] id = { 10, 12, 11, 45 }; // to delete the value of index 2 for (int i =2 ; i < id.Length-1; i++) id[i] = id[i + 1]; for (int k = 0; k < id.Length; k++) Console.WriteLine(" "+id[k]); Console.Read(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  25. إضافة عنصر دون تأثير • نقصد بإضافة عنصر داخل المصفوفة دون تأثير, أي يتم إضافة العنصر في موضع محدد دون حذف القيمة الموجودة في ذلك الموضع أو دون تغيير ترتيب المصفوفة إن كانت مرتبـة. • و لإضافة عنصر جديد داخل المصفوفة نحتاج إلى: • تحديد عنوان الموضع الذي نرغب في إضافة العنصر فيه. • عمل إزاحة للقيمة الموجودة سلفا في ذلك الموضع في اتجاه اليمين لإفراغ موضع فارغ. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  26. إضافة عنصر دون تأثير 0 1 2 3 4 5 7 8 9 10 11 13 14 6 12 array 2 7 9 12 15 23 30 45 70 77 80 88 90 99 To insert value 13 0 1 2 3 4 5 7 8 9 10 11 13 14 6 12 array 2 7 9 12 13 15 23 30 45 70 77 80 88 90 99 الشكل العلوي يوضح طريقة إضافة عنصر في مصفوفة مرتبـة العناصر حسب القيمة بشكل تصاعدي

  27. إضافة عنصر في مصفوفة غير مرتبـة دون تأثير static void Main(string[] args) { int[] salary = new int [6]; salary[0] = 1200; salary[1] = 2000; salary[2] = 1000; salary[3] = 3210; salary[4] = 4310; // to add value 3000 in the position 3 for (int i = salary.Length - 1; i >= 3; i--) salary[i] = salary[i - 1]; salary[3] = 3000; Console.WriteLine(" === Values of Array after inserting === "); for (int j = 0; j < salary.Length; j++) Console.WriteLine(" Value: "+salary[j]); Console.Read(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  28. إضافة عنصر في مصفوفة مرتبـة دون تأثير static void Main(string[] args) { int[] salary = new int[6]; salary[0] = 100; salary[1] = 200; salary[2] = 300; salary[3] = 1210; salary[4] = 2310; // To add value 250 int i; for (i = 0; i < salary.Length; i++) if (salary[i] > 250) break; for (int j = salary.Length - 1; j >= i; j--) salary[j] = salary[j - 1]; salary[i] = 250; Console.WriteLine(" "); Console.WriteLine(" === Values of Array after inserting === "); for (int j = 0; j < salary.Length; j++) Console.WriteLine(" Value: " + salary[j]); Console.Read(); } تدريب ذاتي : قم بالتعديل على البرنامج في حال كانت كافة عناصر المصفوفة أصغر من القيمة المراد إدخالها مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  29. exp (n) n log n مفهوم دراسـة الخوارزميات • يقصد بمفهوم دراسة الخوارزميات هو دراسـة ما تحتاجه هذه الخوارزميات من وقت و مساحة تخزين للوصول للحل, و يعرف هذا العلم باسم Complexity of Algorithms • الوقت (يعتمد على عدد خطوات) • مساحة تخزين (يعتمد على عدد المعلومات التي نحتاج لتخزينها في الذاكرة العشوائية) • فمثـلا: إذا أردنا تخزين عنصر جديد في المصفوفة, فنحن هنا نحتاج لحساب عدد العناصر التي نحتاج لتحريكها بالإضافة لعملية التخزين, لنحسب الوقت و المساحة. • و هناك مقادير عامة لمدى تعقيد الوقت المستخدم, و هي موضحة بالشكل المقابل. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  30. exp (n) n log n مفهوم دراسـة الخوارزميات • و يعرف Time complexity بأنه الوقت اللازم لتنفيذ البرنامج (الخوارزمية) مقارنة بعدد المدخلات (مثلا عدد عناصر المصفوفة). • و يعرف Space complexity بأنها مساحة التخزين اللازمة لتنفيذ البرنامج مقارنة بعدد المدخلات. • و طالما أنها مرتبطـة بالمدخلات, فستجد أنَّ درجة تعقيد الخوارزميـة تقاس بما يعرف بـ O(n) أو Big o notation علما بأنَّ n هنا يقصد بها عدد مرات المعالجة أو التخزين, و كلما قلة قيمة n كلما كانت هذه الخوارزميـة أفضل من حيث الوقت و التخزين. هذا المفهوم من العلوم التي يتم دراستها بعناية شديدة من متخصصي علوم الحاسوب و محللي النظم, لأن نتيجتها قد تجعلهم يعتمدون على خوارزميـة دون أخرى مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  31. مفهوم الـ ArrayList • لاشك أنك انتبهت خلال تعاملنا مع المصفوفـة في إصدارها التقليدي أنَّ حجمها ثابت و لا يمكن زيادته خلال عمل البرنامج, و هذا الأمر جعلها غير مناسبة لكثير من البرامج. • من الحلول لهذه المشكلة استخدام ما يعرف Dynamic Data Structure حيث الحجم يمكن زيادته خلال تنفيذ النظام, و من هذه التراكيب: • Stack • Queue • Array List مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  32. مفهوم الـ ArrayList • و تعتمد الـ ArrayList على حجم مبدئي قدره 4 عناصر, بمجرد الوصول له يتم تلقائي إضافة 4 عناصر جديدة و هكذا, و بالتالي فلا وجود لخطأ انتهاء الحجم, ( يمكننا طلب عدد أكبر من الخانات من بداية العمل). • تعتبر الـ ArrayList من تراكيب البيانات المبنيـة سلفـا في لغة سي شارب, و لكي يمكننا التعامل معها نحتاج لتضمين المكتبـة Collections using System.Collections; مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  33. مفهوم الـ ArrayList • و يتم تعريف مصفوفة اسمها names من هذا النوع كما يلي: ArrayList names = new ArrayList(); • كما تلاحظ في تعريف الـ ArrayList لم نحدد عدد العناصر, و لم نستخدم [ ] و ذلك لأنه يعتبر صنف معرف سلفا Predefined class • و بالتالي فتعريف أي مصفوفة من هذا النوع يتم كأنك تشتق كائن من صنف. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  34. مفهوم الـ ArrayList • و يمتلك صنف ArrayList مجموعة من الدوال التي يمكنك من خلالها التعامل مع عناصر المصفوفة, بعضها موضح فيما يلي. مستخدما خدمة البحث عبر الإنترنت , ابحث عن مزيد من الدوال مع مفهوم كل منها مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  35. مفهوم الـ ArrayList static void Main(string[] args) { ArrayList names = new ArrayList(); int po1 = names.Add("Ali"); int po2 = names.Add("hussam"); int po3 = names.Add("hassan"); int po4 = names.Add("Alaa"); int po5 = names.Add("wael"); Console.WriteLine(); Console.WriteLine(" Position of PO1: " + po1 + " Position of PO2: " + po2 + " Position of PO5: " + po5); Console.WriteLine(" number of names in the ArrayList: " + names.Count); Console.ReadLine(); } متغير مُعَرَّف سلفا داخل الصنف و يعيد عدد العناصر التي تحتويها المصفوفة مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  36. مفهوم الـ ArrayList static void Main(string[] args) { ArrayList list1 = new ArrayList(); list1.Add(40); list1.Add(50); list1.Add(60); list1.Add(70); ArrayList list2 = new ArrayList(); list2.Add(80); list2.Add(90); list1.AddRange(list2); Console.WriteLine(" === The elements of list1 are ==="); foreach (object x in list1) Console.WriteLine(" "+x); Console.ReadLine(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  37. مفهوم الـ ArrayList static void Main(string[] args) { ArrayList list1 = new ArrayList(); list1.Add(40); list1.Add(50); list1.Add(60); list1.Add(70); ArrayList list2 = new ArrayList(); list2 = list1.GetRange(0, 3); Console.WriteLine(); foreach (object x in list2) Console.WriteLine(" "+x); Console.ReadLine(); } من خلال الدالة GetRange تم استقطاع ثلاثة عناصر من المصفوفة الأولى list1 بداية من العصر الموجود في الموضع صفر و تخزينها في المصفوفة list2. مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  38. مفهوم الـ ArrayList static void Main(string[] args) { ArrayList list1 = new ArrayList(); list1.Add(40); list1.Add(30); list1.Add(10); list1.Add(100); list1.Sort(); Console.WriteLine(); foreach (object x in list1) Console.WriteLine(" " + x); Console.ReadLine(); } مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

  39. أشكركم السؤال مفتاح للعلوم كلها... تذكر أن نيوتن عندما سأل لماذا وقعت التفاحـة وصل إلى قوانين الجاذبيــة ... مساق تراكيب البيانات المادة العلمية إعداد/ أ. محمود رفيق الفــرَّا

More Related