ファイルからデータを読み込み平均値を求めるプログラムについて

このQ&Aのポイント
  • ファイルからデータを読み込み平均値を求めるプログラムについて
  • C言語を学習し始めた方がファイルからデータを読み込み、氏名ごとのスコアの平均値を求めるプログラムを作成したいと考えています。条件分岐の方法や結果の出力方法について質問です。
  • 質問者はC言語を学習し始めた者で、ファイルからデータを読み込み、氏名ごとのスコアの平均値を求めるプログラムを作成したいと考えています。具体的なプログラムの流れと条件分岐の方法についての質問です。
回答を見る
  • ベストアンサー

ファイルからデータを読み込み平均値を求めるプログラムについて

ファイルからデータを読み込み平均値を求めるプログラムについて はじめまして、最近C言語を学習し始めたものです。 ファイルからのデータ読み込みについての質問です。 たとえば、テキストファイルとして以下のような名前とスコアが示してあるファイルがあります。 ************************* 佐藤 0.8 伊藤 0.9 西村 0 酒井 -2.5 佐藤 -0.1 ・・・  ・・・ ・・・  ・・・ 西村 0.3 ************************* (名前の繰り返しもあるファイルです) このようなファイルから読み込みを行って、 左の氏名ごとにスコアの平均値を求めるプログラムを作成したいと考えております。 実行例として「西村」の場合0と0.3の平均値である0.15を求めて表示させたいです。 ・プログラムの流れとして         テキストファイルを読み込む     ↓ (テキストファイルの最後になるまで、各文字列(氏名)ごとのスコアの平均値を求める) ◇文字列(氏名)=初めて出た文字列   ←(条件分岐) yes→文字列の出た回数=文字列の出た回数+1     文字列.スコア=スコア no→文字列の出た回数=文字列の出た回数+1    文字列.スコア=(文字列.スコア+スコア)/文字列の出た回数 終了すると結果をファイルに書き込む このような流れでプログラムを作りたいと考えているのですが、 特に条件分岐のところをどのようにプログラムで表現したらでしょうか? 回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

あなたのおっしゃる条件分岐の部分を1行で書くことは難しいです。 1行で書くことが難しい処理がでてきたら関数化を考えるとよいと思います。 つまり、既に読み込んだ文字列データ群(配列)と今読み込んだ文字列データを引数として渡すと、初めての文字列のときはtrueを既に読み込んだことがある文字列のときはfalseを返す関数を作るのです。 この関数の作り方がわからないときは「探索アルゴリズム」ぐぐってみてください。ヒントが見つかるはずです。探索アルゴリズムにはいろいろありますが、一番単純な線形探索から実装してみることをお勧めします。慣れてきたらハッシュなども考えてみてください。 探索アルゴリズムは整数値を探索するサンプルが最初に出てくると思いますが、今回は文字列比較なので strcmpを調べてみてください。 追記 あなたのアルゴリズムで no→文字列の出た回数=文字列の出た回数+1    文字列.スコア=(文字列.スコア+スコア)/文字列の出た回数 の部分は間違っているように思われます。 例えば 西村 10 西村 10 西村 10 と言うデータの場合、このやり方では、 最初の西村を読み込んだとき、 点数は10となり、 2回目の西村を読み込んだとき、 文字列の出た回数が2回となるので (10+10)/2 で平均点10となります。ここまではよいのですが、 3回目の西村を読み込んだとき、 文字列の出た回数が3回となり、 (10+10)/3 で答えがおかしくなります。 ファイルを読み込みながら、点数を加えるとともに、出現回数をカウントUPし、 平均の計算は最後に1回計算すればよいのではないでしょうか

kansai-24
質問者

お礼

アドバイスとミスのご指摘ありがとうございます。 自分で思いつかなかったアルゴリズムを教えていただき大変参考になりました。 このアドバイスを参考に自分なりにプログラムを完成させたいと思います。 また、質問する機会があればよろしくお願いします。

関連するQ&A

  • 複数のファイルからのデータの平均を求める

    c言語でファイルの読み取りに関する処理を行うプログラムを作っています。具体的な内容としては、いくつかのテキストファイルに数値が記されていて、それを読み込んで読み込んだ枚数分で平均を求めてくれる物を作りたいと思っています。平均の計算自体は分るのですが、読み込んだ数値をどう扱うかで詰まっています。二次元配列の列ごとにそれぞれのテキストファイルからの数値を入れていって要素ごとで平均を取るような形にすれば良いかなとは思っているんですが、うまく行きません。どなたかアドバイスをください。よろしくお願いします。

  • ファイルからのデータ読み込み方法について

    はじめまして、数ヶ月前からC言語を始めたものです。 ファイルからのデータ読み込みについて質問です。 テキストファイルとして以下のようなものがあります。 ************************* 23 3346 45 423 34 23 345 45 56 6345 ・・・ ・・・ ************************* このようなファイルから読み込みを行って、スペース毎の数字(整数型)を構造体の中の変数に順次格納していくようなプログラムを作りたいとおもうのですがどのように行ったらいいのでしょうか? 現在、fgets()で行ごとの文字列を読み込んでから、型変換を行おうと心みているのですが、うまくいきません。 回答よろしくお願いします。

  • プログラムでテキストファイルを作れますか?

    キーボード入力ではなく、プログラムでテキストファイルを作り保存したいのですが、可能でしょうか? 例えば、 Select Volume X の文字列を D:\SelectVol.Bat の名前で保存したいのです。 ここで X は、数字ですが条件により変化します。 よろしくお願いします。

  • バッチファイルで、キーボードより入力

    バッチファイルにより、複数のバッチファイルを切り替えて使いたいのですが、条件分岐IFで、分岐するために、キーボードより英数文字を入力し、それにより条件分岐する。プログラムを知りたいのですが、よろしくお願いします。

  • テキストファイルを読み込んで別のファイルに出力するプログラム

    テキストファイルを読み込んで分類し、別のファイルに出力するプログラムを作ろうと思っています。 大まかに作ってみたのですが、そもそもこれであっているのか確認してください。 import java.io.*; public class Test { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader ( new FileReader("kazu.txt")); int note, b1 = 0, b2 = 0, b3 = 0, b4 = 0; String input; while((input = br.readLine()) != null) { note = input.toint(); { //読み込んだString型のデータinputをint型に変換してnoteに代入 /*条件分岐 :noteの値が80以上ならb1に1を加える  条件分岐 :上記以外でnoteの値が70以上ならb2に1を加える  条件分岐 :上記以外でnoteの値が60以上ならb3に1を加える  条件分岐 :上記以外ならb4に1を加える*/ } //bwに文字リテラル"80以上"を書き込む //bwにTAB記号を1文字書き込む //bwにint型の変数b1の値の文字列表現を書き込む //bwに改行記号を書き込む //同様に"70以上80未満" "60以上70未満" "60未満"についてbwに必要な書き込みを行う bw.flush(); br.close(); bw.close(); } } 最近プログラミングを学び始め、急にいろんなことをやり出してしまったので何がなんだかわからなくなっています。 途中にある、String型のデータinputをint型に変換してnoteに代入というのは、どのようにすればいいのでしょうか? またその後にある条件分岐では、if note >=80 b1=b1+1; else if note>=70 ...とやっていけばいいのでしょうか? また、bwへの書き込みというのが(別のプログラムでも)うまくできません。 長々と書いてしまいましたが、よろしくお願いします。

  • ファイルに上書きするとファイルの中身が消えてしまいます。

    .NETで、テキストファイルの中身が 30 20 10 と改行されているファイルを読み込み、それを10を15にして再度テキストファイルに書き込みする時に、 Print(a, スコア(DataCounter) + Environment.NewLine) というので書き込んでいるのですが、 追加情報 : 文字列 " " から型 'Double' へのキャストが有効ではありません。 というエラーが出てしまいます。 もしかして、Environment.NewLineっていうのは、文字列にしか使えないのですか?であれば、数値に対するものはあるのでしょうか? 教えていただければ助かります。

  • PHPプログラムについて

    読み込んだテキストファイルを1行ずつ検索し、特定の文字が見付かればそれに続く文字列を配列に格納するというプログラムを作りたいです。 そこで指定文字列の出現以降の文字列を取り出すというstrchr関数を用いて 作成を試みたのですが上手くいきません。 何か別の方法があれば教授をお願いします。

    • 締切済み
    • PHP
  • バッチファイル テキストファイル内の最後の\以下を削除したい

    バッチで、あるテキストファイル内の最後の\以下を削除して、その結果をバッチの値として利用したいです。 ●テスト条件 %TEMP%のtest.txt に以下のテキスト。 C:\Program Files\software\top xyz ●求める結果: 行末から最初の\以下の文字列を削除。この文字列をバッチファイルで使いたい。 C:\Program Files\software\ ●試したコマンド: なし 全体の流れとしては、バッチでquery取得したパスの不要な部分を削除して、求まったパス(のdirの結果を出力するために)を再度バッチで利用したいです。適切なコマンド・方法がありましたらお願いいたします。

  • 多数のテキストファイルからの文字列の取り出し

    いま、わたしが持っているヴィジュアルベーシックは VB6.0です。PCはノートで、OSはXPです。 課題: あるフォルダーに1000くらいのテキストファイルがあって、 その各テキストファイルから たとえば、「「不特定長さの文字列1」」・・・・・・・・((不特定長さの文字列2)) の不特定長さの文字列1と不特定長さの文字列2を とりだし、 それをファイル名「まとめ表」というテキストファイルに ファイル名    文字列1   文字列2 ファイル1   あいうえお  かきくけこ ファイル2   さしすせそ  たちつてと  ・         ・        ・  ・         ・        ・ のように書き込むというプログラムを作成したいのですが、 できるでしょうか? できるとすると、 プログラムの およその考え方と 使用する命令語はどのようなものになりますか? ご回答をおまちしております。 よろしくおねがいいたしますm(__)m

  • ファイルへデータ登録2

    こんばんは、お世話になっております。 http://oshiete1.goo.ne.jp/qa4005498.html 以前、上記ページにて同名のタイトルで質問させていただきまして、不明な点が出てきましたので、アドバイスいただければ幸いです。 ●やろうとしていること。 テキストエリア内に入力した文字列(改行あり)を、テキストファイルに登録。 テキストエリア 01<>プログラム 01_01<>PHP 01_02<>javascript 上記文字列(1行単位)を、<>の部分で分割しタブ区切りとし、テキストファイルへはイカのような形で保存。 01  プログラム 01_01 PHP 01_02 javascript 先にも述べましたが、以前投函させていただいた件を引き継いでのものですが、DBへではなくファイルへデータ保存をするというのが全く初めての試みでありまして、前回お教えいただいた、タブコード(\t)や、PHP_EOLをどのタイミングでどう設定するのか?を、少し具体的にアドバイスいただければ幸いです。 お忙しい中恐縮ですが、皆さんのお知恵をお貸し下さい。宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう