وظائف البناء في وحدة التحكم. الجزء 2 (الجدول الزمني)

بدأ البدء

الصورة

آخر مرة استقرت فيها على بناء جدول قيم الدوال. لقد حان الوقت للمضي قدما في بناء الجدول الزمني نفسه ، الذي بدأ كل هذا في الواقع.

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

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

بعد ذلك ، نحسب موضع المحور x بالنسبة لمحور اللاعبين ، أي أننا ننظر إلى المكان الذي سيكون لدينا نقطة (x ، 0). حسنًا ، سنقوم بتعيين قيمة الدالة y1 سطرًا تلو الآخر في هذه المرحلة.

دعنا نذهب

أولاً ، نحتاج إلى الصيغة التالية:

نسبة الدولار = (الحد الأقصى (ص 1) - الحد الأدنى (ص 1)) / (80) دولار



سنخصص 80 منصبًا للجدول الزمني نفسه ، وسوف يتم تزيين المكانين المتبقيين بحتة. باستخدام هذه الصيغة ، نجد مجموعة القيم التي تتوافق مع موضع واحد في مخططنا. ثم يمكننا تحديد النقطة الحالية بشكل صحيح.

تم توضيح الأفكار الرئيسية ، لذلك دعنا ننتقل إلى الكود نفسه

dial_length = 12 label = "  y1 = x**3 - 2*x**2 + 4*x - 8" print("{1:>{0}}".format(len(label) + dial_length, label), '\n') print("{aux[1]:>{aux[0]}}\n {aux[2]:>{aux[0]}}>\n".format(aux = [dial_length + 82, 'y' , 82*'-'])); 

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

 print("{1:>{0}}".format(len(label) + dial_length, label), '\n') 

الوحدة مسؤولة عن عدد العنصر الذي تم تمريره كوسيطة لوظيفة التنسيق ، أي أنه "رابط" (وليس حرفيا) لمتغير التسمية ، الذي نعرضه بالفعل على الشاشة. يذهب الترقيم تمامًا كما هو الحال في الأوراق - من نقطة الصفر.

زوج من الأحرف :> يستخدم لمحاذاة النص المعروض على الجانب الأيمن. حسنًا ، {0} بعد الحرف > مطلوب لتحديد عدد مواضع الخط التي تحتاجها.

هذا هو ، في هذه الحالة ، نحتفظ بعلامات تسمية الخط len (label) + dial_length والمواضع نفسها لا تستغرق سوى len (label) ، ونقوم بمحاذاة النص على الجانب الأيمن داخل مجموعة هذه المواضع.

 print("{1:>{0}}".format(len(label) + dial_length, label), '\n') print(dial_length*' ' + label, '\n') 

هذه الخطوط متكافئة


نعم ، بالنسبة للسلاسل ، ربما يكون من الأسهل استخدام الخيار الثاني ، ولكن تطبيق الخيار الأول للتطوير العام لن يضر)

 print("{aux[1]:>{aux[0]}}\n {aux[2]:>{aux[0]}}>\n".format(aux = [dial_length + 82, 'y' , 82*'-'])); 

حتى الصفائف من نوع r_value (في C ++) يمكن تكديسها في تنسيق ، أي يتم إنشاؤها مباشرة عند تمرير وسيطة.

نقوم بإصلاح المتغيرات الثابتة معنا ، أي أنها لا تعتمد على القيمة الحالية للدالة.

في الثعبان ، لا يوجد ثوابت شرطية لتعيين الثوابت ، لذلك من المعتاد استدعاء هذه المتغيرات بأحرف كبيرة ولا تغيرها.

 MAX_Y1_VALUE_DIFFERENCE = (max_y1_value - min_y1_value) + \ (max_y1_value == min_y1_value) RATIO = MAX_Y1_VALUE_DIFFERENCE / 80 AXIS_X_POS = abs(int((- min_y1_value) / RATIO)) if (AXIS_X_POS > 80): AXIS_X_POS = 81 

