こんにちは、最近C言語でファイルを扱うプログラムについて学習しているものです。
2つのファイルを用いて合計値と平均値を求めるプログラムについての質問です。
具体的には、以下に示すようなものをC言語で作成しようとしています。
例えば、以下の2つのデータファイルがあるとします。
/*(1)価格表.txt*/
わかめ 195
醤油 300
電球 298
… …
… …
納豆 88
(約2000種類)
/*(2)買い物リスト.txt*/
納豆
えび
醤油
…
(約500種類)
この2つのファイルを用いて、「買い物リスト.txt」に書いてあるすべての商品価格の合計値と、価格の平均値を「価格表.txt」を用いて求めるプログラムをC言語で作成してみたいと考えています。
「価格表.txt」の商品数が少なければ、switch文を用いてプログラムを作成することができると思うのですが、「価格表.txt」の商品数が2000種類くらいある場合だと、どのようにプログラムを作成すればよいかわかりません。
よろしければご教授ください。OSはUbuntuを使っております。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
価格表をメモリ上に展開して、買い物リスト一件一件を検索するような
設計にするとシンプルだと思います。
この方針で手抜きプログラムを書くとこんな感じです。
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
// 商品構造体
typedef struct{
char name[1024];
int cost;
} item;
// 商品リストを照合し、item_nameに一致する商品の価格を返す
int get_cost(item *items, char *item_name){
int i;
for(i=0; i<4096; i++){
if(strcmp(items[i].name, item_name) == 0)
return items[i].cost;
}
return 0;
}
int main(void)
{
item items[4096];
FILE *fp_items, *fp_list;
int sum=0;
int i;
char item_name[1024];
bzero(items, sizeof(items));
// ファイルオープン
fp_items = fopen("価格表.txt", "r");
fp_list = fopen("買い物リスト.txt", "r");
// 価格表を構造体に読み込む
for(i=0; fscanf(fp_items, "%s %d\n", items[i].name, &items[i].cost) != EOF; i++);
// 買い物リストから合計額を算出
for(i=0; fscanf(fp_list, "%s\n", item_name) != EOF; i++)
sum += get_cost(items, item_name);
// 表示
printf("total = %d\n", sum);
printf("average = %f\n", (float)sum / i);
// あとかたづけ
fclose(fp_items);
fclose(fp_list);
}
実際にはこれだけではダメです。
僕が先生だったら30点くらいつけます。
・エラー処理
・4096行以上のファイルの対応
・空行、不正行対応
など、完成度を高めるために工夫してみましょう。
ところで、昨日も同じ質問を見かけましたけど、同じ方でしょうか?
みなさんアドバイスありがとうございます。
なんとか解決することができました。
質問はどちらも私が投稿しました。教えてgooとMSNの相談箱に質問を投稿したところ、どちらの質問もそれぞれ2つのサイトに質問がupされると知らなかったので、今回のようなことになりました。今後気をつけます。
No.1
- 回答日時:
価格表.txtを一度全部読んで、何行あるか数える。
その行数分の価格表を格納できる領域をmallocする。
価格表を読んでmallocした領域に商品名と価格を格納する。
買い物リスト.txtを読みながら読み込んだ商品名を検索する。
後は合計と平均を求めるだけ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
エラーがわかりません、、
-
C言語におけるファイル読み込み...
-
fopenでファイル名に、変数を使...
-
c言語でのfscanfについて
-
ファイルへの書込み処理が異常...
-
fscanfでループしてしまう。
-
C言語にてXMLファイルから任意...
-
テキストファイルをバイナリフ...
-
ファイル出力で改行を入れたい!
-
ファイル入出力について教えて...
-
隣接行列を読み込んで有向グラ...
-
C言語 共用体の構造体の引数設定
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
プログラミング初心者です。 Py...
-
複数桁10進数の*桁目だけを抽出...
-
10個出力で改行したいのですが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
c言語でのfscanfについて
-
ガンマ変換 C言語でプログラ...
-
fopenでファイル名に、変数を使...
-
エラーがわかりません、、
-
C言語でクロマキー合成をする方法
-
ファイル出力で改行を入れたい!
-
C言語でファイル読み書きを早く...
-
テキストファイル内に対して, ...
-
ファイルが読み込めない・・・
-
ファイルへの書込み処理が異常...
-
fscanfでループしてしまう。
-
音声データを出力するCプログラ...
-
fgets関数の利用 c言語
-
fgets( ) の返り値は何?
-
日本語ファイル名のFTPについて
-
大量の入力ファイルを扱うとき...
-
【C言語】ファイルを読み込んで...
-
二分探索木への挿入
-
C言語でセグメンテーションエ...
おすすめ情報