在庫処理のプログラミング(ファイル)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
AKi

在庫処理のプログラミング(ファイル)

#1

投稿記事 by AKi » 14年前

大学のC言語の課題で、どうしても出来ない課題があります。

その課題内様は、『前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作成せよ。また、ファイルの各レコード(行)は次の形式で、ひとつの商品に対してひとつのレコードとする。
商品コード 整数 4桁
数量 数字 4桁
さらに、各ファイルは商品コードの昇順にソートされているものとする。』というものです。
サイトや教科書でいろいろ調べたのですが、全く分かりませんでした。
どなたか教えていただけないでしょうか。

%more zaiko.txt
0001 19
0013 13
0029 24
0048 9
0052 6
0070 7
0074 34
0149 21
0203 8
0226 1
1129 36
1802 7
2207 9

%more nyuko.txt
0048 6
0074 5
0142 22
0326 44
% cc -o kadai_5-4 kadai_5-4.c
% ./kadai_5-4 zaiko.txt nyuko.txt zaiko_new.txt
% cat zaiko_new.txt
0001 19
0013 13
0029 24
0048 15
0052 6
0070 7
0074 39
0142 22
0149 21
0203 8
0226 1
0326 44
1129 36
1802 7
2207 9

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 在庫処理のプログラミング(ファイル)

#2

投稿記事 by bitter_fox » 14年前

課題との事なのでソースコードは控えさせていただいて、流れとしては以下のようになると思います。

1.「zaiko.txt」「nyuko.txt」ファイルをオープンします。(要エラーチェック)(fopen)
2.両ファイルの内容を読み込みます。(fscanf)

3.nyukoの内容を、各レコードずつ既にzaikoに存在しているかをチェックします。
3-1.存在していた場合
zaiko側の情報にzaiko側の数量とnyuko側の数量を足します。
3-2.存在していなかった場合
zaiko側に新たにnyukoのレコードの情報を追加します。

4.「zaiko_new.txt」ファイルをオープンします。(要エラーチェック)(fopen)
5.zaikoの情報をソートして、「zaiko_new.txt」に書き込みます。(fprintf)

6.最後に確保したすべてのリソースを解放します。

どの時点でソートするかですが、3-2の段階で適切な位置に挿入するのも良いですね。

どこが、わからないのかを細かく言っていただいたら、もっと詳細なヒントを出せます。

[hr]
言うほど良くないので編集。
最後に編集したユーザー bitter_fox on 2010年12月03日(金) 00:25 [ 編集 1 回目 ]

non
記事: 1097
登録日時: 14年前

Re: 在庫処理のプログラミング(ファイル)

#3

投稿記事 by non » 14年前

マッチングで検索したら、いろいろ出そうですけど。
たとえば、
http://www.geocities.jp/kmctecyh/k_text ... 010403.PDF
non

Aki

Re: 在庫処理のプログラミング(ファイル)

#4

投稿記事 by Aki » 14年前

回答ありがとうございます。
とりあえずアドバイスを頼りに作ってみます。

ki

Re: 在庫処理のプログラミング(ファイル)

#5

投稿記事 by ki » 14年前

とりあえずここまでできましたが、コンパイルエラーが出ないのにも関わらず、new_zaiko.txtになにも表示されませんT_T

どうしたらいいのでしょうか…

コード:

#include<stdio.h>

#include<stdlib.h>



#define NUMBER 100





typedef struct{

	int goods_code;

	int number;

}pdata;





void swap(pdata *x,pdata *y)

{
	pdata temp=*x;

	*x=*y;

	*y=temp;

}





void sort(pdata data[],int n)

{

	int k=n-1;

	while(k>=0){

		int i,j;

		for(i=1,j=-1;i<=k;i++){

			if(data[i-1].number>data[i].number){

				j=i-1;

				swap(&data[i],&data[j]);

			}	

		k=j;

		}

	}

}







int main(int argc,char argv[])

