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

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

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

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

Q&A

解決済

2回答

824閲覧

テキストファイルの数列を呼び出し、足して、小数第3位から切り捨て、合計をプリント出力し、ピリオドを除く数字の数をカウントができません。

Chibichan

総合スコア72

Python

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

0グッド

0クリップ

投稿2020/07/06 16:23

こちらが呼び出すテキストファイルに入っている数字です。
3.14
2.692038
0.009
69.96
1.337
715517.01
888888.888888888888
666.66666
234242.2342323670923842042890342803
23623.346346347
1.23456789

def desimaaliluku():♯切り捨はできますが、合算してプリントされません。 tiedosto=open("liukulukuja.txt","r",encoding="utf-8") sum=0 for i in tiedosto.readlines(): number = float(i) sum = sum + number print(round(sum,2)) tiedosto.close() return def kaksi(): #こちらはできました。 tiedosto=open("liukulukuja.txt","r",encoding="utf-8") number=open("valmiinalukuja.txt","w",encoding="utf-8") for i in tiedosto.readlines(): decimal=float(i) number.write("{:.2f}".format(decimal)+'\n') tiedosto.close() number.close() return def numeromerkki(): ♯ピリオド以外の数をカウントしてプリント出力 tiedosto=open("liukulukuja.txt","r",encoding="utf-8") count=0 for i in tiedosto.readlines(): a = [i] print(len(a)) tiedosto.close() return def paaohjelma(): desimaaliluku() kaksi() numeromerkki() return paaohjelma()

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

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

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

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

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

y_shinoda

2020/07/06 16:53

テキストファイルのデータを使って Python コードを実行したときの、 具体的な期待する出力を教えてください
Chibichan

2020/07/06 16:56

以下のようになります。以下をすべて総計したいです。 3番目のDef文では、テキストファイルにあるピリオドを除く数字を以下のように別ファイルへ書き込みたいのですが、できません。 3.14 2.69 0.0 69.96 1.33 715517.01 888888.88 666.66 234242.23 23623.34 1.23
coco_bauer

2020/07/07 11:22

少しは自分で考えたらどうですか? できません、わかりません、と人に頼ってばかりだと上達しませんよ。
Chibichan

2020/07/07 11:25

嫌味をわざわざいう必要はないでしょう。人の気分を害して気持ちいいですか?
guest

回答2

0

ベストアンサー

整数を扱えるようにしたり、どこまで桁数をとるか変えられるようにしました。
こちらでもデバッグしましたが、入力された値によっては間違えた結果が出るかもしれないので、確認してください。

質問のテストケースは大丈夫そうです。
誤差を防ぐため、小数ではなく整数で足し算を行うようにしました。

desimaalilukuの返り値は文字列型なので, 小数で扱いたい場合はfloatに変換してください。
指数表示には対応できていないです。(ちょっといじればできそう)
間違いがあればご指摘いただければ幸いです。

python

