プロが教える店舗&オフィスのセキュリティ対策術

こんにちは、最近C言語でファイルを扱うプログラムについて学習しているものです。

2つのファイルを用いて合計値と平均値を求めるプログラムについての質問です。
具体的には、以下に示すようなものをC言語で作成しようとしています。

例えば、以下の2つのデータファイルがあるとします。
/*(1)価格表.txt*/
わかめ 195
醤油 300
電球 298
… …
… …
納豆 88
(約2000種類)

/*(2)買い物リスト.txt*/
納豆
えび
醤油

(約500種類)

この2つのファイルを用いて、「買い物リスト.txt」に書いてあるすべての商品価格の合計値と、価格の平均値を「価格表.txt」を用いて求めるプログラムをC言語で作成してみたいと考えています。

「価格表.txt」の商品数が少なければ、switch文を用いてプログラムを作成することができると思うのですが、「価格表.txt」の商品数が2000種類くらいある場合だと、どのようにプログラムを作成すればよいかわかりません。

よろしければご教授ください。OSはUbuntuを使っております。
よろしくお願いいたします。

A 回答 (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行以上のファイルの対応
・空行、不正行対応
など、完成度を高めるために工夫してみましょう。


ところで、昨日も同じ質問を見かけましたけど、同じ方でしょうか?
    • good
    • 0
この回答へのお礼

みなさんアドバイスありがとうございます。
なんとか解決することができました。

質問はどちらも私が投稿しました。教えてgooとMSNの相談箱に質問を投稿したところ、どちらの質問もそれぞれ2つのサイトに質問がupされると知らなかったので、今回のようなことになりました。今後気をつけます。

お礼日時:2010/11/26 14:18

価格表.txtを一度全部読んで、何行あるか数える。


その行数分の価格表を格納できる領域をmallocする。
価格表を読んでmallocした領域に商品名と価格を格納する。
買い物リスト.txtを読みながら読み込んだ商品名を検索する。
後は合計と平均を求めるだけ。
    • good
    • 0

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