解決済みの質問
大学の課題であるC言語でのプログラム作成補助のお願いです。学んだのはポインタ操...
大学の課題であるC言語でのプログラム作成補助のお願いです。学んだのはポインタ操作までのC言語の基礎程度ですのでライブラリにあまり詳しくありません。未熟で大変ご迷惑をお掛けしますが宜しくお願いします。
マスタファイル(部No,課No,支出累計)
支出ファイル(部No,課No,支出額)
代表者名ファイル(部No,課No,氏名)
の3つのファイルから
支出管理リスト(部No,課No,氏名,支出累計)
新マスタファイル(マスタファイルと同じ)
の2つのファイルを出力できるプログラムを作りたいです。
全体の流れは、部キー、課キーを設定してマスタ、支出ファイルを見比べ、一つずつ計算していくというブレークダウンの表現をしているため、これに沿いたいです。
例示プログラムを示していただけるととても嬉しいですが、大変労力のいる事ですのでキーの使い方や、氏名を出力する際の方法が一番知りたいです。
大変恐縮ですが宜しくお願いします。
-
- 質問日時:
- 2008/8/19 22:51:47
-
- 解決日時:
- 2008/9/3 04:00:48
-
- 回答数:
- 1
-
- お礼:
- 知恵コイン
- 250枚
-
- 閲覧数:
- 561
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
/*
コンパイルOK、実行なし、字数節約
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MLST 100
typedef struct {
int div;
int sec;
char nam[32];
int tot;
} LIST;
// 現マスタ→テーブル
int readmaster(
FILE *fold,
LIST lst[],
int *nlst)
{
int stt=0;
int n=0;
char bffr[80];
// 読み込み、[',',' ','\t'のいずれかで区切り]
while( fgets(bffr,80,fold) != NULL ) {
lst[n].div=atoi(strtok(bffr,", \t\n"));
lst[n].sec=atoi(strtok(NULL,", \t\n"));
lst[n].tot=atoi(strtok(NULL,", \t\n"));
*(lst[n].nam)='\0';
if( n>=MLST) {
stt=1; break;
} else {
n++;
}
}
*nlst=n;
return stt;
}
// 代表者名→テーブル
int readmanger(
FILE *fmgr,
LIST lst[],
int nlst)
{
int stt=0;
int n;
char bffr[80];
int div;
int sec;
char nam[32];
while( fgets(bffr,80,fmgr) != NULL ) {
div=atoi(strtok(bffr,", \t\n"));
sec=atoi(strtok(NULL,", \t\n"));
strcpy(nam,strtok(NULL,", \t\n"));
for(n=0;n<nlst;n++) {
if(lst[n].div != div) continue;
if(lst[n].sec != sec) continue;
strcpy(lst[n].nam,nam);
break;
}
}
stt=0;
for(n=0;n<nlst;n++) {
if(*(lst[n].nam)=='\0') {
stt=1; break;
}
}
return stt;
}
// 支出→足し込み
int readtransa(
FILE *ftrn,
LIST lst[],
int nlst)
{
int stt=0;
int n;
char bffr[80];
int div;
int sec;
int exp;
while( fgets(bffr,80,ftrn) != NULL ) {
div=atoi(strtok(bffr,", \t\n"));
sec=atoi(strtok(NULL,", \t\n"));
exp=atoi(strtok(NULL,", \t\n"));
for(n=0;n<nlst;n++) {
if(lst[n].div != div) continue;
if(lst[n].sec != sec) continue;
lst[n].tot += exp;
break;
}
if(n==nlst) stt++;
}
if(stt>0) stt=1;
return stt;
}
// テーブル→新マスター
void prntmaster(
LIST lst[],
int nlst,
FILE *fnxt)
{
int n;
for(n=0;n<nlst;n++) {
fprintf(fnxt," %d",lst[n].div);
fprintf(fnxt," %d",lst[n].sec);
fprintf(fnxt," %d",lst[n].tot);
} fprintf(fnxt,"\n");
return;
}
// テーブル→支出管理レポート
void prntreport(
LIST lst[],
int nlst,
FILE *flst)
{
int n;
for(n=0;n<nlst;n++) {
fprintf(flst," %d",lst[n].div);
fprintf(flst," %d",lst[n].sec);
fprintf(flst," %32s",lst[n].nam);
fprintf(flst," %d",lst[n].tot);
} fprintf(flst,"\n");
return;
}
// メイン
int main(){
LIST lst[MLST];
int nlst=0;
int stt;
FILE *fold,*ftrn,*fmgr,*flst,*fnxt;
fold=fopen("master.old","r");
ftrn=fopen("transa.txt","r");
fmgr=fopen("manger.txt","r");
flst=fopen("report.lst","w");
fnxt=fopen("master.nxt","w");
stt=readmaster(fold,lst,&nlst);
if( stt == 0 ) {
stt=readmanger(fmgr,lst,nlst);
}
if( stt == 0 ) {
stt=readtransa(ftrn,lst,nlst);
}
if( stt == 0 ) {
prntmaster(lst,nlst,fnxt);
prntreport(lst,nlst,flst);
}
return stt;
}
- 違反報告
- 編集日時:2008/8/21 07:44:30
- 回答日時:2008/8/20 00:27:08
この質問は投票によってベストアンサーが選ばれました!
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
2人が役に立つと評価しています。