{

	FILE *fp1,*fp2;

	int i,j;

	int kosu1=0;

	int kosu2=0;

	int kosu3=0;

	pdata data1[NUMBER];

	pdata data2[NUMBER];

	pdata data3[NUMBER];

	char c;

	

	if( (fp1=fopen("zaiko.txt","r"))==NULL) {

		printf("入力ファイルがオープンできません¥n");

		exit(EXIT_FAILURE);

	}

	if( (fp1=fopen("nyuko.txt","r"))==NULL) {

		printf("入力ファイルがオープンできません¥n");

		exit(EXIT_FAILURE);

	}



	while(fscanf(fp1,"%d%d",&data1[kosu1].number,&data1[kosu1].goods_code)==2){

		kosu1++;

	}



	while(fscanf(fp1,"%d%d",&data2[kosu2].number,&data2[kosu2].goods_code)==2){

		for(i=0;i<=kosu1;i++){

			if(data2[kosu2].number==data1[i].number){

				data2[kosu2].goods_code=data1[i].goods_code+data2[kosu2].goods_code;

				data2[kosu2].number=data1[i].number;

			}

		}

		kosu2++;

	}



	for(j=0;j<=kosu1;j++){

		data3[kosu3].number=data2[j].number;

		data3[kosu3].number=data1[j].number;

	

		data3[kosu3].goods_code=data2[j].goods_code;

		data3[kosu3].goods_code=data2[j].goods_code;
		kosu3++;

	}



	sort(data3,kosu3);



	if( (fp2=fopen("new_zaiko.txt","w"))==NULL){

		printf("入力ファイルがオープンできません¥n");

		exit(EXIT_FAILURE);

	}



	while((c=fgetc(fp1))!=EOF){
		fputc(c,fp2);
  	}	



	fclose(fp1);

	fclose(fp2);



	return(0);

}


アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 在庫処理のプログラミング(ファイル)

#6

投稿記事 by bitter_fox » 14年前

結構問題点が多いですね。

コード:

   if( (fp1=fopen("zaiko.txt","r"))==NULL) {
 
        printf("入力ファイルがオープンできません¥n");
 
        exit(EXIT_FAILURE);
 
    }
 
    if( (fp1=fopen("nyuko.txt","r"))==NULL) {
 
        printf("入力ファイルがオープンできません¥n");
 
        exit(EXIT_FAILURE);
 
    }
これでは、fp1が上書きされて「nyuko.txt」のファイルポインタが入ってしまいます。

コード:

    while(fscanf(fp1,"%d%d",&data1[kosu1].number,&data1[kosu1].goods_code)==2){
        kosu1++;
    }
    while(fscanf(fp1,"%d%d",&data2[kosu2].number,&data2[kosu2].goods_code)==2){
        for(i=0;i<=kosu1;i++){
            if(data2[kosu2].number==data1[i].number){
                data2[kosu2].goods_code=data1[i].goods_code+data2[kosu2].goods_code; 
                data2[kosu2].number=data1[i].number;
            }
         }
         kosu2++; 
    }
「数字_数字」(_はスペース)の状態でファイルに入っているので
fscanf(fp, "%d %d", ...);
このように、%dと%dの間にスペースを入れる必要があります。

あと、単語の意味から考えて、numberとgoods_codeの使われ方が逆になっていると思うのですが。

コード:

    for(j=0;j<=kosu1;j++){
        data3[kosu3].number=data2[j].number;
        data3[kosu3].number=data1[j].number;
 
        data3[kosu3].goods_code=data2[j].goods_code;
        data3[kosu3].goods_code=data2[j].goods_code;
        kosu3++;
    }
ここの処理は何をやっているのかちょっと良くわからないので、意図を教えてください。。

コード:

    if( (fp2=fopen("new_zaiko.txt","w"))==NULL){
        printf("入力ファイルがオープンできません¥n");
        exit(EXIT_FAILURE);
 
    }
    while((c=fgetc(fp1))!=EOF){
        fputc(c,fp2);
    }   
出力したいのは読み込んだデータなので、
while((c=fgetc(fp1))!=EOF){
fputc(c,fp2);
}
これでは、意図した出力になりません。(ちなみに、先の読み込みでファイルポインタが進んでファイルの終点にあるので、そのwhileの中は一回も実行されません。)
[hr][修正]
あいだのスペースは省略可能でした。

Aki

Re: 在庫処理のプログラミング(ファイル)

#7

投稿記事 by Aki » 14年前

すみません、自己解決できました。ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る