1def is_float(s): 2 try: 3 float(s) 4 except: 5 return False 6 return True 7 8# 文字列に入っている整数を、小数点以下の桁数がdigit_after_pointの小数に変えて返す。 9# i/10**digit_after_pointにあたる計算。 10# 誤差を防ぐ。 11def strint_to_float(i, digit_after_point): 12 if(digit_after_point==0): 13 return i 14 result = "" 15 if(len(i)<=digit_after_point): 16 result += "0"*(digit_after_point+1-len(i))+i 17 else: 18 result = i 19 return result[:-digit_after_point]+'.'+result[-digit_after_point:] 20 21def desimaaliluku(): 22 # 小数点以下どこまで桁数を取るか指定 23 MAX_DIGIT_AFTER_POINT = 2 24 25 # MAX_DIGIT_AFTER_POINTが0以上か確認 26 assert(MAX_DIGIT_AFTER_POINT>=0) 27 with open("liukulukuja.txt","r",encoding="utf-8") as tiedosto, open("output.txt","w",encoding="utf-8") as of: 28 sum=0 29 sum_d = 0 30 for i in tiedosto.readlines(): 31 # 改行コード除去 32 i = i.strip() 33 34 # iに不正な値が入力された場合, 強制終了 35 assert(is_float(i)) 36 37 # .が見つからなかった場合(整数), .を付加し、以降では小数として扱う 38 if(i.find(".")==-1): 39 i+="." 40 41 # 小数点以下の桁数を計算 42 digit_after_point = len(i)-1-i.find(".") 43 44 # コンマを除去し, 文字列型に整数を格納する 45 strint = i.replace(".","") 46 print(i,"の数字の部分は",len(strint), end="個あって、") 47 48 sum_d += len(strint) 49 50 # 小数点以下の桁数がAX_DIGIT_AFTER_POINT以上の場合, 余分な分を文字列から除去する 51 if digit_after_point > MAX_DIGIT_AFTER_POINT: 52 strint = strint[:-(digit_after_point-MAX_DIGIT_AFTER_POINT)] 53 54 # 小数点以下の桁数がMAX_DIGIT_AFTER_POINT未満の場合, 足りない桁数分0を末尾に入れる 55 elif digit_after_point < MAX_DIGIT_AFTER_POINT: 56 strint += "0"*(MAX_DIGIT_AFTER_POINT-digit_after_point) 57 58 # 切り捨てた結果を表示 59 print("切り捨てると",strint_to_float(strint, MAX_DIGIT_AFTER_POINT)) 60 61 # ファイルに書き込み 62 of.write(strint_to_float(strint, MAX_DIGIT_AFTER_POINT)+"\n"); 63 sum += int(strint) 64 65 return strint_to_float(str(sum), MAX_DIGIT_AFTER_POINT), sum_d 66if __name__ == "__main__": 67 _sum, sum_d = desimaaliluku() 68 print("総和は",_sum, "数字の部分の個数の和は", sum_d) 69

実行結果は以下の通りです。

text

13.14 の数字の部分は 3個あって、切り捨てると 3.14 22.692038 の数字の部分は 7個あって、切り捨てると 2.69 30.009 の数字の部分は 4個あって、切り捨てると 0.00 469.96 の数字の部分は 4個あって、切り捨てると 69.96 51.337 の数字の部分は 4個あって、切り捨てると 1.33 6715517.01 の数字の部分は 8個あって、切り捨てると 715517.01 7888888.888888888888 の数字の部分は 18個あって、切り捨てると 888888.88 8666.66666 の数字の部分は 8個あって、切り捨てると 666.66 9234242.2342323670923842042890342803 の数字の部分は 34個あって、切り捨てると 234242.23 1023623.346346347 の数字の部分は 14個あって、切り捨てると 23623.34 111.23456789 の数字の部分は 9個あって、切り捨てると 1.23 12総和は 1863016.47 数字の部分の個数の和は 113

output.txt

text

13.14 22.69 30.00 469.96 51.33 6715517.01 7888888.88 8666.66 9234242.23 1023623.34 111.23

10桁まで取り、整数も入れた場合

txt

1入力した値 23.14 32.692038 40.009 569.96 61.337 7715517.01 8888888.888888888888 9666.66666 10234242.2342323670923842042890342803 1123623.346346347 121.23456789 131 14100005 151. 160000000 17555533.100059958989130 1855555555555555 19.999999 20 213.14 の数字の部分は 3個あって、切り捨てると 3.14 222.692038 の数字の部分は 7個あって、切り捨てると 2.69 230.009 の数字の部分は 4個あって、切り捨てると 0.00 2469.96 の数字の部分は 4個あって、切り捨てると 69.96 251.337 の数字の部分は 4個あって、切り捨てると 1.33 26715517.01 の数字の部分は 8個あって、切り捨てると 715517.01 27888888.888888888888 の数字の部分は 18個あって、切り捨てると 888888.88 28666.66666 の数字の部分は 8個あって、切り捨てると 666.66 29234242.2342323670923842042890342803 の数字の部分は 34個あって、切り捨てると 234242.23 3023623.346346347 の数字の部分は 14個あって、切り捨てると 23623.34 311.23456789 の数字の部分は 9個あって、切り捨てると 1.23 321. の数字の部分は 1個あって、切り捨てると 1.00 33100005. の数字の部分は 6個あって、切り捨てると 100005.00 341. の数字の部分は 1個あって、切り捨てると 1.00 350000000. の数字の部分は 7個あって、切り捨てると 0000000.00 36555533.100059958989130 の数字の部分は 21個あって、切り捨てると 555533.10 3755555555555555. の数字の部分は 14個あって、切り捨てると 55555555555555.00 38.999999 の数字の部分は 6個あって、切り捨てると 0.99 39総和は 55555558074112.56 数字の部分の個数の和は 169

