プログラミング入門II
7月16日の提出状況

Back to index page



  1. 7月16日の提出状況

  2. 前回の宿題について

    今回見ていて不思議だったのは普段ならコメント行など入れないような人たちがコメントを入れていたことと,難しいので無理に使わなくても良いFuncAnimationの利用の方が多かったことでした.これはどう見ても検索したり,生成AIに頼んだりしたとしか思えないのですが,まともに動くものであればとりあえず採点はしました.ただ,それではなかなか力がつかないのでなんだかなあと思ってしまいました.

    もう一点は,特に終わり方を指定していなかったので,描画が終わるとウィンドウを閉じる操作が入っているものが多かったことが気になりました.特に問題では無いのですが,消えてしまうので,採点が大変でした.最後は静止して表示したままと指定しておけばよかったと自分で後悔しました.

    まずは,形式的な問題ですが,以下のようなものがありました.

    • 解答用紙不使用: 24_44
    • 解答用紙の番号と氏名がデフォルトのまま: 21_57
    • アニメーションに学生番号の出力なし: 24_47
    • アニメーションになっていない: 22_65

    以下は例によって問題のあるプログラムの例です.参考にしてください.

    
    # ------ End of text -------
    r = randint(4, 8)
    
    theta = np.linspace(0, 2 * np.pi + 0.1, 300)
    
    fig, ax = plt.subplots()
    ax.set_aspect('equal', adjustable='box')
    ax.set_xlim(-9, 9)
    ax.set_ylim(-9, 9)
    ax.grid()  
    ax.xaxis.set_major_locator(MaxNLocator(integer=True)) 
    ax.yaxis.set_major_locator(MaxNLocator(integer=True))
    
    line, = ax.plot([], [], 'b-', linewidth=2)
    text = ax.text(-8, 8, '', fontsize=12)
    
    def init():
        line.set_data([], [])
        text.set_text('')
        return line, text
    
    def update(frame):
        x = r * np.cos(theta[:frame])
        y = r * np.sin(theta[:frame])
        line.set_data(x, y)
        
        return line, text
    
    from matplotlib.animation import FuncAnimation
    ani = FuncAnimation(fig, update, frames=len(theta),
                        init_func=init, blit=True, interval=10, repeat=False)
    
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    
    ax.text(-8.5, 7, f'Circle of radius {r}\ns******', fontsize=10)
    
    plt.show()
    

    解答用紙にはここがテキストの終わりとちゃんとハイフンで記しているのに,なんでその後にプログラムを書くかなあ?

    xticks = [-8, -6, -4, -2, 0, 2, 4, 6, 8]
    yticks = [-8, -6, -4, -2, 0, 2, 4, 6, 8]
    

    こういう面倒なことはやめましょう.

    seed = random.randint(0, 999999)
    random.seed(seed)
    
    
    
    ax.text(-radius, radius * 0.95,
            f'Circle of radius {radius}\ns{seed}',
            fontsize=10, verticalalignment='top', 
    

    上のものはよくわからない乱数で学生番号を生成するという本当にわからない処理が入っています.誰がこんなことを教えてくれました?

    def make_data(frame):
        theta = np.linspace(0, 2.1 * np.pi * frame / 360)
        x = radius*np.cos(theta)
        y = radius*np.sin(theta)
        line.set_data(x, y)
        return line,
    

    上の例はアニメーション機能を使用しているのですが,360˚(2π)回ったところで終わるのではなく,無限に続く関数となっています.そのため,円周を描いた後,微妙な角度で少しずつずれていくため,以下のような描画が延々続きます.エヴァの使途みたいな感じで見ていて面白いのですが,プログラムとしてはダメです.

    他にも,上のようにテキストがはみ出したのもありました.

    最後は円周を2回表示した後,タイトルを描画させてそこに半径や学生番号を入れようとするというこちらの指定と違うことをやっているのですが,日本語を文字コードを指定せず挿入しているので,文字化けでした.


目次ページに戻る