実現したいこと
・既に登録済みのペンギンの場合にペンギンの数を加算し、平均体長を更新するようにしたい
前提
大学のPythonの課題で、入力されたペンギンを記録していくシステム作っています。
指定された機能を満たす関数を作らなければいけません。
追加しなければならない機能は以下です。
・プログラムを実行後,最初に記録可能な最大のペンギンの種類数を入力できるようにする
・上記の数値を入力後に,発見したペンギンの情報を入力できるようにすること.なお発見したペンギンの情報は,ペンギンの種類名,見つけた数,そのペンギンたちの平均体長(単位は cm)の順に入力できるようにする
・新しい種類のペンギンが入力された場合は,新しいペンギンを発見したことを出力する
・既に登録済みの種類が入力された場合は,ペンギンの数の加算と平均体長の更新を行うようにする
・ペンギンの情報を入力した際に,ペンギンの種類数が上限を越えてしまう場合は,もう新しいペンギンの情報はこれ以上入力できないことを出力する
・ペンギンの登録時に”+”(半角英数のプラスを 1 文字だけ)を入力すると,その時点での記録を保存できるように
せよ.さらに,登録したペンギンの種類毎の平均体長を発見順に出力する
・ ペンギンの種類名に”-”(半角英数のマイナスを 1 文字だけ)を入力すると,登録終了となるようにする
・ 登録終了後は,発見したペンギンの種類,発見順,ならびに発見数を,発見数の多い順(同数の場合は,発見
の早い順)に実行例のような形式のヒストグラム(n 羽につき#を 1 個出力)で出力する。この際,一目盛りあたり何羽にするか,つまり n の値を入力できるようにする
・ヒストグラムを出力した後に,記録の推移として,最後に保存した状態と,終了時の状態をいずれも発見順に表示する。表示形式は保存時の表示と同様にすること.もし保存を一度も行わない場合は,最後に保存した状態
については記録なしと表示する。
ほとんどの機能は満たすように作れたのですが、以下の機能がうまくできません。
・既に登録済みの種類が入力された場合は,ペンギンの数の加算と平均体長の更新を行うようにする
どなたかお力をお貸しください。
発生している問題・エラーメッセージ
ペンギンの種類が上限に達した後に、既に登録済みのペンギンを入力した場合、ペンギンの数を加算し、平均体長を更新するようにしたいのですが、新しいペンギンを入力するときのように「もう記録できないよぅ…」と返ってきてしまいます。
該当のソースコード
Python
12import sys 3 4class Penguin:5 def __init__(self, t: str, n: int, h: float):6 self.__type = t # 種類7 self.__num = n # 総数8 self.__height = h # 平均体調9 10 # 必要なメソッドを追加 〜ここより〜11 12 def getType(self):13 return self.__type 14 15 def getNum(self):16 return self.__num 17 18 def getHeight(self):19 return self.__height 20 21 def update(self, n, h):22 self.__num += n 23 self.__height = (self.__num * self.__height + n * h) / self.__num 24 25 26 # 必要なメソッドを追加 〜ここまで〜27 28class NoteBook:29 def __init__(self, n: int):30 self.max_num = n 31 self.p = [None] * n 32 self.num = 033 34 # 必要なメソッドを追加 〜ここより〜35 36 def compare(self, x: list):37 print("--途中の状態--")38 if x is not None:39 self.print(x)40 else:41 print("なし")42 print("--最後の状態--")43 self.print(self.p)44 45 def savePen(self):46 return list(self.p)47 48 def print(self, x: list):49 if x is None:50 print("なし")51 return52 53 for i, penguin in enumerate(x, start=1):54 if penguin is not None:55 t = penguin.getType()56 n = penguin.getNum()57 h = penguin.getHeight()58 print(f"{i}番目に見つかったのは,{t} [{n}羽] {h:.1f}cm/羽")59 60 if b.num < b.max_num:61 for i in range(b.num + 1, b.max_num + 1):62 print(f"{i}番目に見つかったのは,なし")63 64 def addPen(self, tp: str, nm: int, ht: float):65 if self.num >= self.max_num:66 return False67 68 found = False69 for i in range(self.num):70 if self.p[i].getType() == tp:71 found = True72 self.p[i].update(nm, ht)73 print(f"{tp}ペンギンが{self.p[i].getNum()}羽になりました.")74 break75 76 if not found:77 self.p[self.num] = Penguin(tp, nm, ht)78 self.num += 179 print("新しいペンギン(・θ・)発見!")80 81 return True82 83 84 85 86 def sortPen(self):87 s_p = []88 for penguin in self.p:89 if penguin is not None:90 s_p.append(penguin)91 92 for i in range(len(s_p)):93 for j in range(i + 1, len(s_p)):94 if (95 (s_p[i].getNum() < s_p[j].getNum()) or96 (s_p[i].getNum() == s_p[j].getNum() and97 s_p[i].getHeight() < s_p[j].getHeight())98 ):99 s_p[i], s_p[j] = s_p[j], s_p[i]100 101 return s_p 102 103 104 # 必要なメソッドを追加 〜ここまで〜105 106def histgram(x: list, r: int):107 for i in range(len(x)):108 t = x[i].getType()109 n = x[i].getNum()110 s = "#" * (n // r)111 print(s, " ε( ミ´・)> ", t, " [", n, "羽]", sep="")112 113 114print("ペンギン探しの旅に出かけよう♪")115max_num = int(input("何種類まで? => "))116if max_num <= 0:117 sys.exit()118b = NoteBook(max_num)119tp, nm, ht, s = None, None, None, None120tnh = input("何ペン? => ")121a = tnh.split()122if len(a) == 3:123 tp, nm, ht = a[0], int(a[1]), float(a[2])124elif tnh != "-" and tnh != "+":125 sys.exit()126while tnh != "-":127 if tnh == "+":128 s = b.savePen()129 print("途中経過を次の通り記録しました.")130 b.print(b.p)131 elif not b.addPen(tp, nm, ht):132 print("もう記録できないよぅ....")133 tnh = input("何ペン? => ")134 a = tnh.split()135 if len(a) == 3:136 tp, nm, ht = a[0], int(a[1]), float(a[2])137 elif tnh != "-" and tnh != "+":138 sys.exit()139print("ヒストグラムにしてみよう.")140r = int(input("1目盛りあたり何羽にしますか? => "))141x = b.sortPen()142histgram(x, r)143print("記録の推移")144b.compare(s)145print("おしまい.")146
試したこと
自分なりにプログラムを書いてみましたが、addPenメソッドとprintメソッドがおかしいと思います。
どなたかお力お貸しください。
このコードを実行した時の実行例
ペンギン探しの旅に出かけよう♪
何種類まで? => 4
何ペン? => F 10 40
新しいペンギン(・θ・)発見!
何ペン? => K 6 100
新しいペンギン(・θ・)発見!
何ペン? => A 6 60
新しいペンギン(・θ・)発見!
何ペン? => +
途中経過を次の通り記録しました.
1番目に見つかったのは,F [10羽] 40.0cm/羽
2番目に見つかったのは,K [6羽] 100.0cm/羽
3番目に見つかったのは,A [6羽] 60.0cm/羽
4番目に見つかったのは,なし
何ペン? => H 15 55
新しいペンギン(・θ・)発見!
何ペン? => E 3 95
もう記録できないよぅ....
何ペン? => A 15 50
もう記録できないよぅ....
何ペン? => -
ヒストグラムにしてみよう.
1目盛りあたり何羽にしますか? => 1
############### ε( ミ´・)> H [15羽]
########## ε( ミ´・)> F [10羽]
ε( ミ´・)> K [6羽]
ε( ミ´・)> A [6羽]
記録の推移
--途中の状態--
1番目に見つかったのは,F [10羽] 40.0cm/羽
2番目に見つかったのは,K [6羽] 100.0cm/羽
3番目に見つかったのは,A [6羽] 60.0cm/羽
--最後の状態--
1番目に見つかったのは,F [10羽] 40.0cm/羽
2番目に見つかったのは,K [6羽] 100.0cm/羽
3番目に見つかったのは,A [6羽] 60.0cm/羽
4番目に見つかったのは,H [15羽] 55.0cm/羽
おしまい.
正解の実行例
ペンギン探しの旅に出かけよう♪
何種類まで? => 4
何ペン? => F 10 40
新しいペンギン(・θ・)発見!
何ペン? => K 6 100
新しいペンギン(・θ・)発見!
何ペン? => A 6 60
新しいペンギン(・θ・)発見!
何ペン? => +
途中経過を次の通り記録しました.
1番目に見つかったのは,F [10羽] 40.0cm/羽
2番目に見つかったのは,K [6羽] 100.0cm/羽
3番目に見つかったのは,A [6羽] 60.0cm/羽
4番目に見つかったのは,なし
何ペン? => H 15 55
新しいペンギン(・θ・)発見!
何ペン? => E 3 95
もう記録できないよぅ....
何ペン? => A 15 50
Aペンギンが20羽になりました.
何ペン? => A 6 55
Aペンギンが26羽になりました.
何ペン? => F 8 45
Fペンギンが18羽になりました.
何ペン? => -
ヒストグラムにしてみよう.
1目盛りあたり何羽にしますか? => 1
######################### ε( ミ´・)> Adelie [25羽]
################## ε( ミ´・)> F [18羽]
############### ε( ミ´・)> H [15羽]
ε( ミ´・)> K [6羽]
記録の推移
--途中の状態--
1番目に見つかったのは,F [10羽] 40.0cm/羽
2番目に見つかったのは,K [6羽] 100.0cm/羽
3番目に見つかったのは,A [6羽] 60.0cm/羽
4番目に見つかったのは,なし
--最後の状態--
1番目に見つかったのは,F [18羽]
42.22222222222222cm/羽
2番目に見つかったのは,K [6羽] 100.0cm/羽
3番目に見つかったのは,A [26羽] 53.0cm/羽
4番目に見つかったのは,H [15羽] 55.0cm/羽
おしまい
追記 課題文
今日生存が確認されているペンギンは,少なくとも 18 種存在することが知られている.ペンギンは主に南半球に生息しているほか,世界各地の水族館や動物園でも飼育されている.これらの地方や施設を訪れる旅をした際,ペンギンを発見する度に種類名,数,平均体長を入力していくと,旅行の最後にこれまで発見したペンギンに関する情報を自動でまとめてくれるアプリがあると少なからず有用と思われる.そこで,作りかけのプログラム pency.py に以下の制約条件をすべて満たすよう,Penguinクラス,もしくはNoteBook クラスに必要なメソッドの定義を追加して,プログラムを完成させよ.
プログラムを実行後,最初に記録可能な最大のペンギンの種類数を入力できるようにせよ.
上記の数値を入力後に,発見したペンギンの情報を入力できるようにすること.なお発見したペンギンの情報は,ペンギンの種類名,見つけた数,そのペンギンたちの平均体長(単位は cm)の順に入力できるようにせよ.
新しい種類のペンギンが入力された場合は,新しいペンギンを発見したことを出力せよ.
既に登録済みの種類が入力された場合は,ペンギンの数の加算と平均体長の更新を行うようにせよ.
ペンギンの情報を入力した際に,ペンギンの種類数が上限を越えてしまう場合は,もう新しいペンギンの情報はこれ以上入力できないことを出力せよ.
ペンギンの登録時に”+”(半角英数のプラスを 1 文字だけ)を入力すると,その時点での記録を保存できるようにせよ.さらに,登録したペンギンの種類毎の平均体長を発見順に出力せよ.
ペンギンの種類名に”-”(半角英数のマイナスを 1 文字だけ)を入力すると,登録終了となるようにせよ.
登録終了後は,発見したペンギンの種類,発見順,ならびに発見数を,発見数の多い順(同数の場合は,発見
の早い順)に実行例のような形式のヒストグラム(n 羽につき#を 1 個出力)で出力せよ.この際,一目盛りあたり何羽にするか,つまり n の値を入力できるようにせよ.
ヒストグラムを出力した後に,記録の推移として,最後に保存した状態と,終了時の状態をいずれも発見順に表示せよ.表示形式は保存時の表示と同様にすること.もし保存を一度も行わな方場合は,最後に保存した状態
については記録なしと表示せよ.
プログラムの実装においては,Penguin クラスおよび NoteBook クラスへのメソッドの定義の追加以外はしないこと.これらのクラスに新たなメンバ変数やクラス変数を追加してはならない.また,既存のメンバ変数を変更してはならない.
Penguin クラスおよび NoteBook クラスへ追加するメソッドでは,メソッドが属するクラスのメンバ変数,メソッド内で定義するローカル変数,ならびに仮引数で宣言した変数以外は使用してはならない.
Penguin クラスおよび NoteBook クラス以外の部分は一切変更してはならない.
追記 雛形
import sys class Penguin : def __init__(self, t : str, n : int, h : float) : self.__type = t # 種類 self.__num = n # 総数 self.__height = h # 平均体調 # 必要なメソッドを追加 〜ここより〜 # 必要なメソッドを追加 〜ここまで〜 class NoteBook : def __init__(self, n : int) : self.max_num = n self.p = [None] * n self.num = 0 def compare(self, x : list) : print("--途中の状態--") if x != None : self.print(x) else : print("記録なし") print("--最後の状態--") self.print(self.p) # 必要なメソッドを追加 〜ここより〜 # 必要なメソッドを追加 〜ここまで〜 def histgram(x : list, r : int) : for i in range(len(x)) : t = x[i].getType() n = x[i].getNum() s = "#" * (n//r) print(s, " ε( ミ´・)> ", t, " [", n, "羽]", sep="") print("ペンギン探しの旅に出かけよう♪") max_num = int(input("何種類まで? => ")) if max_num <= 0 : sys.exit() b = NoteBook(max_num) tp, nm, ht, s = None, None, None, None tnh = input("何ペン? => ") a = tnh.split() if len(a) == 3 : tp, nm, ht = a[0], int(a[1]), float(a[2]) elif tnh != "-" and tnh != "+" : sys.exit() while tnh != "-" : if tnh == "+" : s = b.savePen() print("途中経過を次の通り記録しました.") b.print(b.p) elif not b.addPen(tp, nm, ht) : print("もう記録できないよぅ....") tnh = input("何ペン? => ") a = tnh.split() if len(a) == 3 : tp, nm, ht = a[0], int(a[1]), float(a[2]) elif tnh != "-" and tnh != "+" : sys.exit() print("ヒストグラムにしてみよう.") r = int(input("1目盛りあたり何羽にしますか? => ")) x = b.sortPen() histgram(x, r) print("記録の推移") b.compare(s) print("おしまい.")

0 コメント