こんにちは、最近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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# C言語で移動平均のプログラムを作りたいのですが、数値をファイルから取ってきて計算をするプログラムはど 1 2022/09/29 01:21
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
C言語にてXMLファイルから任意...
-
ファイルに行番号を追加
-
ファイルへの書込み処理が異常...
-
CSVファイルの内容を構造体に格...
-
C言語でファイル名を変数にした...
-
ファイル出力で改行を入れたい!
-
CRC32の計算方法
-
txtファイルの文字を配列に格納
-
[C言語]2つのファイルを用いた...
-
同時にファイル読み込み 書き込み
-
objective-cで、バイナリの読み...
-
C言語でファイル読み書きを早く...
-
構造体のメンバにファイルポイ...
-
初心者のc言語
-
c言語 文字数のカウント 合わ...
-
fscanfでループしてしまう。
-
エラーがわかりません、、
-
作成したプログラムを変更した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ガンマ変換 C言語でプログラ...
-
c言語でのfscanfについて
-
なぜCSQとCIP形式ではコ...
-
複数ファイルの同時読み込みの...
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
ファイルへの書込み処理が異常...
-
【C言語】ファイルを読み込んで...
-
エラーがわかりません、、
-
C言語でセグメンテーションエ...
-
C言語でファイル読み書きを早く...
-
テキストファイル内に対して, ...
-
fgets( ) の返り値は何?
-
ファイルに行番号を追加
-
OpenGLによる描画内容をBMP出力
-
fscanfでループしてしまう。
-
c言語 ファイルから数字を読み...
-
ファイルが読み込めない・・・
-
CRC32の計算方法
-
CSVファイルの内容を構造体に格...
おすすめ情報