GNU Octave

GNU Octave

بديل الماتلاب المجاني

John W. Eaton

5.0
تقييم داونزن
3.8
تقييم الزوار

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


الجيد
مجاني ومفتوح المصدر.
بيئة متكاملة لعمل محاكاة رياضية للعديد من الأنظمة البشرية والطبيعية.
إمكانية إضافة حزم لتوسعة قدرات البرمجية.
السيئ
لا يوجد
بقلم
Ammar Kurd
5.0
تقييم المراجع

تنصيب جنو أوكتاف على ويندوز

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

  1. GNU Octave GUI وهي نسخة من بيئة العمل بواجهة رسومية.
  2. GNU Octave CLI وهي نسخة من بيئة العمل تعمل من سطر الأوامر الخاص بنظام التشغيل ويندوز.

يمكن للمستخدام العمل بأي من النسختين ولكن يفضل للمبتدأين العمل على النسخة ذات الواجهة الرسومية كما سيفضلها المستخدم المتعود على العمل مع الماتلاب للتشابه الكبير بينهما.

تنصيب جنو أوكتاف على لينكس

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

أمثلة لإستخدام جنو أوكتاف

جنو أوكتاف هي لغة برمجة عالية المستوى (high-level programming language) تتشابه إلى حد كبير مع تلك المستخدمة في ماتلاب وتقوم بالاساس على الحسابات العددية (numerical computations) مثل التعامل مع المصفوفات والقيام بالعمليات عليها وحل المعادلات الخطية وغير الخطية، وتحتوي البيئة على العديد من المكتبات والدوال في عدد من التطبيقات مثل معالجة الصور والفيديو وحل المعادلات التفاضلية والقيام بالعمليات الإحصائية ورسم منجنيات الدوال والتمثيل البياني.

كيفية التشغيل

يمكن للمستخدم إدخال الأوامر لبيئة العمل بطريقتين، إما عبر نافذة الأوامر (Command Window) والتي تقوم بتنفيذ الأمر بالضغط على زر الإدخال (Enter key) في لوحة المفاتيح أو عبر كتابة كود نصي (Script) عبر المحرر (Editor) ثم القيام بتنفيذه عبر الضغط على زر التشغيل (Save File and Run).

كما يمكن عرض قيم المتغيرات والتي تكون في الغالب مصفوفات عبر الضغط على زر محرر المتغيرات (Variable Editor).

وتظهر في الجانب الأيسر من واجهة بيئة العمل ثلاث نوافذ صغيرة، وهي:

  1. النافذة الأولى تظهر موقع مجلد العمل الحالي (Workspace).
  2. النافذة الثانية تعرض كل المتغيرات المستخدمة.
  3. النافذة الثالثة تعرض تاريخ الأوامر المدخلة.

يقوم البرنامج بعرض ناتج الأوامر المدخلة مباشرة الا في حالة إضافة رمز الفاصلة المنقوطة (;) في آخر الأمر.

إضافة تعليقات