نظرًا لأن RATIO لأسباب واضحة لا يمكن أن تساوي 0 ، يجب أن يكون MAX_Y1_VALUE_DIFFERENCE رقمًا موجبًا. هذا هو السبب في أن المصطلح الثاني على الجانب الأيمن من المهمة.

موضع المحور x الذي نحسبه بالصيغة

80 دولارًا أمريكيًا (y1 (x) - دقيقة (y1)) / (الحد الأقصى (y1) - دقيقة (y1)) $



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

نظرًا لأننا مهتمون بالموضع عند y1 (x) = 0 ، فإننا نستبدل القيم الضرورية والصوت في الصيغة.

يمكنك الآن الانتقال مباشرة إلى قيم الطباعة

 while (is_sequence_decreasing and from_x >= to_x) or \ (not is_sequence_decreasing and from_x <= to_x): y1_cur_value = y1(from_x) cur_y1_value_and_min_difference = (y1_cur_value - min_y1_value) + \ (y1_cur_value == min_y1_value) * \ ((max_y1_value == min_y1_value)) pos_of_y = int(cur_y1_value_and_min_difference * 80 / \ MAX_Y1_VALUE_DIFFERENCE) 

الدورة مألوفة لنا بالفعل. سيتعين علينا حساب كل قيمة للوظيفة مرة ثانية حتى لا نخزنها في ورقة أو أي شيء آخر.

يتم احتساب موقف اللعبة من الصيغة السابقة.

سيتعين علينا إصلاح الاختلاف العلوي عن الصيغة ، مع مراعاة الحالة عندما نحصل في الصيغة على عدم اليقين من النموذج صفر بصفر. إذا ظهر مثل هذا الشك ، فهذا يعني أن القيمة الحالية هي y1 (x) = max (y1) ، مما يعني أن القيمة الحالية للعبة ستتزامن مع نهاية المحور y.

  print("{1:^{0}.6g}".format(dial_length, from_x), end='') if (negative_value_exists): if y1_cur_value <= 0 - RATIO / 2: req_aux = AXIS_X_POS - pos_of_y if (req_aux != 0): print(pos_of_y * ' ' + '*' + (req_aux - 1) * ' ' + '|') else: print((AXIS_X_POS - 1) * ' ' + '*' + '|') elif y1_cur_value >= 0 + RATIO / 2: req_aux = pos_of_y - AXIS_X_POS if (req_aux != 0): print(AXIS_X_POS * ' ' + '|' + (req_aux - 1) * ' ' + '*') else: print((AXIS_X_POS) * ' ' + '|*') else: print(AXIS_X_POS * ' ' + '*') else: print('|' + pos_of_y* ' ' + '*') AXIS_X_POS = 0 from_x += pace_x print((dial_length + AXIS_X_POS) * ' ' + '|\n', (dial_length + AXIS_X_POS - 3) * ' ' + 'x V') 

هذا الجزء من الكود مسؤول مباشرة عن طباعة الرسم البياني نفسه.

 print("{1:^{0}.6g}".format(dial_length, from_x), end='') 

هنا ، كان التنسيق مفيدًا للغاية وبسّط الرمز. ^ يسمح لنا بمحاذاة الرقم في وسط المنطقة المحددة (في هذه الحالة ، 12 موضعًا). g مسؤولة عن الأرقام - إذا لم يكن لها جزء كسري ، فلن تتم طباعتها (الرقم مثل int) ، وإلا - 6 منازل عشرية

نظرًا لأن الرسم البياني الخاص بنا يقتصر على مساحة 80 حرفًا على طول المحور y ، فإن قيمة الوظيفة عند النقطة تتطابق على الرسم البياني الخاص بنا مع المحور x ليس فقط في الحالة y1 (x) = 0 ، ولكن أيضًا في الحي [0 - RATIO / 2 ، 0 + RATIO / 2].

