配列の座標値、データ値を読み込んで配列に渡す方法

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

配列の座標値、データ値を読み込んで配列に渡す方法

#1

投稿記事 by とも » 14年前

こんにちは。ともと申します。m(_ _)m
下の添付プログラムの62行から73行あたり
(ここがわかりませんと書いているところです)が書けず
困っています。

私としては、
(1) 配列A[][]から座標(s,t)を読み込んで、

その座標におけるB,Cの値を配列B,Cへ格納できるようにする.

(2) (0,0)は(s,t)座標系の原点となるようにする.

(3) test.txtの座標値が変わってもちゃんと(1),(2)を満たすように

配列B,Cへ格納できるようにする.

(1)-(3)の流れをプログラム化すればよいと思うのですが、
どう書いてよいかわかりません。

どなたか、教えていただけませんでしょうか?
よろしくお願いします!


==== data.txt ===========
-1 -1 0.02 0.01
-1 0 0.03 0.02
-1 1 0.01 0.05
0 -1 0.04 0.06
0 0 0.05 0.07
0 1 0.06 0.08
1 -1 0.07 0.09
1 0 0.01 0.00
1 1 0.04 0.01
==========================

コード:

 
#include<stdio.h>
#include<stdlib.h>

FILE *fin;
FILE *fout;

int main(void){
	
	int    i,j,s,t;
	int    nn;
	int    ch;
	int    array_number;
	double A[20][20],B[20][20],C[20][20];
	
	// test.txtの行数をカウント
	nn=0;
	array_number=0;
	if( (fin = fopen("data.txt","r")) == NULL ){
	printf("error.file does not exist.\n");
	exit(1);
	}else{
		while( (ch=fgetc(fin)) != EOF )
		if (ch=='\n')
	        nn++;
		    array_number=nn;
	printf("array_number = %d\n",array_number);
	}
	fclose(fin);
	
	// test.txtのデータを読み込み配列A[][]に入れる
	//   s   t    B     C
	//  -1  -1   0.02  0.01
    //  -1   0   0.03  0.02
    //  -1   1   0.01  0.05
    //   0  -1   0.04  0.06
    //   0   0   0.05  0.07
    //   0   1   0.06  0.08
    //   1  -1   0.07  0.09
    //   1   0   0.01  0.00
    //   1   1   0.04  0.01
	fin = fopen("data.txt","r");
	for(j=0;j<array_number;j++){
		for(i=0;i<4;i++){
    		fscanf(fin, "%lf",&A[i][j]) != EOF;
				}
			}
	fclose(fin);
	
	// 確認
	fout = fopen("check.txt","w");
	for(j=0;j<array_number;j++){
		for(i=0;i<4;i++){
		   fprintf(fout,"%lf\n",A[i][j]);
		}
	fprintf(fout,"\n");
	}
	fprintf(fout,"\n");
	fclose(fout);
	

	// ここがわかりません・・(--;
	// [1] 配列A[][]から座標(s,t)を読み込んで、
	//     その座標におけるB,Cの値を配列B,Cへ格納できるようにする.
	// [2] (0,0)は(s,t)座標系の原点となるようにする.
	// [3] test.txtの座標値が変わってもちゃんと[1],[2]を満たすように
	//     配列B,Cへ格納できるようにする.
	for(t=0;t<20;t++){
			for(s=0;s<20;s++){
				B[s][t] = A[i][j]; 
				C[s][t] = A[i][j]; 
	 	}
	}
	
	// 結果の出力
	fout=fopen("output.txt","w");
	for(t=0;t<20;t++){
		for(s=0;s<20;s++){
		 fprintf(fout,"%5d %5d %5.1f %5.1f\n",s,t,B[s][t],C[s][t]);
	 	}
		fprintf(fout,"\n");
	}
	fprintf(fout,"\n");
	fclose(fout);
}

 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の座標値、データ値を読み込んで配列に渡す方法

#2

投稿記事 by softya(ソフト屋) » 14年前

ここまで書けたのですから、もっと細かく分解してみましょう。
// [1] 配列A[][]から座標(s,t)を読み込んで、
// その座標におけるB,Cの値を配列B,Cへ格納できるようにする.
// [2] (0,0)は(s,t)座標系の原点となるようにする.
// [3] test.txtの座標値が変わってもちゃんと[1],[2]を満たすように
// 配列B,Cへ格納できるようにする.
まず、最初に
[1]ですが、配列A[][]からs,tをとりだすのとB,Cの値を取り出すことは出来ますか?
これが出来たら次に進みます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

とも

Re: 配列の座標値、データ値を読み込んで配列に渡す方法

#3

投稿記事 by とも » 14年前

すいません!ともです。(> <)
プログラム一部変なところがありました!
再添付します。
よろしく願いします!m(_ _)m

コード:

 
#include<stdio.h>
#include<stdlib.h>