投稿2020/07/06 21:06

編集2020/07/07 11:20
Penpen7

総合スコア698

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

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

Chibichan

2020/07/07 11:03

ありがとうございます。総和は、あっていますが、数字の数の答えが133(ピリオドを除く)になるには、 どう変更したらよろしいでしょうか?
Penpen7

2020/07/07 11:13

数字の部分の個数の和を取りたいという意味でしょうか?
Penpen7

2020/07/07 11:21

個数の和を取るように回答のコードを変えました。 sum_dでlen(strint)の和を取ればいけます。
guest

0

元の回答

10進数に限定した対応方法ですが、文字列として処理してしまう方法をご紹介します

desimaaliluku():

python

1def desimaaliluku(): 2 tiedosto=open("liukulukuja.txt","r",encoding="utf-8") 3 sum=0 4 for i in tiedosto.readlines(): 5 index_period = i.find(".") 6 number = i[:index_period + 3] 7 print(number) 8 sum = sum + float(number) 9 tiedosto.close() 10 return sum

numeromerkki():

python

1def numeromerkki(): # ピリオド以外の数をカウントしてプリント出力 2 tiedosto=open("liukulukuja.txt","r",encoding="utf-8") 3 count=0 4 for i in tiedosto.readlines(): 5 # 文字列からピリオドと改行コードを取り除きます 6 a = i.replace(".", "").replace("\r", "").replace("\n", "") 7 print(len(a)) 8 tiedosto.close() 9 return

実行結果:

console

13.14 22.69 30.00 469.96 51.33 6715517.01 7888888.88 8666.66 9234242.23 1023623.34 111.23 123 137 144 154 164 178 1818 198 2034 2114 229

注意点

与えられたテキストファイルのデータを処理する最低限のコードのみを示しています
異なるデータが与えられた場合には想定していないエラーが発生する可能性があります
たとえば、「ピリオドを含まない数値の文字列が与えられた場合」などです

追記

総計1863016.52、数値の文字数113がプリント出力されるには
def desimaaliluku文とdef numeromerkki文をどう変更したらよろしいでしょうか?
最終結果のみプリント出力したいのですが、どうへんこうしたらよいでしょうか?

次のように変更します

desimaaliluku():

python

1def desimaaliluku(): 2 tiedosto=open("liukulukuja.txt","r",encoding="utf-8") 3 sum=0 4 for i in tiedosto.readlines(): 5 index_period = i.find(".") 6 number = i[:index_period + 3] 7 # print(number) 8 sum = sum + float(number) 9 tiedosto.close() 10 print(sum) 11 return sum

numeromerkki():

python

1def numeromerkki(): # ピリオド以外の数をカウントしてプリント出力 2 tiedosto=open("liukulukuja.txt","r",encoding="utf-8") 3 sum=0 4 for i in tiedosto.readlines(): 5 # 文字列からピリオドと改行コードを取り除きます 6 a = i.replace(".", "").replace("\r", "").replace("\n", "") 7 count = len(a) 8 # print(count) 9 sum = sum + count 10 tiedosto.close() 11 print(sum) 12 return sum

実行結果:

python

1$ python test.py 21863016.47 3113

投稿2020/07/06 18:17

編集2020/07/07 11:42
y_shinoda

総合スコア3272

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

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

Chibichan

2020/07/07 10:56

ありがとうございます。私の質問が悪かったのですが、総計1863016.52、数値の文字数113がプリント出力されるには、def desimaaliluku文とdef numeromerkki文をどう変更したらよろしいでしょうか?
Chibichan

2020/07/07 11:18

最終結果のみプリント出力したいのですが、どうへんこうしたらよいでしょうか?どうぞよろしくお願いいたします。
y_shinoda

2020/07/07 11:42

回答を追記しました
Chibichan

2020/07/07 11:47

ありがとうございます!できました!質問なんですが、ファイルcloseの位置が変わるだけで、プリント出力される引数が変わるということでしょうか?今後の勉強になるので、ご教示お願い致します。
y_shinoda

2020/07/07 11:52

ファイルの close の位置は変えていません それ以外のコードを変えました print 出力は「される」のではなく、「して」います 出力したいものが変更になったので、print 出力する変数を変更しました
Chibichan

2020/07/08 11:39

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問