في المجموع ، لدينا ثلاث حالات لموقع العلامة النجمية (أي النقطة) والعصا العمودية (أي المحور x): "* |" (y1 (x) <= 0 - RATIO / 2) ، '*' (0 - RATIO / 2 <y1 (x) <0 + RATIO / 2) ، '| *' (y1 (x)> = 0 + RATIO / 2) ، سننظر في هذه الحالات الثلاث.

  1. ص 1 (س) <= 0 - النسبة / 2
    في هذه الحالة ، تقع النقطة على المحور x ، لذلك نحن نبحث عن المسافة من النقطة إلى المحور في المسافات. بسبب تقريب الأرقام ، قد يحدث أن تتزامن قيم المتغيرات AXIS_X_POS و pos_of_y. لكن هذا لا يمكن أن يكون ، لأنه في هذه الحالة سنكون في الحالة الثالثة. في حالتنا ، لا تتطابق النقطة مع المحور x ، لذلك يلزم وجود شرط إضافي ، والذي سيقلل بمقدار 1 المتغير pos_of_y في حالة المساواة.
  2. y (x)> = 0 + RATIO / 2
    الحالة مطابقة للحالة الأولى ، لن يتم وضع سوى النقطة على الجانب الآخر من المحور x ويتم تعديل جميع الإجراءات المذكورة أعلاه لهذا
  3. الباقي
    الحالة الأبسط - ما عليك سوى طباعة علامة النجمة بدلاً من المحور

هذا إذا كان لدينا قيم سالبة (y1 (x) <0). إذا لم يكن الأمر كذلك ، فما عليك سوى كتابة "|" وتحديد موضع النقطة.

حسنًا ، ننهي البرنامج بمحور X إضافي.

لذا ، الرمز الذي انتهى به الأمر:

 dial_length = 12 label = "  y1 = x**3 - 2*x**2 + 4*x - 8" print("{1:^{0}.6f}".format(dial_length, x_copy)) print("{1:>{0}}".format(len(label) + dial_length, label), '\n') print("{aux[1]:>{aux[0]}}\n {aux[2]:>{aux[0]}}>\n".format(aux = [dial_length + 81, 'y' , 82*'-']), end=''); MAX_Y1_VALUE_DIFFERENCE = (max_y1_value - min_y1_value) + \ (max_y1_value == min_y1_value) RATIO = MAX_Y1_VALUE_DIFFERENCE / 80 AXIS_X_POS = abs(int((- min_y1_value) / RATIO)) if (AXIS_X_POS > 80): AXIS_X_POS = 81 while (is_sequence_decreasing and from_x >= to_x) or \ (not is_sequence_decreasing and from_x <= to_x): y1_cur_value = y1(from_x) cur_y1_value_and_min_difference = (y1_cur_value - min_y1_value) + \ (y1_cur_value == min_y1_value) * \ ((max_y1_value == min_y1_value)) pos_of_y = int(cur_y1_value_and_min_difference * 80 / \ MAX_Y1_VALUE_DIFFERENCE) print("{1:^{0}.6g}".format(dial_length, from_x), end='') if (negative_value_exists): if y1_cur_value <= 0 - RATIO / 2: req_aux = AXIS_X_POS - pos_of_y if (req_aux != 0): print(pos_of_y * ' ' + '*' + (req_aux - 1) * ' ' + '|') else: print((AXIS_X_POS - 1) * ' ' + '*' + '|') elif y1_cur_value >= 0 + RATIO / 2: req_aux = pos_of_y - AXIS_X_POS if (req_aux != 0): print(AXIS_X_POS * ' ' + '|' + (req_aux - 1) * ' ' + '*') else: print((AXIS_X_POS) * ' ' + '|*') else: print(AXIS_X_POS * ' ' + '*') else: print('|' + pos_of_y* ' ' + '*') AXIS_X_POS = 0 from_x += pace_x print((dial_length + AXIS_X_POS) * ' ' + '|\n', (dial_length + AXIS_X_POS - 3) * ' ' + 'x V') 

قم بتشغيل البرنامج على عدة اختبارات

الصورة
الصورة
الصورة
الصورة

يعمل)

الصورة

Source: https://habr.com/ru/post/ar426519/


All Articles