- 締切済み
プログラミングC
下のプログラミングを考えてますが、できません。どなたか教えてください。 1 関数 atof を拡張して,次のような科学記号を扱えるようにせよ。 123.45e-6 ← これは,123.45 × ( 10 の -6 乗 ) のことである。ここで,浮動小数点の直後には,e や E と符号の付きうる指数部が続いてもよいとする。 2. 改行で区切られた複数の数 (最大100個まで) の平均を表示するプログラムを 1.で作成した atof を利用する形で、作成せよ。ただし、一つの行に複数の数がある場合は考慮しなくてよい。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- arukamun
- ベストアンサー率35% (842/2394)
こんにちは atofを自作するという事でしょうか。 暇つぶしに作ってみました。 #include <math.h> #include <stdio.h> #include <stdlib.h> double atof2(char a[]) { int i,j,k,l,m,n ; i = 0 ; if ( a[i] == '-' ){ j = -1 ; i ++ ; } else { j = 1 ; } k = 0 ; l = 0 ; while ( a[i] != 'e' && a[i] != 'E' && a[i] != '\0' ){ if ( a[i] >= '0' && a[i] <= '9' ){ k *= 10 ; k += a[i] - '0' ; l *= 10 ; } else if ( a[i] == '.' ){ l = 1 ; } else { printf("Error %s",a); return 0.0 ; } i ++ ; } if ( l == 0 ){ l = 1 ; } if ( a[i] != '\0' ){ i ++ ; if ( a[i] == '-' ){ m = -1 ; i ++ ; } else { m = 1 ; } n = 0 ; while ( a[i] != '\0' ){ if ( a[i] >= '0' && a[i] <= '9' ){ n *= 10 ; n += a[i] - '0' ; } else { printf("Error %s",a); return 0.0 ; } i ++ ; } } return pow(10.0,(double)m*n)*j*k/l ; } 手元にコンパイラが無いのでまともに動くかは不明です。
- jmh
- ベストアンサー率23% (71/304)
この atof() 自体が自作ではないでしょうか? 「プログラミング言語C」(K&R)ってゆう本に、(stdlib.h のでない素朴な) atof() が載ってます。そして、1と同一の演習問題があります。 その答えが載ってる本もあります。たぶん「Cアンサー」そのまんまのタイトルだったような気がします。 2は、stdin から1行読む関数を既に作ってたら、教えてください。gets() とかを使っても良いですか?
- neue_reich
- ベストアンサー率21% (138/647)
まず、123.45e-6という表記についてですが、 1.2345e-4でないと科学的ではないですよね。 少なくとも数学的な記法ではないと思いますし、 そもそも、科学記号というのかどうか… とりあえず、方針だけ。 1については eかEを探してやり、その前後を 以下の式に代入します。 A * 10^B この例は AeB(AEB)という数に対するものです。 あとは拡張元の関数の性質を考えてみてください。 2は簡単ですよね。 数値の入力の際に1で作った関数を使えばよいだけです。 あとはC言語の基本どおりに作れます。 このごろ大学などの課題っぽい質問が多いなぁ、 と思い、方針しか書いておりません。あしからず。
- liar_adan
- ベストアンサー率48% (730/1515)
1)拡張しなくても、atofはその書式を扱えますよ。 2)これは行単位のファイル入力ができれば、すぐにできます。 行単位のファイル入力をするには、 fgets()かgets()を使います。
補足
すいませんが、全く先に進まない状態が続いてます。 プログラムを教えていただけないでしょうか?