رأيك في برنامجي الأول، بدأت تعلم البرمجة الإثنين الماضي!

  • Muhammad98

بدأت تعلم البرمجة (بالبايثون) بشكل حقيقي يوم الإثنين الماضي، وهذا بالطبع لأنه كان لدي اختبار عليها في يوم الثلاثاء :D

بعدما عدت من الامتحان مباشرة، قمت بتصميم هذا الاسكريبت الذي يُعد حاسبة بسيطة للمصفوفات:

لكن في اليوم التالي، اكتشفت بالصدفة (في صفحة ويكيبيديا العربية عن البايثون) أن هناك إمكانية في البايثون لإنشاء دوال مُسبقة التعريف، وهو ما مكنني من تنفيذ الأفكار التي كانت في رأسي، ونتج عنه هذا الاسكريبت:

الاسكريبت أشبه بمكتبة شاملة للعمليات الممكنة على المصفوفات، والتي وُضعت في هيئة دوال بالشكل التالي:

  • O(m,n):

المصفوفة الصفرية بأبعاد m*n

  • ‎I(n):

مصفوفة الوحدة بأبعاد n*n.

  • ‎Cmlt(A,n):

حاصل ضرب المصفوفة A في الثابت n.

  • ‎ngv(A):

سالب المصفوفة A.

  • ‎Madd(A,B):

ناتج جمع المصفوفتين A وB.

  • ‎Msub(A,B):

ناتج طرح المصفوفة B من المصفوفة A.

  • ‎Mmlt(A,B):

حاصل ضرب المصفوفتين A وB.

  • ‎det(A):

محدد المصفوفة A (كانت الخوارزمية الأصعب على الإطلاق).

  • ‎trn(A):

مدور المصفوفة A.

  • ‎sta(A):

مصفوفة العوامل المرافقة لـA.

  • ‎adj(A):

المصفوفة المرتبطة لـA.

  • ‎inv(A):

معكوس المصفوفة A.

  • ‎Mpow(A,n):

قوى المصفوفة A^n السالبة والموجبة.

  • ‎mat(m,n):

تُستخدم في إدخال المصفوفات بحيز m*n، تُكتب وتُدخل العناصر واحد تلو الآخر (بدلًا من عمل الأقواس بشكل يدوي)

فمثلًا لو أردنا إدخال مصفوفة A 3*4 نقوم بالتالي:

A=mat(3,4)

سيقوم البرنامج بطلب العناصر واحدًا تلو الآخر، حتى يتم تعريف المصفوفة

تطبيقًا على ما ذُكر بالأعلى، لو أردت حساب:

C(3A*2B)^4

نكتبها بالشكل التالي:

Mmlt(C,Mpow(Msub(Cmlt(A,3),Cmlt(B,2)),4))

البرنامج يعمل على المصفوفات بأي بعد، وليس محدودًا ببعد معين، حتى مصفوفة 100*100 يمكن العمل عليها :)

أعلم أن أسماء الدوال غبية بعض الشيء، فقط أريد بعضًا من الوقت لكي أتعلم طريقة تسمية مقبولة.

والآن..

رأيكم يهمني في الخوارزميات تحديدًا، هل يُعد هذا تقدمًا مقبولًا بعد اليوم الرابع من البدء في تعلم البرمجة؟


cenrak أضف ردا

رأيكم يهمني في الخوارزميات تحديدًا، هل يُعد هذا تقدمًا مقبولًا بعد اليوم الرابع من البدء في تعلم البرمجة؟

كشخص في اليوم الرابع، تقدم جدا ممتاز. إذا اردت مستقبلا مشاركة كود، استعمل منصة مثل gist او غيرها. هذا رابط لنفس الكود في منصة مخصصة لمشاركة الكود

...

بعض ما تستطيع تعديله بشكل سريع:

  1. استخدم دالة O في باقي الدوال. في الدوال الأخرى، تعرّف متغير Ans بمصفوفة صفرية يدويا بدون استخدام الدالة O

  2. المتغيرات عادة تبدأ بحرف صغير

  3. كتابة تعليقات على الدوال. بعد أسبوع ستنسى وظيفة كل دالة و ستتمنى وجود تعليق يذكرك بوظيفة الدالة في كلمتين

أما في مرحلة لاحقة:

  1. أغلب الدوال عندك قد تبدو سريعة، لكن في المصفوفات الكبيرة ستكون بطيئة. أقرأ اكثر عن Big O أو الرابط بالعربي

. كمثال، دالة I تستطيع كتابتها بالطريقة هذه:

```

def I(n):
    In=O(n,n)
    for range(n): In[i][i]=1            
    return In

```

حاول معرفة سبب كتابتي لها بالطريقة هذه

أخيرا: انت اكتشتف ان الدوال تستطيع اعادة استخدامها، لكن لست الوحيد من احتاج هذه الدوال صحيح؟ أشخاص قبلك كتبوا مجموعة دوال و وضعوها في مكتبات modules و نشروها، الأفضل في مجال المصفوفات هي numpy و أغلب المكتبات الأخرى تعتمد عليها. و الله أعلم هذه المقالة العربية الوحيدة

بالنسبة للدالة I، أعتقد أنك كتبتها بتلك الطريقة لتقليل العمليات التي تُجرى، ففيما كتبت أنا يتم المرور على عناصر المصفوفة بأكملها لمقارنة إذا كانت i=j، لكن بهذه الطريقة تستهدف عناصر القطر الرئيسي بشكل مباشر.

بالطبع أعلم أن هذه الوظائف كُتبت لها دوال قبلًا وبطرق أفضل من هذه، لكن غرضي الأساسي لم يكن الوظائف نفسها قدرما كان التدرب على الخوارزميات وتصميمها.

بالنسبة لباقي الملاحظات سأحاول الاستفادة منها قدر المستطاع لكي أحسن من نفسي فيما بعد.

في النهاية أنا حقًا لن تسعني الكلمات لأوفي شكرك على ما كتبت! شكرًا جزيلًا لك يا رفيق :)