ここから本文です

C言語によるプログラミングについて質問があります。 ファイルからの値を読み込ん...

mwa********さん

2019/7/2411:26:59

C言語によるプログラミングについて質問があります。
ファイルからの値を読み込んで配列に格納して、その配列を用いて計算処理を行うプログラミングを作成しています。下記に作成したプログラムを示しています。

計算処理として、配列内の値を全て計算し、その作業を複数回ループさせています。(差分法によるPoisson方程式の解です)

課題点としてfor文とwhile文を使用しているため、ファイルから読み込んだ値も計算してしまいます。理想としてはファイルから読み込んだ値は変更せずに計算処理を行いたいです。そのためには、if文などを用いてファイルから読み込んだ値を除いて計算をするorファイルから読み込んだ値を定数的なものとする方法などがあるのではないかと考えています。しかしながら、具体的にどのように書けば良いのかが分かりません。

説明が分かりにくいかもしれませんが、どうか教えて頂けないでしょうか。

#include <stdio.h>
#include <math.h>
#pragma warning(disable: 4996)

constexpr auto N = 50; // マクロ定義

int main(void) { // メインルーチン

double phi[N][N]; // 計算するべき電位
int i, j;
int loop; // 繰り返しカウンタ
FILE *fp1; // ファイル

for (i = 0; i < N; i++) { // phi(i, j),rho(i, j)をクリアする
for (j = 0; j < N; j++) {
phi[i][j] = 0.0;
}
}

fp1 = fopen("txt.dat", "r"); // ファイルを開く
if (fp1 == NULL) {
printf("ファイルを開けませんでした \n");
return -1;
}

while ((fscanf(fp1, " %d", &i) != EOF) && (fscanf(fp1, " %d", &j) != EOF) && (fscanf(fp1, " %lf", &phi[i][j]) != EOF)) { // ファイルからの入力値を配列に格納
printf("a[%d][%d] = %lf\n", i, j, phi[i][j]);
}
fclose(fp1);

loop = 0; // ループ数のカウント

while (1000 > loop) {
for (i = 1; i < N - 1; i++) { // 領域端を除く全ての点をループ
for (j = 1; j < N - 1; j++) {

phi[i][j] = 0.25 *(phi[i + 1][j] + phi[i - 1][j] + phi[i][j + 1] + phi[i][j - 1]); // Poissonの方程式を用いてphiを計算
}
}
loop++;
} // 1000回ループしたら終了

for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf( "%d, %d, %lf \n", i, j, phi[i][j]); // 計算した値を表示
}
}
return 0;
}

閲覧数:
15
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

2019/7/2411:41:16

これじゃダメかな?

double phi_org[N][N]; // ファイルの値

while ((fscanf(fp1, " %d", &i) != EOF) && (fscanf(fp1, " %d", &j) != EOF) && (fscanf(fp1, " %lf", &phi[i][j]) != EOF)) { // ファイルからの入力値を配列に格納

phi_org[i][j]=phi[i][j];//ここ

printf("a[%d][%d] = %lf\n", i, j, phi[i][j]);
}

質問した人からのコメント

2019/7/25 11:07:34

ありがとうございます。
単純なことでした。お手数をお掛けしました。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる