アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

はじめまして、最近C言語を学習し始めたものです。

ファイルからのデータ読み込みについての質問です。
たとえば、テキストファイルとして以下のような名前とスコアが示してあるファイルがあります。
*************************
佐藤 0.8
伊藤 0.9
西村 0
酒井 -2.5
佐藤 -0.1
・・・  ・・・
・・・  ・・・
西村 0.3
*************************
(名前の繰り返しもあるファイルです)

このようなファイルから読み込みを行って、
左の氏名ごとにスコアの平均値を求めるプログラムを作成したいと考えております。

実行例として「西村」の場合0と0.3の平均値である0.15を求めて表示させたいです。


・プログラムの流れとして
       
テキストファイルを読み込む
    ↓
(テキストファイルの最後になるまで、各文字列(氏名)ごとのスコアの平均値を求める)

◇文字列(氏名)=初めて出た文字列   ←(条件分岐)
yes→文字列の出た回数=文字列の出た回数+1
    文字列.スコア=スコア

no→文字列の出た回数=文字列の出た回数+1
   文字列.スコア=(文字列.スコア+スコア)/文字列の出た回数

終了すると結果をファイルに書き込む

このような流れでプログラムを作りたいと考えているのですが、
特に条件分岐のところをどのようにプログラムで表現したらでしょうか?

回答よろしくお願いします。

A 回答 (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回計算すればよいのではないでしょうか
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/29 13:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!