مسائل في التغليف والتعميم وإعادة الهيكلة

لتكون المسائل قريبة من الحسّ والبصر، سنستخدم مكتبة jupyturtle كما في دفتر التطبيقات.

التهيئة: ثبّت الحزمة إن لزم، ثم نفّذ خلية الاستيراد التالية قبل الحلول.

بعد كل تمرين (حيث يظهر عنوان اختبار مرئي) نفّذ الخلية البرمجية التالية لترى إن كان رسمك يطابق المتوقع.

uv add jupyturtle
import math
from jupyturtle import (
    Turtle,
    make_turtle,
)

المتغير delay يتم تمريره للتحكم بسرعة الرسم:

# Control speed of drawing
fps = 10
delay = 1 / fps

1. رسم مستطيل

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

المطلوب: نفّذ الدالة rectangle(t, width, height) لترسم مستطيلًا بالأطوال المعطاة.

def rectangle(t: Turtle, width: float, height: float) -> None:
    pass

اختبار مرئي: نفّذ الخلية التالية بعد إكمال rectangle.

t = make_turtle(delay=delay)
rectangle(t, 80, 40)

2. رسم معين

الفكرة: المَعِين يُرسم بمدّ متعاقبة مع زاويتي انعطاف متكاملتين (تكملان 180°).

المطلوب: نفّذ الدالة rhombus(t, length, angle) لترسم معينًا بطول ضلع length وزاوية داخلية angle (بالدرجات).

def rhombus(t: Turtle, length: float, angle: float) -> None:
    pass

اختبار مرئي: نفّذ الخلية التالية بعد إكمال rhombus.

t = make_turtle(delay=delay)
rhombus(t, 70, 60)

3. تعميم بمتوازي أضلاع

الفكرة: أعد استخدام منطق الرسم المشترك بين أشكال متعددة.

المطلوب: نفّذ parallelogram(t, side1, side2, angle)، ثم أعد كتابة rectangle وrhombus بحيث تستدعيان parallelogram (المستطيل معين بزاوية 90°، والمعين بضلعين متساويين).

def parallelogram(t: Turtle, side1: float, side2: float, angle: float) -> None:
    pass


def rectangle(t: Turtle, width: float, height: float) -> None:
    pass


def rhombus(t: Turtle, length: float, angle: float) -> None:
    pass

اختبار مرئي: مستطيل، ثم معين، ثم متوازي أضلاع عام — بعد إكمال التعريفات الثلاثة.

t = make_turtle(delay=delay, width=400)

t.pen_up()
t.forward(-120)
t.pen_down()
rectangle(t, 80, 40)

t.pen_up()
t.forward(100)
t.pen_down()
rhombus(t, 50, 60)

t.pen_up()
t.forward(80)
t.pen_down()
parallelogram(t, 80, 50, 60)

4. دالة القفز jump

الفكرة: اجمع تسلسلًا متكررًا من أوامر السلحفاة في دالة واحدة.

المطلوب: اكتب الدالة jump(t, length) التي تنفّذ بالترتيب: pen_up() ثم forward(length) ثم pen_down() — بحيث تتحرك بمسافة length دون رسم، وتنتهي والقلم للأسفل.

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

def jump(t: Turtle, length: float) -> None:
    pass

اختبار مرئي: نفس الأشكال السابقة باستخدام jump بدل تكرار pen_up / pen_down.

t = make_turtle(
    delay=delay,
    width=400,
)

jump(t, -120)
rectangle(t, 80, 40)

jump(t, 100)
rhombus(t, 50, 60)

jump(t, 80)
parallelogram(t, 80, 50, 60)

5. «فطيرة» من مثلثات متكررة

الفكرة: ابنِ شكلًا أكبر بتكرار أداة رسم صغيرة (قطعة مثلثية).

المطلوب:

  1. نفّذ triangle(t, r, angle) لترسم قطعة مثلثية واحدة (كما في النص الأصلي للفصل).
  2. نفّذ draw_pie(t, n, r) لتكرار هذه القطعة n مرّة وتكوين فطيرة كاملة.
def triangle(t: Turtle, r: float, angle: float) -> None:
    pass


def draw_pie(t: Turtle, n: int, r: float) -> None:
    pass

اختبار مرئي (مثلث واحد): نُسرّع الرسم بقيمة delay أصغر.

tri_fps = 40
tri_delay = 1 / tri_fps
t_tri = make_turtle(delay=tri_delay)
triangle(t_tri, 60, 20)

اختبار مرئي (فطائر): ثلاث فطائر بأعداد أضلاع مختلفة؛ يفترض أن تكون jump قد عرّفتَها في التمرين السابق.

size = 40
margin = 2 * size + 20

t = make_turtle(
    delay=delay,
    width=50 + (size + margin) * 3,
)

t.pen_up()
t.forward(-80)
t.pen_down()

draw_pie(t, 5, size)

jump(t, margin)
draw_pie(t, 6, size)

jump(t, margin)
draw_pie(t, 7, size)

6. زهرة بأوراق

الفكرة: اجمع زهرة كاملة بتكرار رسم ورقة واحدة.

المطلوب: باستخدام الدالة arc المعطاة في الخلية التالية، نفّذ petal(t, r, angle) لرسم ورقة واحدة، ثم flower(t, n, r, angle) لتجميع n ورقة في زهرة.

def arc(t: Turtle, r: float, angle: float) -> None:
    for i in range(r):
        t.forward(r, i * 2)

اختبار مرئي: الدالة arc المعطاة (مرجع قبل رسم الورقة).

t = make_turtle(delay=delay)
arc(t, 10, 36)
def petal(t: Turtle, r: float, angle: float) -> None:
    pass


def flower(t: Turtle, n: int, r: float, angle: float) -> None:
    pass

اختبار مرئي: ورقة واحدة بـ petal.

t = make_turtle(delay=delay)
petal(t, 10, 36)

اختبار مرئي: زهرة كاملة؛ لوحة أكبر كما في دفتر الفصل.

t = make_turtle(
    delay=delay,
    height=400,
    width=400,
)
flower(t, 8, 10, 36)

7. حلزون

البرنامج التالي (من نفس الفصل) يوضّح رسم مضلّع ودائرة تقريبية باستخدام السلحفاة — اقرأه كسياق، ثم انتقل للمطلوب.

المطلوب: اكتب الدالة spiral(t, n, length, gap) التي ترسم حلزونًا: في كل خطوة تمشي length ثم تنعطف بزاوية ثابتة، وتزيد length بمقدار gap للخطوة التالية (كرر n مرّة).

def polygon(t: Turtle, n: int, length: float) -> None:
    angle = 360 / n
    for i in range(n):
        t.forward(length)
        t.left(angle)


def circle(t: Turtle, radius: float) -> None:
    circumference = 2 * math.pi * radius
    n = 10
    length = circumference / n
    polygon(t, n, length)


# مثال: t = make_turtle(delay=delay); t.jump_to(120, 120); circle(t, 60)

اختبار مرئي (اختياري): دائرة تقريبية باستخدام polygon وcircle من خلية السياق.

t = make_turtle(delay=delay)
t.jump_to(120, 120)
circle(t, 60)
def spiral(t: Turtle, n: int, length: float, gap: float) -> None:
    pass

اختبار مرئي: الحلزون بعد إكمال spiral.

t = make_turtle(delay=delay)
spiral(t, 50, 5, 0.2)