ファイルからデータを読み込み平均値を求めるプログラムについて
はじめまして、最近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回計算すればよいのではないでしょうか
アドバイスとミスのご指摘ありがとうございます。
自分で思いつかなかったアルゴリズムを教えていただき大変参考になりました。
このアドバイスを参考に自分なりにプログラムを完成させたいと思います。
また、質問する機会があればよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
Excelで3E8を3.00E+8にしない方...
-
Excelはなんで先頭の0を消すん...
-
Excelで指数表現しないようにす...
-
文字列からタブコードを取り除...
-
同一セル内に関数と文字列を同...
-
OnTime 使用時のプロシージャへ...
-
VBA2005 16進を2桁で表示したい。
-
複数文字列から共通文字列の抽...
-
MS SQLServer のSQLで文字列の...
-
エクセルで文字列をtxtファイル...
-
C#で年月を比較する
-
16進数を10進数に簡単に変換す...
-
【Excel VBA】複数ある特定の文...
-
漢数字に変換するプログラム
-
VBA テキストボックスの計算
-
VBの「As String * 128」とは?
-
[C言語]fputsとfprintfの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
Excelで指数表現しないようにす...
-
エクセルで文字列の最大値を抽...
-
エクセル 数値データを桁をそ...
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
sedなどで、特定の文字列の後の...
-
MS SQLServer のSQLで文字列の...
-
Left関数とRight関数を合わせた...
-
Msgboxの×が押されたとき
-
アクセスで特定の数字以外(複...
-
【Excel VBA】複数ある特定の文...
-
エクセルでセル内の文字列の最...
-
C#で年月を比較する
おすすめ情報