🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

1140閲覧

C言語のプログラムで解をファイルに出力したい。

Naruto_Netu

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2021/02/27 02:44

前提・実現したいこと

C言語のプログラムで二次元のラプラス方程式の解をファイルに出力するプログラムを作りたいのですが、
うまくいきません。境界条件は、上面だけ100Vで、ほかの面は、0V、そして、上面の角が50Vです。上のようなプログラムを作りました

発生している問題・エラーメッセージ

エラーは、‘v’ undeclared (first use in this function)と、 expected expression before ‘while’ と、 expected ‘;’ before ‘}’ tokenとなります。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4#define EPS 0.001 5#define IMAX 5 6#define JMAX 5 7 8void iteration(double v[][JMAX], int imax , int jmax) 9{ 10 int i,j; 11 v[i][0]=0; 12 v[j][0]=100; 13 v[0][imax]=50; 14 v[imax][jmax]=50; 15 v[0][j]=0; 16 v[imax][j]=0; 17 for(i=1; i<imax-1; i++) 18 { 19 for(j=1; j<jmax-1; j++) 20 { 21 v[i][j]=(v[i][j-1]+v[i-1][j]+v[i][j+1]+v[i+1][j])/4.0; 22 } 23 } 24} 25int check(double a[][JMAX], int imax, int jmax) 26{ 27 double c,b[IMAX][JMAX]; 28 int i,j,flag; 29 for(i=1; i<imax-1; i++) 30 { 31 for(j=1; j<imax-1; j++) 32 { 33 c=(a[i][j-1]+a[i-1][j]+a[i][j+1]+a[i+1][j])/4.0; 34 b[i][j]=a[i][j]-c; 35 if((fabs(b[i][j])-EPS)>0.0) 36 { 37 flag=1; 38 return flag; 39 } 40 else flag=0; 41 } 42 } 43 return flag; 44} 45int main(void) 46{ 47 int *p; 48 p=(int *)malloc(sizeof(int)*290); 49 if(p==NULL) 50 { 51 printf("メモリ確保失敗\n"); 52 exit(-1); 53 } 54 do{ 55 *p=iteration(v,IMAX,JMAX); 56 } while(while(check(a,IMAX,JMAX)); 57 FILE *fp; 58 if((fp=fopen("output.dat","w")) == NULL) 59 { 60 printf("ファイルが作れません。\n"); 61 exit(-1); 62 } 63 fprintf(fp,"%d\n",*p); 64 fclose(fp); 65 free(p); 66 } 67 return 0; 68} 69

試したこと

上のエラーをもとに、whileの部分あたりをいろいろ変えたり、したのですが、うまくいきません。動的メモリやファイル出力に関して、よく分かっていなかったので調べながらしました。また、ラプラス方程式についても知らなかったので調べながら行いました。
このコードの改良すべき点やヒントを教えていただきたいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

C

1 int i,j; 2 v[i][0]=0; 3 v[j][0]=100; 4 v[0][imax]=50; 5 v[imax][jmax]=50;

i も j も初期化せずに、いったい v のどこに値を入れるつもりですか?
上面以外は全部 0 を入れたいのに代入は一つだけですか?
上面には複数の点があって、100 を入れたいのに代入は一つだけですか?
imax は IMAX、jmax は JMAX ですよね。
v[0][imax] も v[imax][jmax] も配列の範囲外です。

他の部分も無茶苦茶で直しようがありません。

「二次元のラプラス方程式の解」というのが何かよく知りませんが、書いてみました。
ファイル出力をどうすればよいのかの参考になりますか?

C

1#include <stdio.h> // fopen, fclose, fprintf, fputc 2#include <math.h> // fabs 3 4#define EPS 0.001 5#define IMAX 5 6#define JMAX 5 7 8void init(double a[IMAX][JMAX]) 9{ 10 for (int j = 1; j < JMAX-1; j++) a[0][j] = 100; 11 a[0][0] = a[0][JMAX-1] = 50; 12 for (int i = 1; i < IMAX; i++) 13 for (int j = 0; j < JMAX; j++) a[i][j] = 0; 14} 15 16int iteration(double a[IMAX][JMAX]) 17{ 18 double b[IMAX][JMAX]; 19 int flag = 0; 20 for (int i = 1; i < 4; i++) 21 for (int j = 1; j < 4; j++) { 22 b[i][j] = (a[i-1][j] + a[i][j-1] + a[i][j+1] + a[i+1][j]) / 4; 23 if (fabs(a[i][j] - b[i][j]) > EPS) flag = 1; 24 } 25 for (int i = 1; i < IMAX-1; i++) 26 for (int j = 1; j < JMAX-1; j++) a[i][j] = b[i][j]; 27 return flag; 28} 29 30int print(double a[IMAX][JMAX]) 31{ 32 FILE *fp = fopen("output.dat", "w"); 33 if (!fp) return 1; 34 for (int i = 0; i < IMAX; i++) { 35 for (int j = 0; j < JMAX; j++) fprintf(fp, "%8.3f", a[i][j]); 36 fputc('\n', fp); 37 } 38 fclose(fp); 39 return 0; 40} 41 42int main(void) 43{ 44 double a[IMAX][JMAX]; 45 init(a); 46 while (iteration(a)) ; 47 print(a); 48} 49 50

投稿2021/02/27 17:36

編集2021/02/28 01:08
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Naruto_Netu

2021/02/28 08:00

参考になります。ありがとうございます。
guest

0

whileの書き方がおかしいですよ
と、vという変数が未定義です

投稿2021/02/27 02:56

編集2021/02/27 02:58
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Naruto_Netu

2021/02/27 10:14

whileの部分についてですが、while(while(check(a,IMAX,JMAX));の後に何かの処理を入れるべきなのでしょうか。もしくは、ほかの方法でしょうか?また、vについてですが、どういう風に定義したらよいのでしょうか。
y_waiwai

2021/02/27 12:59

whileの後ろのカッコの中は条件式が入ります そこにwhileが入るのは明らかにおかしいです。そこらへんの文法を確認してください
jbpb0

2021/02/27 13:06

check(a,... のaも未定義
Naruto_Netu

2021/02/27 13:42

do 何かの処理 while(while...とはできないのですか?
y_waiwai

2021/02/27 13:55

「c言語 do while」でぐぐってでてくるものを読んでみましょう
Naruto_Netu

2021/02/27 14:27

入れ子のようにはできないということですかね。条件式では。 また、vとaをどのように定義したらわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問