2017-05-19 4 views
2

私は大学のコンピュータ科学の課題に取り組んでいます。私は数ヶ月しかPythonプログラミングを学んでいません。 私の割り当ての目的は次のとおりです。与えられた関数f(x)のテキストベースのグラフを描くにはどうすればよいですか?

数学的関数f(x)のテキストベースのグラフを描画するプログラムを作成します。 -10から10までの軸の限界値を使用し、離散点、すなわち整数値の縦軸の点をプロットします。

サンプルI/O:

Enter a function f(x): 
x+2 
      |  o 
      |  o 
      |  o 
      | o 
      | o 
      | o 
      | o 
      |o 
      o 
     o| 
--------o-+---------- 
     o | 
     o | 
    o | 
    o  | 
    o  | 
    o  | 
o  | 
o   | 
      | 
      | 

これまでのところ、私はグラフの面積とネストforループを使用して軸を作成するために管理しています。ここでは現時点では私のコードは、(私が不要または不完全な行をコメントアウトしている)である:

import math 

#f = input("Enter a function f(x):\n") 

for row in range (0, 21): 
    for col in range (0, 21): 

     #eval(f) 

     #if f == y: 
     # print ("o", end="") 
     if row == 10 and col == 10: 
      print ("+", end="") 
     elif row == 10: 
      print ("-", end="") 
     elif col == 10: 
      print ("|", end="") 
     else: 
      print (" ", end="") 
    print() 

私のコードは悪いスタートではありません以下、生成:

  |  
      |  
      |  
      |  
      | 
      | 
      | 
      | 
      | 
      | 
----------+---------- 
      | 
      | 
      | 
      | 
      | 
      | 
      | 
      | 
      | 
      | 

をしかし、今、私は」私の質問は、私の軸の中にある関数をどのように描くのですか?

これは私が持っている主なアイデアです:私は空白を交換する必要が

  • /私は任意の助けをいただければ幸い与えられた機能が

をプロットする必要があります'o'を軸!

+1

x = -10〜10の関数を実行し、結果を整数に丸めて結果のリストを返すメソッドにパラメータとして関数を渡すことができます。次にyの値のリストを取得しますプロット –

答えて

0

最初に関数を定義してから、プロットループにo点を含めます。

def f(x): 
    return 2*x 

for row in range (0, 21): 
    for col in range (0, 21): 


     if row == -f(col-10) + 10: 
      print ("o", end="") 
     elif row == 10 and col == 10: 
      print ("+", end="") 
     elif row == 10: 
      print ("-", end="") 
     elif col == 10: 
      print ("|", end="") 
     else: 
      print (" ", end="") 


    print() 

これは、一次関数のために働く - あなたは左上から軸を定義しているので、代わりに中央の、あなたは正しくプロットするために他のグラフを取得するための変換を調整する必要があります。

+0

あなたの 'if'ブロックインデントがうまくいきません。また、これはデータをプロットするのがひどく非効率的な方法です - 現在の点が 'o'やその他の文字を出力するかどうかを確認するために、グラフ上のすべての点について' f(x) 'を呼び出すことになります。 – zwer

+0

ブロックが修正されました。 – TMrtSmith

+0

@zwer OPは彼の機能に助けを求めています。これは私が答えたものです。この場合、彼はすでに行っているよりももう1つのチェックだけです。 – TMrtSmith

1

この猫には多くの方法があります。最もコンパクトなのはおそらく、関数の逆転(すべてのf(x)を取得して、結果に対応する線または空のグリッド線を手続き的に描画する)ですが、最も柔軟性が低く、プロットできるだけです線形関数。 TMrtSmithの答えで示されているように、あなたが試みている手続き的方法も非常に非効率的です。

グリッドの作成とプロットを別々の手順に分割する方がよいでしょう。これはいくつかの方法で行うこともできますが、次の手順ではSTDOUTに頼らないことができます。グリッドを生成することは非常に簡単です:

grid = [] # we'll use a list to store the individual rows 
for y in range(-10, 11): 
    if y != 0: 
     grid.append("|".center(21)) 
    else: 
     grid.append("+".center(21, "-")) 

は今、あなたが必要とするすべては、各マッチンググリッドライン上の文字を置き換えることで、このグリッドの上にあなたの関数をプロットすることである。その後、

for x in range(-10, 11): 
    value = int(f(x)) # get the function result as int, you can call any other function of course 
    if -10 <= value <= 10: # no reason to plot outside of our grid range 
     x = x + 10 # normalize x to the grid 
     y = 10 - value # normalize y to the grid 
     grid_line = grid[y] 
     grid[y] = grid_line[:x] + "o" + grid_line[x+1:] 

そして、残っているすべてのあなたがコンソールにそれを表示したい場合は、グリッドを印刷することである。

for row in grid: 
    print(grid) 

それとも、あなたはグリッドに新しい行を追加し、それを印刷し、それを保存、それを送信することができ、文字列としてそれを維持したい場合、d O君はそれで好き:に結果の

def f(x): 
    return x + 2 

baked_grid = "\n".join(grid) 
print(baked_grid) 

それはのような線形関数をプロットだけでなく

  |  o 
      |  o 
      |  o  
      | o  
      | o  
      | o  
      | o   
      |o   
      o   
     o|   
--------o-+---------- 
     o |   
     o |   
    o |   
    o  |   
    o  |   
    o  |   
o  |   
o   |   
      |   
      |   

しかし、また、非線形関数で動作します例えば、

import math 

def f(x): 
    return math.sqrt(abs(10 - x * x)) - 5 
  |   
      |   
      |   
      |   
      |   
      |   
o   |   o 
o  |  o 
    o  |  o 
    o  |  o 
----o-----+-----o---- 
    o o o  
     o oo|oo o  
      |   
     o | o  
      |   
      |   
      |   
      |   
      |   
      |   

そして、私はあなたが最大効率のために、その場合には代わりにrangexrangeを使用することをお勧めしたいが、それは、同様のPython 2.6+で動作しますボーナスとして:のでの結果。

0

回答をいただき、ありがとうございました。私は、次のコードでプログラムを完了するために管理:

import math 

function = input("Enter a function f(x):\n") 

for y in range (10, -11, -1): 
    for x in range (-10, 11): 
     f = round(eval(function)) 
     if x == 0 and y == 0 and y != f: 
      print ("+", end="") 
     elif y == 0 and y != f: 
      print ("-", end="") 
     elif x == 0 and y != f: 
      print ("|", end="") 
     elif y == f: 
      print ("o", end="") 
     else: 
      print (" ", end="") 
    print() 

私は機能fyに等しいoを印刷するには、別のelifのステートメントを追加しました。また、ifステートメントでy != xを使用して、軸がグラフを上書きしないようにしました。

変数colrowをそれぞれxyに変更しました(thanks @zwer)。私はまた、左上ではなく中央からグラフを再定義したので、非線形関数でも動作します(@TMrtSmithに感謝します)。

これが最も効率的な方法であるかどうかはわかりませんが、うまくいきます。 @zwer、私はあなたのコードを動作させることができませんでした(私はそれが私の現在のスキルレベルを超えていると思う)が、それはそれにもかかわらず役に立ちました。

入力x**2リターン:

  |   
     o | o  
      |   
      |   
      |   
      |   
     o | o   
      |   
      |   
     o|o   
----------o---------- 
      |   
      |   
      |   
      |   
      |   
      |   
      |   
      |   
      |   
      |   

問題を解決しました!ありがとう!

関連する問題