Pythonすげえぇええ!!!【Python】【神戸大学】うりぼーねっとを用いて単位に関係する計算を行ってみた
題名の通りだが神戸大学教務情報システム「うりぼーねっと」を用いて
選択した単位のGP, 総単位数(total credit), GPAを計算するプログラムをPythonで書いてみた。
(一つだけ致命的な事で、うりぼーねっとの「単位数」という項目を用いて総単位数を計算しており、これにより修得単位数は一目でわかるようになるのだが、最後にGPAを計算する際に[GPA] = [GP] / [修得単位数]とのように計算を行っているので実際のGPAの計算式[GPA] = [GP] / [履修単位数]とは少し違った値が出てしまうが、うりぼーねっとの「単位数」のところに「履修単位数」ではなく「修得単位数」が表示されているのでこのプログラムはもう、そうゆう仕様のものとする。)
なぜ、このプログラムを実装しようとしたかというと
自分の所属している神戸大学情報知能工学科は
4回生にあがるときに研究室配属があるのだが全員が
自分の1番に希望している研究室に入れるわけではなく
専門科目のGP?(諸説あり)のように
何らかの成績から判断され優先権が決まるようなのだが
どうやら、専門科目が大きく研究室ポイント(自称)にかかわるらしい。
ちなみに、うりぼーねっとにも単位数とGPAは表示されているのだが
専門科目以外の成績も入っているために肝心の研究室ポイントがわからない。
そこで、情報知能工学科の学生は自分の研究室ポイントを計算すべく
計算をするかもしれないが、やはりそこは情知なので
機械に計算させるのがかっこいい!!
Man Powerじゃめんどくさいってのもあるけど
やっぱり、かっこいい!!ってので実装してみました。
ちなみに、Macでは動く事が確認されているので(自分周辺の機器のみw)
情知じゃない方もこの方法を使う事ができます。
結論:「ターミナル」があれば問題なし
実行方法は後に記述するとし、とりあえず件のプログラム
一度、「不可の後、もう一度単位を履修した」「取り消し」の処理が
うまくいってなかったのでそのプログラムを下に記す。
エラー内容としてはこうゆうエラーが出る。
gp.py:8: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if list[8] == u"*":
gp.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if list[8] == u"─":
〜改良前のプログラム〜
import sys #coding: UTF-8 f = open(sys.argv[1], 'r') gp = 0 num = 0 for row in f: list = row.split() if list[4] == u"*": continue if list[4] == u"─": continue num += float(list[4]) gp += float(list[8]) f.close() print "gp = %f" %(float(gp)) print "total credit = %f" %(float(num)) print "gpa = %f" %(float(gp/num))
最終的に正しいプログラム
〜performance.py〜
import sys #coding: UTF-8 f = open(sys.argv[1], 'r') gp = 0 num = 0 ex1 = str("*") ex2 = str("─") for row in f: list = row.split() if list[8] == ex1: continue if list[8] == ex2: continue num += float(list[4]) gp += float(list[8]) f.close() print "gp = %f" %(float(gp)) print "total credit = %f" %(float(num)) print "gpa = %f" %(float(gp/num))
〜専門科目のみの成績計算をするプログラム〜
gp_specific.py
import sys #coding: UTF-8 f = open(sys.argv[1], 'r') gp = 0 num = 0 ex1 = str("*") ex2 = str("─") sp = str("専門科目") for row in f: list = row.split() if list[8] == ex1: continue if list[8] == ex2: continue if list[1] != sp: continue num += float(list[4]) gp += float(list[8]) f.close() print "gp = %f" %(float(gp)) print "total credit = %f" %(float(num)) print "gpa = %f" %(float(gp/num))
上のエラーの取り除き方なのだが
こちらのブログを参考にさせていただいた
〜引用元〜
PythonのUnicodeEncodeErrorを知る - HDEラボ
解決法だけでなく原理まで知る事ができて非常に助かった。
以上がうりぼーねっとの成績表示から
必要な情報のみを抜き出して成績計算を行うプログラムである。
書いた後の感想「短い!!」「ひたすら短い!!」
Pythonさんすげえわwwコードが短すぎるw
これと同じ作業をjavaで書くと、俺なら60行は軽く使う気がするww
なんというか、プログラマの使用言語別年収ランキングで
Pythonが上位に食い込んでいる理由が理解できた
これだけコードを短くして実装ができると仕事が速い!!
仕事が速いと次の案件にもすぐ取りかかる事ができる!!
これからもPython使っていこう
他のプログラミング言語にも触れていこうと感じたいい機会だった。
実行方法
vimを用いて入力ファイルの生成(Macならいけるはず)
1.1 まず、うりぼーねっとで「単位修得状況紹介」のページを開く
そこで、計算したい教科を「NO」から「合否」までの部分を選択してコピーする。
(ここでの注意点は、選択をする際、最後に改行を入れない事である。もし、改行が入っているなら次の1.2での動作に一手間加える必要がある。)
1.2 実行ファイルのあるターミナル上で「vim performance.txt」を実行
(performance.txtは自分の好きな名前で良いがtxtファイル以外での動作が確認できていないので.txtは固定)
すると、vimが起動されて新しく先ほど指定した名前の(performance.txt)ファイルが生成され、何も書いていないファイルが開かれるはずである。
ターミナル上で「i」を押すと vimの insertモード(ファイル書き込みモード)に切り替わるので先ほどうりぼーねっとで選択してコピーした項目をペーストする。
(ここで、先ほどの1.1の作業で最後に改行を入れた人は最後の改行を消してから保存する)
1.3 vim performance.txtを保存する
はりつけが終了したら保存をおこなう。ターミナル上で「esc」キーをおしてから
「:wq」を押す。「:wq」はvimでファイルを保存する意味。
すると、ターミナルのいつもの画面に戻る。
2. pythonの実行
pythonはインタプリタ型の言語なのでコンパイルと実行が同時に行われる(その辺は、曖昧だがそういう解釈) ので
早速、ターミナル上で「python performance.py performance.txt」として実行
「performance.txt」はコマンドライン引数。
すると、実行結果(例)
seiya-no-MacBook-Pro:python seiya$ python gp.py gra7.txt
gp = 86.700000
total credit = 21.000000
gpa = 4.128571
こんな感じででる。