質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

762閲覧

input()の内容によって場合分けをしたい

yu76

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/15 12:41

python初学者の者です。
以下のような課題に取り組んでいるのですが、悩んでいます。

標準入力を使って生徒の成績を管理するツールを作ってください。

“save 生徒名 点数“とすると、その生徒の点数を保存。
“save 生徒名 点数“とした場合、
生徒名がすでに保存されている時は、点数を上書きするか警告文を出して、yes/noで上書きの選択を行う。
“get 生徒名“とするとその生徒の点数を表示。
“get 生徒名“を行った場合、生徒が登録されていない場合はErrorと出力させて処理を継続
“quit” とするとプログラムが終了する。
“average” すでに保存されいる生徒全員の平均点
“登録されている生徒XX人の平均点はXX.XX点です”

averageとquitの部分はできたのですが、saveとgetの部分をどう書けばいいのか分かりません。
生徒名や点数は多くのパターンがあると思うのですが、それをどう書けばいいのかが分かりません。

どなたか教えていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/10/15 14:13

> averageとquitの部分はできたのですが 出来たコードを掲載されると回答しやすくなるかと思います。
guest

回答3

0

まず、プログラミングっていうのは『こう書けばいい』というものではありません

プログラミングは『現実世界のシミュレーション』です。

なので、とりあえず、プログラミングでは…とかPythonでは…とかは置いておきましょう。
先に『手作業でやるなら』と考えてみましょう。数学の問題を解くとか、毎日やる作業とかと考えてみるのです。

そうすると、ある意味、

ホワイトボードに”save 生徒名 点数” のように、コマンドのように何行にも連なった処理列がある。あなたはその処理リストを読んで、それらの処理をせよ。 [処理リストの例] save Tanaka 100 save Yamada 80 save Oosaka 100 … get Yamada average quit

といった感じでしょうか。

そういう場合、どのようにしますか?

私なら、『規則性』を見つけます。

save の構文は常に、

save <人名> <点数>

となっています。

それと対になっているであろう、get は、

get <人名>

となっていて、quitやaverageは

quit

のように一単語になっていますね。

save の構文を再度見ると、

<命令> <人名> <点数>

のようになっていますね。

つまり、『命令と人名等は「半角スペースによって区切られている」』ですね。

ということは、単純に半角スペースを区切り文字にして読んでいけばいいです。

getも同様にすると、単語数は違えど、半角スペースで区切られています。

quitやaverageは一単語のみで、半角スペースはありませんが、『半角スペースまで、または最後の文字までを一単語とする』と見なせば、条件を満たします。

よって、一行あたりのコマンドは『半角スペースまで、または最後の文字までを一単語とする』と考えることができます。

それでは、ホワイトボードに書かれた処理をやっていきましょう。

[処理リスト] save Tanaka 100 save Yamada 80 save Oosaka 100 … get Yamada average quit

上記処理リストの最初は、saveですね。

これは規則性から、『Tanakaさんの点数は100点として記録する』ですね。

これはホワイトボードの余白に、

Tanaka: 100点

とかみたいに書いていきます。

で、二番目の処理もsaveですね。
なので、

Tanaka: 100点 Yamada: 80点

のように追記していく。

三行目以降のsaveも同様にやっていく。

get Yamada のやつは、余白に書いたアレから、Yamada のものを探して、それを結果用のシートかなんかに記述。

average は『平均点を表示』ですから、平均点を算出する。
その都度計算してもいいですが、これが、
average, average, average, average…
のように複数回だとどうなるでしょうか。
計算するのもめんどくさいですね。
流石に同じことを延々に聞くことはありませんが、登録 → 現在の平均点 をループすることはあり得ますね。

毎回やるのは面倒です。

で、よくよく考えると、

平均 = 合計点数 ÷ 人数

ですね。この合計点数は、save時でも計算ができます。
単純に現在の値に足せばいいだけなので。

その合計点数を人数で割ればいいだけです。

quitは単純に処理を終了すればいいだけですし。

これを実装するだけです。

『半角スペースを区切り文字にして…』の読み込みは、『半角スペースを区切り文字として、文字列分割をする』だけでいいです。
そうすれば、saveとかのコマンドだけ取り出すことも可能です。

なので、二次元リストでやればいけそうですね。

Cmd[0][0] とかで取り出せばいいだけですね。

saveの場合やgetの場合とかのように個数が違う場合もあります。
なので、

saveの場合: 1番目と2番目を使う
getの場合: 1番目のみ使う
averageやquitの場合: リスト内のデータは使わない

的な感じで、if文で篩い分けするときに考えればいいだけです。

そして、デバッグまではする。
これが基本です。

投稿2021/10/16 05:39

編集2021/10/16 05:46
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

標準入力をリストとして受け取り、その第一要素別に処理を行い、辞書型でデータの管理を行えば良いのではないでしょうか。

Python

1dic = {} 2 3while True: 4 li = list(map(str, input().split())) 5 6 if li[0] == 'save': 7 if li[1] not in dic: 8 dic[li[1]] = int(li[2]) 9 else: 10 print('上書きをしますか? yes/no') 11 ans = str(input()) 12 if ans == 'yes': 13 dic[li[1]] = int(li[2]) 14 15 elif li[0] == 'get': 16 if li[1] not in dic: 17 print('Error') 18 else: 19 print(dic[li[1]]) 20 21 elif li[0] == 'quit': 22 exit() 23 24 elif li[0] == 'average': 25 avg = round(sum(list(dic.values())) / len(dic), 2) 26 print('登録されている生徒' + str(len(dic)) + '人の平均点は' + str(avg) + '点です') 27

投稿2021/10/16 01:40

kay_ventris4

総合スコア269

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「ファイルに書き出す」等の要求が無いのであれば、
メモリ内で辞書型に持たせてしまうのが手っ取り早いと思われます。

以下、エラー処理なしでかなり適当に書いたサンプルです。

Python

1data = {} 2while True: 3 p = input("command >>>") 4 plist = p.split(' ') 5 if plist[0] == 'save': 6 if data.get(plist[1]): 7 p = input("{} is exists. update? yes/no >".format(plist[1])) 8 if not p=='yes': 9 continue 10 data[plist[1]] = int(plist[2]) 11 elif plist[0] == 'get': 12 if data.get(plist[1]): 13 print("{} is {} points.".format(plist[1], data[plist[1]] )) 14 else: 15 print("{} is not exists.".format(plist[1])) 16 elif plist[0] == 'quit': 17 break 18 elif plist[0] == 'average': 19 print("登録されている生徒{}人の平均点は{}点です".format(len(data), sum(data.values())/len(data) )) 20 else: 21 pass

投稿2021/10/15 13:42

nemoplus

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問