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

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

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

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

Q&A

解決済

2回答

999閲覧

標準入力から、整数値を取得する。ただし、繰り返し(while) を利用して、何件でも入力できるようにすること。入力がない場合終了する。取得したデータ最大値、最小値、平均、中央値、不偏標準偏差を表示する

SAkana77777

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/11/16 08:05

編集2021/11/16 08:18

標準入力から、整数値を取得する。ただし、繰り返し(while) を利用して、何件でも入力できるようにすること。入力がない場合終了する。取得したデータ最大値、最小値、平均、中央値、不偏標準偏差を表示する関数を作成せよ。

import statistics def F1(A): print("A:",A) print("最大値:", max(A)) print("最小値:", min(A)) print("相加平均:",statistics.mean(A)) print("中央値:",statistics.median(A)) print("不偏標準偏差:{:.4f}".format(statistics.stdev(A))) while True: K =input("数値:") if len(K)==0: break C = int(K) F1(C)

エラーコードは以下の通りです。
数値:1
数値:2
数値:3
数値:
A:3

TypeError Traceback (most recent call last)
<ipython-input-128-3ee61c238b54> in <module>()
14 C = int(K)
15
---> 16 F1(C)

<ipython-input-128-3ee61c238b54> in F1(A)
3 def F1(A):
4 print("A:",A)
----> 5 print("最大値:", max(A))
6 print("最小値:", min(A))
7 print("相加平均:",statistics.mean(A))

TypeError: 'int' object is not iterable

最大値、最小値、平均、中央値、不偏標準偏差の関数処理がどうしてもできません。改善点をご教授願います。

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

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

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

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

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

y_waiwai

2021/11/16 08:06

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
1T2R3M4

2021/11/16 08:14

'int' object is not iterable の対応をすればいいのでは。
SAkana77777

2021/11/16 08:19

失礼いたしました。修正しました。 当方まだプログラミング初心者でして、三時間ほど粘りましたが行き詰まってしまいました。
BeatStar

2021/11/16 08:57

これ、本当にエラ―メッセージ合っているんですかね?
guest

回答2

0

ベストアンサー

Aに入ってほしい型はlistです(いくつかある中から最大とかを取ってきたいから)。
ループ内でやっている処理はCを毎回書き換えていて(Cはintになっている)、その後関数呼び出し時にCを渡しているのでAがintになってしまっているのが問題ですね。
そもそもCを毎回書き換えてしまっているので1 2 3 と順番に入力してもCに残っているのは3だけです。

解決法:
Cをリストにしてその中に入力した値を入れていく処理を書きます。
変更箇所は###です。

python

1C = [] ### 2while True: 3 K =input("数値:") 4 if len(K)==0: 5 break 6 C.append(int(K)) ###

投稿2021/11/16 08:31

irognodyci

総合スコア227

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

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

SAkana77777

2021/11/16 08:38

本当にありがとうございました。無事に機能しました。もう少し深掘りしてみることにします。
guest

0

まず、エラーメッセージぐらいは読みましょう
エラーメッセージは暴言でもないし、罵声でもありません。
コンパイラやインタプリタ等からのメッセージです

つまり、『んー?? なあ、これって……こうじゃね?』っていう相手のセリフ?を聞いて「あああああああああ、わかんないいぃぃぃ!!! 聞こえないぃぃぃぃぃいぃぃ!!!」と相手の話を遮って逆ギレ的なことをして暴走している状態です。
そりゃ、コミュニケーションなんて取れないですよね?

まずはメッセージぐらい読みましょう。

TypeError Traceback (most recent call last) <ipython-input-128-3ee61c238b54> in <module>() 14 C = int(K) 15 ---> 16 F1(C) <ipython-input-128-3ee61c238b54> in F1(A) 3 def F1(A): 4 print("A:",A) ----> 5 print("最大値:", max(A)) 6 print("最小値:", min(A)) 7 print("相加平均:",statistics.mean(A)) TypeError: 'int' object is not iterable [訳] TypeErrorっす。 場所は……っと、えーっと、15行目のF1(C)って行っす。 そこで呼び出されている、F1関数の中の、 えーっと、5行目の位置にある、 print("最大値:", max(A))が原因っすね。 具体的には、えーっと、TypeError、つまり 'int'オブジェクトはイテラブル(反復可能)ではないっすよ?

という感じです。

簡単に言えば、『リストのようなものを渡すべきところなのに、なぜか変数(のデータ一個分)しか渡されていないことが原因』です。

つか、ロジックを読めば当たり前って感じです。

次に、コードを読みましょう
コードを読むコツは、『一行レベルで、その行が何をしているかを考えながら読む』です。
たとえば、コメント文にするとか。

今回の場合、def F1...っていう行の周辺は単なる関数定義なので今は読まない。
で、while True: の部分からスタートするのですよね?

コードを読んでみましょう。

Python

1# 無限ループ( 常に真になるから ) 2while True: 3 # ユーザ入力を受け取ってこれをKとする 4 K =input("数値:") 5 # Kの長さが0なら 6 if len(K)==0: 7 # ループから抜ける 8 break 9 # Kを整数に変換して Cとする 10 C = int(K) 11 12# F1関数にCを渡して処理してもらう 13F1(C)

これを、疑似コードにします。

[疑似コード1] 1. 以下を無限ループ 1.1. ユーザ入力を受け取ってこれをKとする 1.2. Kの長さが0なら 1.2.1. ループから強制的に抜ける 1.3. Kを整数に変換してCとする 2. F1関数にCを渡して処理してもらう

さて、この疑似コードを使って考えてみてください。今の時点では F1関数はちゃんと動いていると仮定してみます。

まず(1)によって無限ループします。初回なので確実に行う。(無限ループだから)
(1.1)に行き、ユーザが入力した数字等がKに入る。
でもこの時点ではたとえば 3 とかみたいな数字になっているはずです。
(文字列系が渡された場合はどうするんだっていう問題はあるが…)

で、(1.2)で『Kの長さが0なら』の条件に一致しますか?
たとえば 3 が入力されたとかで。
何かしらの値が入力されればおそらくfalseになるはずです。(偽になる)
よってスルー。で(1.3)に行き、Kを整数にしてCとする。

もし K = "3" なら C = 3 となる感じです。

で、(1)に戻って (1.1)に行き、入力してもらう。

たとえば、

3 2 1

であれば、K = "2" になっているはずです。(3はすでに処理したため)
で、(1.3)で C = 2 に。
また(1)に戻って K = "1" 、よって C = 1 となります。

また(1)に戻ります。K = <無し> の状態なので、EOFErrorになるはずです。
(まあ、while True: じゃなくて for文で回数制限していると仮定してスルーします。今回の問題はこれじゃないので)

で、最終的に F1関数を呼び出す時の K や Cの状態を考えてみてください。
おそらく、K = "1", C = 1 の状態になっているはずです。

F1関数の中も同じようにやってみてください。
そうすると、print("最大値:", max(A)) の部分で、maxを使っています。でもこれって処理内容的にも『リスト』とかのような複数のデータがあるやつを対象にしているのでは?

ヒント: 公式リファレンス

なのでエラーになる。
厳密には例外っぽいですが。

投稿2021/11/16 08:56

BeatStar

総合スコア4962

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問