FILE *fin;
FILE *fout;

int main(void){
	
	int    i,j,s,t;
	int    nn;
	int    ch;
	int    array_number;
	double A[20][20],B[20][20],C[20][20];
	
	// test.txtの行数をカウント
	nn=0;
	array_number=0;
	if( (fin = fopen("data.txt","r")) == NULL ){
	printf("error.file does not exist.\n");
	exit(1);
	}else{
		while( (ch=fgetc(fin)) != EOF )
		if (ch=='\n')
	        nn++;
		    array_number=nn;
	printf("array_number = %d\n",array_number);
	}
	fclose(fin);
	
	// test.txtのデータを読み込み配列A[][]に入れる
	//   s   t    B     C
	//  -1  -1   0.02  0.01
    //  -1   0   0.03  0.02
    //  -1   1   0.01  0.05
    //   0  -1   0.04  0.06
    //   0   0   0.05  0.07
    //   0   1   0.06  0.08
    //   1  -1   0.07  0.09
    //   1   0   0.01  0.00
    //   1   1   0.04  0.01
	fin = fopen("data.txt","r");
	for(j=0;j<array_number;j++){
		for(i=0;i<4;i++){
    		fscanf(fin, "%lf",&A[i][j]) != EOF;
				}
			}
	fclose(fin);
	
	// 確認
	fout = fopen("check.txt","w");
	for(j=0;j<array_number;j++){
		for(i=0;i<4;i++){
		   fprintf(fout,"%lf\n",A[i][j]);
		}
	fprintf(fout,"\n");
	}
	fprintf(fout,"\n");
	fclose(fout);
	

	// ここがわかりません・・(--;
	// [1] 配列A[][]から座標(s,t)を読み込んで、
	//     その座標におけるB,Cの値を配列B,Cへ格納できるようにする.
	// [2] (0,0)は(s,t)座標系の原点となるようにする.
	// [3] test.txtの座標値が変わってもちゃんと[1],[2]を満たすように
	//     配列B,Cへ格納できるようにする.
	for(j=0;j<20;j++){
			for(i=0;i<20;i++){
				s=i-10;
				t=j-10;
		        B[i][j] = 0.0; // ??
				C[i][j] = 0.0; // ??
				//B[i][j] = A[i][j]; // ??
				//C[i][j] = A[i][j]; // ??
	 	}
	}
	
	// 結果の出力
	fout=fopen("output.txt","w");
	for(j=0;j<20;j++){
		for(i=0;i<20;i++){
			s=i-10;
		    t=j-10;
		 fprintf(fout,"%5d %5d %5.1f %5.1f\n",s,t,B[i][j],C[i][j]);
	 	}
		fprintf(fout,"\n");
	}
	fprintf(fout,"\n");
	fclose(fout);
}
 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の座標値、データ値を読み込んで配列に渡す方法

#4

投稿記事 by softya(ソフト屋) » 14年前

少なくとも下記のコードは、配列A[][]から取り出していません。

コード:

               s=i-10;
                t=j-10;
                B[i][j] = 0.0; // ??
                C[i][j] = 0.0; // ??
自分でも書かれているとおり[1]配列A[][]から座標(s,t)を読み込んで、
の配列A[][]からの部分が完全に抜け落ちています。

失礼ですが他の部分は自分で全部書かれたのですか?それとも一部だけですか?
正直にお答え下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

とも

Re: 配列の座標値、データ値を読み込んで配列に渡す方法

#5

投稿記事 by とも » 14年前

softyaさま

すいません.
softyaさまの返信に気付かず、
ちょっとしたミスに気付いた為慌てて再添付しました。
ちなみに、プログラムは全て自分で書いたものです。

>[1]ですが、配列A[][]からs,tをとりだすのとB,Cの値を取り出すことは出来ますか?

printf("s=%5.5f\n",A[0][0]);
printf("t=%5.5f\n",A[1][0]);
printf("B=%5.5f\n",A[2][0]);
printf("C=%5.5f\n",A[3][0]);

を加えれば、第0行目のs,t,B,Cは取り出せていることが確認できます。
つまり、array_number行までについて、A[0][0]などとすれば値はとりだせます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の座標値、データ値を読み込んで配列に渡す方法

#6

投稿記事 by softya(ソフト屋) » 14年前

それでは、一行づつそれぞれ変数のvs,vt,vB,vCに取り出してみてください。
この時、それぞれ変数の意味もコメントして書いてみてください。
それと取り出すところは一行づつのループにしてください(決して座標のループにしないでください)。

このループは座標のループです。

コード:

    for(j=0;j<20;j++){
            for(i=0;i<20;i++){
                s=i-10;
                t=j-10;
                B[i][j] = 0.0; // ??
                C[i][j] = 0.0; // ??
                //B[i][j] = A[i][j]; // ??
                //C[i][j] = A[i][j]; // ??
        }
    }
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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