コンソールで機能を構築します。 パート2(スケジュール)

開始しました



画像



前回、関数値のテーブルを作成することに決めました。 スケジュール自体の構築に進む時が来ましたが、実際にはこのすべてが始まりました。



したがって、主なアイデアは次のとおりです。 座標軸を時計回りに90度回転します。 これは、シートの各ポイントに関するデータを保存せずに構成を簡素化するために必要です。



次に、チャートを読みやすくするために、ゲームの座標軸を82文字に制限します。 そうすることで正確さを失い、特に「クールな」機能の場合、スケジュールがより概略的になりすぎます(きつすぎます)が、それでもなおそうです。



その後、プレーヤーの軸に対するx軸の位置を計算します。つまり、ポイント(x、0)がある場所を調べます。 それでは、この時点で行ごとに関数y1の値をxに割り当てます。



行こう



まず、次の式が必要です。





=y1y1/80









スケジュール自体に80のポジションを与え、残りの2つの場所は純粋に装飾的なものにします。 この式を使用して、チャートの1つの位置に対応する値の範囲を見つけます。 その後、現在のポイントを正しくマークできます。



主なアイデアは概説されているので、コード自体に移りましょう



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*'-']));
      
      





最初の部分へのコメントのおかげを含めて、 formatなどのことを学びました 。 タンバリンで踊るよりも本当に便利に思えたので、インデントを計算するコードの大部分は数行になりました



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





ユニットは、フォーマット関数に引数として渡される要素の数に責任があります。つまり、実際に画面に表示されるラベル変数への「文字通り」ではなく「リンク」です。 番号付けはシートの場合とまったく同じです-最初から。



文字のペア:>は 、表示されたテキストを右側に揃えるために使用されます。 必要な行位置の数を決定するには、 >文字の後の{0}が必要です。



つまり、この場合、ラインラベルlen(ラベル)+ dial_lengthの位置を予約し、ラベル自体はlen(ラベル)のみを取り、これらの位置のセット内の右側にテキストを配置します。



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





これらの行は同等です





はい、文字列の場合、おそらく2番目のオプションを使用する方が簡単ですが、最初のオプションを一般的な開発に適用しても問題はありません)



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





(C ++の)r_value型の配列でさえ、フォーマットに詰め込むことができます。つまり、引数を渡すときに直接作成できます。



定数である変数を修正します。つまり、関数の現在の値に依存しません。



Pythonでは、定数を指定するための条件付きconstはありません。そのため、このような変数を大文字で呼び出して、変更しないでください。



 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は正の数でなければなりません。 そのため、2番目の用語は割り当ての右側にあります。



式で計算するx軸の位置





80y1xy1/y1y1









この式はどこから来たのですか? 単純に、軸の先頭(min(y1))から関数の現在の値(y1(x))までのセグメント(ゲームの軸上)と、軸の先頭から末尾(max(y1))までのセグメントの比率を計算します。 さて、この比率に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桁



グラフはy軸に沿って80文字のスペースに制限されているため、グラフ上でポイントの関数の値は、y1(x)= 0の場合だけでなく、[0-RATIO / 2、0 + RATIO / 2]。



合計で、アスタリスク(つまり、ポイント)と垂直スティック(つまり、x軸)の配置の3つのケースがあります。 '* |' (y1(x)<= 0-RATIO / 2)、 '*'(0-RATIO / 2 <y1(x)<0 + RATIO / 2)、 '| *'(y1(x)> = 0 + RATIO / 2)、これら3つのケースを検討します。



  1. y1(x)<= 0-比率/ 2

    この場合、ポイントはx軸にあるため、スペースからポイントから軸までの距離を探します。 数値の丸めにより、変数AXIS_X_POSとpos_of_yの値が一致する場合があります。 ただし、この場合は3番目のケースになるため、これは不可能です。 この場合、ポイントはx軸と一致しないため、追加の条件が必要です。これにより、等しい場合に変数pos_of_yが1減少します。
  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')
      
      





いくつかのテストでプログラムを実行する



画像

画像

画像

画像



動作します)



画像







All Articles