التعليق على الكود هو واحد من أهم طرق ترتيب وتوثيق الأكود، والتعليق لا يتم ترجمتة من قبل المترجم الخاص بأوكتاف ويستخدم لأجل القارئ البشري الذي يستخدم الكود. ويتم إضافة تعليق في جنو أوكتاف عبر وضع الرمز (#) أو (%) في البداية ويصبح السطر الذي يأتي بعد هذا الرمز تعليق ولا يتم ترجمتة من قبل المترجم مثال:

# This is a comment

disp ("This line will be compiled");

% disp("This line will not be compiled");

لإضافة تعليق لعدد من الأسطر يستخدم #{   #} أو %{   %} ويراعى وضع الرمز في سطر مستقل يحيط بالتعليق من الأعلى والأسفل، مثال يوضح ذلك:

#{

disp ("Hello world!");

disp("This line will not be compiled");

This entire block is a comment

#}

الحصول على المساعدة

هناك العديد من الطرق للحصول على معلومات حول استخدام الأوامر والدوال المدمجة مع بيئة العمل الخاصة بأوكتاف ومنها الإطلاع على دليل التشغيل في الموقع الرسمي أو الإطلاع على الدليل عبر البرنامج نفسه بالضغط على خانة ال Documentation. كما يوفر البرنامج إمكانية الإطلاع على معلومات سريعة حول دالة معينة عبر نافذة الأوامر بكتابة help يتبعها اسم الدالة، مثلا:

>> help disp

'disp' is a built-in function from the file libinterp/corefcn/pr-output.cc

-- disp (X)

-- STR = disp (X)

Display the value of X.

For example:

disp ("The value of pi is:"), disp (pi)

-| the value of pi is:

-| 3.1416

Note that the output from 'disp' always ends with a newline.

If an output value is requested, 'disp' prints nothing and returns

the formatted output in a string.

See also: fdisp.

Additional help for built-in functions and operators is

available in the online version of the manual. Use the command

'doc <topic>' to search the manual index.

Help and information about Octave is also available on the WWW

at https://www.octave.org and via the help@octave.org

mailing list.

كما يمكن إرسال الأسئلة والاستفسارات المتعلقة بأوكتاف إلى القائمة البريدية عبر الإيميل: help@octave.org أو طرح هذه الأسئلة في الموقع الشهير ستاك أوفر فلو وكل هذه الوسائل تتطلب معرفة ودراية باللغة الإنجليزية بدرجة معينة.

كتابة دالة

تتيح بيئة جنو أوكتاف للمستخدم إنشاء دوال للقيام بعمليات حسابية معينة ثم إستدعاء هذه الدالة عبر نافذة الأوامر أو في محرر الأكواد، وللقيام بإنشاء دالة عليك الضغط على File >> New >> New Function.

صيغة الدالة هي كالتالي:

function ret-var = name (arg-list)

body

endfunction

حيث تتكون الدالة من الكلمة function في بداية الدالة يتبعها المتغير الذي يحتفظ بناتج العملية (ret-var) ثم رمز المساواة ثم اسم الدالة وقائمة المعطيات بين قوسين ثم endfunction في نهاية الدالة ويتوسط هذه الكلمتان محتوى الدالة نفسه، مثال بسيط لدالة تقوم بحساب مساحة المثلث:

function Area = Tri_area (B, H)

Area = 0.5*B*H;

endfunction

يتم استخدام الدالة عن طريق كتابة اسم الدالة وقيم المعطيات بين القوسين كما يلي:

A = Tri_area(5,3)

A = 7.5000

إنشاء المصفوفات

يتم إنشاء مصفوفة وحفظها في متغير عبر استخدام القوس المربع [ ] مثلاً:

X = [1 2 3 4 5];

أو مصفوفة متعددة الصفوف والأعمدة عن طريق الفصل بين الصفوف باستخدام الفاصلة المنقوطة (;) مثلاً:

X = [1 2 3 4 5; 6 7 8 9 10];

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

X = 1:0.1:2

X =Columns 1 through 9:

1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000

Columns 10 and 11:

1.9000 2.0000

العمليات الحسابية على المصفوفات

تتم العمليات الأساسية على المصفوفات باستخدام الرموز المعتادة للقيام بعمليات الجمع (+) والطرح (-) وتتم العملية بجمع كل عنصر في المصفوفة مع ما يقابله في نفس الموقع في المصفوفة الأخرى لذلك تتم العملية مع المصفوفات المتشابهة في عدد العناصر، مثال:

>> a = [1 2 3; 4 5 6];

>> b = [6 5 4; 3 2 1];

>> a + b

ans =

7 7 7

7 7 7

>> a - b

ans =

-5 -3 -1

1 3 5

أما فيما يتعلق بعملية الضرب فإنه باستخدام الرمز (*) يقوم البرنامج بتنفيذ ضرب المفصوفات المعتاد ويجب مراعاة أن عدد الصفوف في المصفوفة الأولى يساوي الأعمدة في المصفوفة الأخرى، أما باستخدام الرمز (*.) فتتم عملية الضرب بين كل عنصر من المصفوفة مع ما يقابله في المصفوفة الأخرى وعليه يجب تساوي عدد العناصر في المصفوفتين، مثال:

>> a = [1 2 3; 4 5 6];

>> b = [1 2; 3 4; 5 6];

>> c = [2 2 2; 2 2 2];

>> a * b

ans =

22 28

49 64

>> a .* c

ans =

2 4 6

8 10 12

قسمة المصفوفات تتم باستخدام الرمز (/.) للفيام بقسمة كل عدد في المصفوفة مع ما يقابلة في المصفوفة الأخرى، مثال:

>> a = [1 2 3; 4 5 6];

>> c = [2 2 2; 2 2 2];

>> a ./ c

ans =

0.50000 1.00000 1.50000

2.00000 2.50000 3.00000

رفع المصفوفة للقوة (الأس) تتم عبر الرمز (^.) أو (**.) ويجب أن تتساوى عدد العناصر في كلا المصفوفتين، مثال:

>> a.^c

ans =

1 4 9

16 25 36

للقيام بإنشاء منقولة المصفوفة (Transpose) يتم استخدام الأمر transpose() كما يظهر في المثال التالي:

>> transpose(a)

ans =

1 4

2 5

3 6

كما يوجد عدد آخر من العمليات التي يمكن الإطلاع عليها في دليل التشغيل في الموقع الرسمي.

حل نظام من المعادلات الخطية

لحل نظام من المعادلات الخطية يستخدم الرمز "\" كالتالي:

x = A \ b 

حيث يقوم بالعملية:

inv (A) * b

حيث أن المصفوفة A تحتوي على عوامل المتغيرات (coefficients) المجهولة حسب عدد المتغيرات، وتحتوي المصفوفة b على الأعداد الثابتة (constant terms) والناتج في المصفوفة x يحتوي الحل للمتغيرات المجهولة حسب الترتيب في المصفوفة A. مثل لحل نظام من المعادلات الخطية التالية:

x - 8*y + 2*z = 2

x + 15*y + z =4

x + y - z = 9

يتم إدخال المعادلات إلى مصفوفات كالتالي:

>> A = [1 -8 2; 1 15 1; 1 1 -1];

>> b = [2; 4; 9];

حل هذا النظام يتم بكل سهولة كالتالي:

>> B = A \ b

B =

6.633333

-0.016667

-2.383333

قيم كل من x و y و z تظهر في المصفوفة B بالترتيب.

العبارات الشرطية والتكرار

جنو أوكتاف هي لغة برمجة مخصصة للتعامل مع قواعد بيانات صممت خصيصاً للتعامل مع الرياضيات، وتحتوي كذلك على عدد ضخم من الدوال الجاهزة للتعامل مع العديد من البنى الرياضية في مجالات مختلفة، وكما هو الحال في أي لغة برمجة أخرى فإن أوكتاف تحتوي على عدد من العبارات للتحكم في مسار الأوامر (Control flow)، وفيما يلي بيان حول هذه العبارات.

عبارة الشرط (if)

عبارة الشرط if تستخدم لفحص شرط معين ثم تنفيذ أمر أو عدة أوامر في حال تحقق هذا الشرط كما يمكن التحقق من عدد من الشروط الأخرى في حالة عدم تحقق الشرط الأول بإضافة elseif أو وضع حالة افتراضية في حال عدم تحقق أي من الشروط الأخرى بإضافة else وتنتهي العبارة بكتابة نهاية الشرط endif، وتكون بينة الشرط كما يلي:

if (condition)

then-body

elseif (condition)

elseif-body

else

else-body

endif

مثال بيسط يوضح طريقة استخدام العبارة الشرطية if، يمكن نسخ المثال إلى المحرر (Editor) وحفظه بأي اسم ثم تشغيله بالضغط على زر التشغيل Run >> Save File and Run:

clear;

clc;

a = input("Enter the first number (a): ");

b = input("Enter the second number (b): ");

if (a > b)

disp ("a is greater than b");

elseif (a < b)

disp ("a is less then b");

else

disp ("a is equal to b");

endif

عند تشغيل الكود يطلب من المستخدم ادخال الرقم الأول (a) والثاني (b) والذي يتم عبر الدالة input، يتم المقارنة بين القيمتين وعرض الناتج باستخدام الدالة (disp)، مثال لتشغيل الكود كما يلي:

Enter the first number (a): 1

Enter the second number (b): 2

a is less then b

عبارة الشرط switch

تقوم العبارة الشرطية switch بنفس العمل الذي تقوم به العبارة الشرطية if elseif في فحص حالة متغير ما ولكن بشكل أكثر تنظيماً يساعد في فهم وترتيب وتوثيق الكود بشكل أفضل، وتأخذ العبارة الشكل التالي:

switch (expression)

case label

command_list

case label

command_list



otherwise

command_list

endswitch

كما يظهر في النموذج فإن هذه العبارة تبدأ بكتابة switch يلي ذلك المتغير أو التعبير المراد فحصه بين قوسين ()، ثم العبارة case يتبعها الناتج المراد فحصه يليها الأمر المراد تنفيذه، ويمكن للمستخدم وضع عدد كبير من الحالات (cases) وفي الاخير من الممكن وضع عبارة تشمل أي قيمة لم ترد ضمن الحالات ويستخدم لذلك otherwise ثم الأمر المراد تنفيذه، وفي الأخير يتم إنهاء العبارة بكتابة endswitch، وفيما يلي مثال بسيط يوضح آلية عمل عبارة الشرط switch:

clear;

clc;

a = input("Enter ""y"" to continue or ""n"" to exit: ");

switch (a)

case "y"

disp ("The user accepts")

case "n"

disp ("The user does not accept")

otherwise

disp ("invalid input!")

endswitch

عند تشغيل الكود سيطلب من المستخدم الموافقة عبر إدخال على زر 'y' أو الرفض 'n'، وعند إدخال اي حرف آخر تعرض رسالة إعلام بالخطأ، 

>> switch_example

Enter "y" to continue or "n" to exit: 'd'

invalid input!

عبارة التكرار while

يمكن ترجمة هذه العبارة بالكلمة العربية 'طالما' حيث يتم تنفيذ الأوامر التي تحتويها العبارة طالما أن الشرط صحيح، وتأخذ العبارة الصيغة التالية:

while (condition)

body

endwhile

كما يظهر من الصيغة فإن العبارة تبدأ بـ while يتبعها الشرط بين قوسين وتنتهي بـ endwhile ويتوسطهما الأوامر المراد التحكم بتكرارها، مثال بسيط يوضح طريقة استخدام هذه العبارة:

clear;

clc;

i = 0;

while (i < 4)

disp ('You are in a loop');

i = i +1;

endwhile



disp ('You are out of the loop!');

يقوم الكود السابق بتكرار العبارة "You are in a loop" طالما المتغير "i" أصغر من العدد 4 ثم يقوم بزيادة المتغير بمقدار 1، عندما تصل قيمة المتغير إلى 4 تتوقف العبارة عن تكرار الأمر وتظهر عبارة تخبرك بالخروج من حالة التكرار "You are out of the loop" كما يظهر عند تشغيل الكود:

>> While_loop_example

You are in a loop

You are in a loop

You are in a loop

You are in a loop

You are out of the loop!

عبارة التكرار do-until

هذه العبارة مشابهة لعبارة التكرار while حيث يتم تنفيذ الأوامر حتى يتحقق الشرط، وتأخذ الصيغة التالية:

do

body

until (condition)

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

clear;

clc;

i = 0;

do

disp ('You are in a loop');

i = i + 1;

until (i > 4)



disp ('You are out of the loop!');

يتكرر الأمر لخمس مرات كما هو متوقع عند تشغيل الكود:

>> do-until_loop_example

You are in a loop

You are in a loop

You are in a loop

You are in a loop

You are in a loop

You are out of the loop!

عبارة التكرار for

لعلها الأكثر استخداماً بين عبارات التكرار الأخرى، وتقوم هذه العبارة بالمرور على عناصر مصفوفة أو نطاق من الأرقام، وتأخذ الصيغة التالية:

for var = expression

body

endfor

مثال لاستخدام عبارة التكرار for للمرور على عناصر مصفوفة:

clear;

clc;

for i = [2, 5, 3, 1, 0, 7]

disp (['The current value of i is: ', num2str(i)]);

endfor

يمر الكود السابق على كل عناصر المصفوفة ويقوم بعرض قيمة العنصر:

>> for_loop_example

The current value of i is: 2

The current value of i is: 5

The current value of i is: 3

The current value of i is: 1

The current value of i is: 0

The current value of i is: 7

رسم المنحنيات 

تتيح بيئة العمل الخاصة بجنو أوكتاف رسم منحنيات لدوال ثنائية البعد وثلاثية البعد ويعتبر رسم المنحنيات من أهم وسائل عرض البيانات في مختلف مجالات العلوم والهندسة.

رسم منحنيات ثنائية البعد

تستخدم الدالة plot لرسم منحنيات ثنائية البعد، وفيما يلي مثال لرسم منحنى الدالة y = x3:

clear;

clc;

x = 0:0.01:30;

y = x.^3;

plot (x, y);

xlabel("x")

ylabel("y(x) = x^3");

title("2D plot example");

يظهر منحنى الدالة في نافذة صغيرة منفصلة عن النافذة الأساسية كما يظهر في الصورة في الأسفل.

رسم منحنيات ثلاثية البعد

بالإمكان رسم منحنيات ثلاثية البعد باستخدام الأمر plot3، مثال:

clear;

clc;

t = 0:0.01:100;

z = 0:0.01:100;

x = sin(t);

y = cos(t).^2;

plot3 (x, y, z);

xlabel("x")

ylabel("y");

zlabel("z");

title("3D plot example");

تظهر نتيجة رسم المنحنى السابق في الصورة في الأسفل.

رسم منحنيات متعددة في نافذة واحدة

يستخدم الأمر subplot لرسم عدد من المنحنيات في نافذة واحدة ويحتاج الأمر لتحديد عدد الصفوف والأعمدة ورقم المنحنى قبل استخدام أمر الرسم، كمثال لعمل أربعة منحنيات في نافذة واحدة يحدد صفين وعمودين ثم لكل منحنى يحدد رقم يمثل موقع المنحنى في النافذة ويبدأ العد من اليسار إلى اليمين ويبدأ من الأعلى ثم إلى الأسفل، كما يظهر في الكود في الأسفل:

clear;

clc;

t = -20:0.01:20;

a = 5;

subplot (2, 2, 1)

plot (t, a*sin(0.5*pi*t))

xlabel("t");

ylabel("A * sin(0.5*pi*t)");

title("Sine function")

subplot (2, 2, 2)

plot (t, a*cos(0.5*pi*t))

xlabel("t");

ylabel("A * cos(0.5*pi*t)");

title("Cosine function")

subplot (2, 2, 3)

plot (t, t)

xlabel("t");

ylabel("t");

title("Linear function")

subplot (2, 2, 4)

plot (t, t.^2)

xlabel("t");

ylabel("t^2");

title("Quadratic function")

وتظهر النتيجة في الصورة في الأسفل.

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

رسم عدد من المنحنيات في نوافذ متعددة

بالإمكان رسم عدد من المنحنيات في في نوافذ متعددة باستخدام الأمر figure، مثال:

clear;

clc;

t = -20:0.01:20;

a = 5;

figure(1);

plot (t, a*sin(0.5*pi*t));

xlabel("t");

ylabel("A * sin(0.5*pi*t)");

title("Sine function");

figure(2);

plot (t, a*cos(0.5*pi*t));

xlabel("t");

ylabel("A * cos(0.5*pi*t)");

title("Cosine function");

تحميل حزم لإضافة مميزات إضافية

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

كيفية إضافة الحزم

في البداية تأكد من الحزم المتوفرة في النسخة الحالية لديك من أوكتاف عبر كتابة الأمر في نافذة الأوامر pkg list في حالة عدم توفر الحزمة التي تريدها عندها يمكنك إضافة الحزمة لبيئة العمل كالتالي:

  1. الخطوة الأولى هي تحميل الحزمة من الصفحة الخاصة بأوكتاف في موقع سورسفورج، اسم الحزمة يكون بالصيغة التالية : image-1.0.0.tar.gz.
  2. ضع الحزمة في مجلد العمل الحالي (Current directory) لأوكتاف، وهو المجلد الذي يظهر في يسار النافذة الرئيسية للبرمجبة.
  3. في نافذة الأوامر قم بكتابة الأمر pkg install يليها اسم الحزمة مثلا: pkg install image-1.0.0.tar.gz، في حال نجاح عملية تنصيب الحزمة لن يعرض أوكتاف أي رسالة.
  4. عند الإنتهاء من تنصيب الحزمة يتم تفعيلها في الجلسة الحالية (Session) عبر الأمر pkg load، مثلاً: pkg load image.
  5. لحذف الحزمة استخدم الأمر: pkg uninstall image. 

تحميل بديل الماتلاب المجاني جنو أوكتاف

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

معلومات إضافية

  • الإصدار
    5.1.0-w32
  • التحديث
    2019-04-15
  • التنزيلات
    4.9K
  • الترخيص
    مجاني
  • حجم الملف
    275.0MB
  • متطلبات التشغيل
    Windows

قوائم التطبيق