質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Q&A

解決済

4回答

10659閲覧

gaussの消去法について、C言語によるプログラム

tennis1202

総合スコア17

C

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

0グッド

0クリップ

投稿2016/11/16 03:19

ガウスの消去法についてC言語によるプログラムを作成したのですが、
解が表示されることなくエラーが出ます。
プログラムのどこが間違っているのか教えていただけると
幸いです。

#include<stdio.h> #define N 3; void gauss_elm(double a[][3],double b[],int n); int main(void){ double a[][3]={{2,4,6},{3,8,7},{5,7,21}}; double b[]={6,15,24}; gauss_elm(a,b,3); return 0; } void gauss_elm(double a[][3],double b[],int n){ int i,j,k; double pivot,m,x,n; for(k=1;k<=n-1;k++) { pivot=a[k][k]; for(i=k+1;i<=n;i++) { m=a[i][k]/pivot; for(j=k+1;i<=n;i++) { a[i][j]=a[i][j]-m*a[k][j];} b[i]=b[i]-m*b[k];} } x[n]=b[n]/a[n][n]; for(i=n-1;i>=1;i--){ for(j=i+1;j<n;j++){ b[i]=b[i]-a[i][j]*b[j]; } x[i]=b[i]/a[i][i];} for(i=1;i<=n;i++) { printf("x[i]\n",b[i]); }---

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

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

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

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

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

guest

回答4

0

ベストアンサー

一応お答えはでます。

#include<stdio.h> #define N 3 void gauss_elm(double a[N][N],double b[N],int n); int main(void){ double a[N][N]={{2,4,6},{3,8,7},{5,7,21}}; double b[N]={6,15,24}; gauss_elm(a,b,N); return 0; } void gauss_elm(double a[N][N],double b[N],int n){ int i=0; int j=0; int k=0; double pivot,m; double x[N]; for(k=0;k<n-1;k++) { if ((pivot=a[k][k])==0){ printf("too small pivot! \n"); return; } for(i=k+1;i<=n-1;i++) { m=a[i][k]/pivot; for(j=k+1;j<=n-1;j++){ a[i][j]=a[i][j]-m*a[k][j]; } b[i]=b[i]-m*b[k]; } } for(i=n-1;i>=0;i--){ if(i!=n-1){ for (k=n-1;k>i;k--){ b[i]=b[i] - a[i][k]*b[k]; } } if (a[i][i]==0){ printf("zero devided error\n"); return; } b[i]=b[i]/a[i][i]; } for(i=0;i<N;i++) { printf("x[%f]\n",b[i]); } }

投稿2016/11/16 15:31

編集2016/11/17 03:56
A.Ichi

総合スコア4070

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

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

majiponi

2016/11/17 03:35

この問題には答えられるけど、{0,0,1}{1,0,0}{0,1,0}みたいなちょっとだけ意地悪な入力をしたら止まってしまうのでは?
A.Ichi

2016/11/17 03:58

的確なご指摘有難うございます。とりあえずですが、ゼロデバイドは対応しました。ピボットが極小になるケースには未対応です。
guest

0

配列の参照要素が1始まりになっている。
例えば
for(i=1;i<=n;i++)

for(i=0;i<n;i++)
では。
あとは他の回答者さんと同じ。

投稿2016/11/16 04:15

ttyp03

総合スコア16996

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

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

0

エラーが出ます

コンパイルエラー、という解釈でよろしいですね?
読んだ感じ、とりあえず3箇所誤りを見つけました。

  1. define文が;(セミコロン)で終わっている
  2. gauss_elm関数(?)の中で、nを二重に定義している
  3. gauss_elm関数が終わっていない(最後の閉じかっこがない)

あと、動かしたときに実行時エラーが出ると思います(ゼロ除算)が、机上デバッグの結果なのであまり自信ないです。
上記の3点を直して、それでもコンパイル・エラーが出るようなら追記してください。補足します。

投稿2016/11/16 03:56

majiponi

総合スコア1720

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

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

tennis1202

2016/11/16 04:28

void gauss_elm(double a[][3],double b[],int n){ int i,j,k; double pivot,m,x; for(k=1;k<=n-1;k++) { pivot=a[k][k]; for(i=k+1;i<=n;i++) { m=a[i][k]/pivot; for(j=k+1;i<=n;i++) { a[i][j]=a[i][j]-m*a[k][j];} b[i]=b[i]-m*b[k];} } } x[n]=b[n]/a[n][n]; for(i=n-1;i>=1;i--){ for(j=i+1;j<n;j++){ b[i]=b[i]-a[i][j]*b[j]; } x[i]=b[i]/a[i][i];} for(i=0;i<n;i++) { printf("%f %f\n",x[i],b[i]); } あらたにこのように直したのですが、 nが定義されていません。 となり、コンパイルエラーが出てしまいました。
majiponi

2016/11/16 06:20 編集

修正案を、普段私が使っている書式で書き直してみました(全角空白は、実際は半角タブ) void gauss_elm(double a[][3],double b[],int n) {  int i,j,k;  double pivot,m,x;  for(k=1;k<=n-1;k++){   pivot=a[k][k];   for(i=k+1;i<=n;i++){    m=a[i][k]/pivot;    for(j=k+1;i<=n;i++){     a[i][j]=a[i][j]-m*a[k][j];    }    b[i]=b[i]-m*b[k];   }  } } // ここで関数が終わっちゃうよ>< x[n]=b[n]/a[n][n]; for(i=n-1;i>=1;i--){  for(j=i+1;j<n;j++){   b[i]=b[i]-a[i][j]*b[j];  }  x[i]=b[i]/a[i][i]; } for(i=0;i<n;i++){  printf("%f %f\n",x[i],b[i]); } // 本来はここで関数が終わらなきゃいけないのだ>< 途中で関数が終わっていますよね? 要するに、今度は閉じかっこをつける位置を間違えているわけです。これを最後にもってくれば、nが定義されていない、というエラーは消えると思います。
guest

0

’printf("x[i]\n",b[i]);’は'printf("%f %f\n",x[i],b[i]);'では?

投稿2016/11/16 03:56

編集2016/11/16 03:57
MasahikoHirata

総合スコア3747

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問