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

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

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

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

Q&A

解決済

1回答

1604閲覧

ガウスの消去法で連立方程式を解くプログラムに途中式を書かせたい

Rin001ss

総合スコア1

C

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

0グッド

0クリップ

投稿2021/07/17 01:59

ガウスの消去法を使ってn元連立方程式を解くプログラムです。

計算過程を途中式としてoutput1.datに出力したいのですが、うまくいきません。
アドバイスをお願いしたいです。

#include <stdio.h> #include <stdlib.h> #include <math.h> void input_matrix(int n,double **a,char c,FILE *fin, FILE *fout); void input_vector(int n,double *b,char c,FILE *fin, FILE *fout); double **dmatrix(int nr1,int nr2,int nl1,int nl2); void free_dmatrix(double **a,int nr1,int nr2,int nl1,int nl2); double *dvector(int i,int j); void free_dvector(double *a,int i); double *gauss(int n,double **a,double *b); int main(void){ FILE *fin,*fout; double **a,*b; int i,n; if((fin=fopen("input1.dat","r"))==NULL){ printf("ファイルが見つかりません:input1.dat\n"); exit(1); } if((fout=fopen("output1.dat","w"))==NULL){ printf("ファイルが作成できません:output1.dat\n"); exit(1); } fscanf(fin,"%d",&n); a=dmatrix(1,n,1,n); input_matrix(n,a,'A',fin,fout); fscanf(fin,"%d",&n); b=dvector(1,n); input_vector(n,b,'b',fin,fout); b=gauss(n,a,b); fprintf(fout,"Ax=bの解は次の通りです\n"); for(i=1;i<=n;i++){ fprintf(fout,"%f\n",b[i]); } fclose(fin); fclose(fout); free_dmatrix(a,i,n,i,n);free_dvector(b,1); return 0; } void input_matrix(int n,double **a,char c, FILE *fin,FILE *fout){ int i,j; fprintf(fout,"行列%cは次の通りです\n",c); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ fscanf(fin,"%lf",&a[i][j]); fprintf(fout,"%5.2f\t",a[i][j]); } fprintf(fout,"\n"); } } void input_vector(int n,double *b,char c, FILE *fin,FILE *fout){ int i; fprintf(fout,"ベクトル%cは次の通りです\n",c); for(i=1;i<=n;i++){ fscanf(fin,"%lf",&b[i]); fprintf(fout,"%5.2f\t",b[i]); fprintf(fout,"\n"); } } double **dmatrix(int nr1, int nr2,int nl1, int nl2){ int i,nrow,ncol; double **a; nrow=nr2-nr1+1; ncol=nl2-nl1+1; if((a=malloc(nrow*sizeof(double*)))==NULL){ printf("メモリが確保できません。"); exit(1); } a=a-nr1; for(i=nr1;i<=nr2;i++){ a[i]=malloc(ncol*sizeof(double)); } for(i=nr1;i<=nr2;i++){ a[i]=a[i]-nl1; } return a; } void free_dmatrix(double**a, int nr1, int nr2,int nl1, int nl2){ int i; for(i=nr1;i<=nr2;i++){ free((void*)(a[i]+nl1)); } free((void*)(a+nr1)); } double *dvector(int i,int j){ double *a; if((a=malloc(((j-i+1)*sizeof(double))))==NULL){ printf("メモリが確保できません(from dvectoer)\n"); exit(1); } return(a-i); } void free_dvector(double *a,int i){ free((void*)(a+i)); } double *gauss(int n,double **a,double *b){ int i,j,k,ip; double alpha,tmp; double amax,eps=pow(2.0,-50.0); for(k=1;k<=n-1;k++){ amax=fabs(a[k][k]);ip=k; for(i=k+1;i<=n;i++){ if(fabs(a[i][k])>amax){ amax=fabs(a[i][k]);ip=i; } } if(amax<eps){ printf ("入力した行列は正則ではない!\n"); } if(ip!=k){ for(j=k;j<=n;j++){ tmp=a[k][j];a[k][j]=a[ip][j];a[ip][j]=tmp; } tmp=b[k];b[k]=b[ip];b[ip]=tmp; } for(i=k+1;i<=n;i++){ alpha=-a[i][k]/a[k][k]; for(j=k+1;j<=n;j++){ a[i][j]=a[i][j]+alpha*a[k][j]; } b[i]=b[i]+alpha*b[k]; } } b[n]=b[n]/a[n][n]; for(k=n-1;k>=1;k--){ tmp=b[k]; for(j=k+1;j<=n;j++){ tmp=tmp-a[k][j]*b[j]; } b[k]=tmp/a[k][k]; } return b; }

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

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

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

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

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

episteme

2021/07/17 02:25 編集

「うまくいかない」を説明してください。 計算途中の値を出力しているのはコードのどこですか?
Rin001ss

2021/07/17 02:25

うまくいかないではなく「どこにfprintfすればいいかがわからない」です、すみません
episteme

2021/07/17 02:27 編集

出力先は FILE* fout じゃありませんか? それとも「どこにfprintfすれば...」じゃなくて「どこでfprintfすれば...」ですか?
Rin001ss

2021/07/17 02:29

その通りです
guest

回答1

0

ベストアンサー

C

1void print_matrix(int n, double** a, FILE* fout) { 2 // n*n 行列 a を fout に出力する 3} 4 5void print_vector(int n, double* b, FILE* fout) { 6 // 要素数 n のベクトル b を fout に出力する 7}

を用意し、gauss内のテキトーなところで呼べばいい。
"テキトーなところ"とは ここで途中結果が欲しいナー と思ったところ。

投稿2021/07/17 02:33

編集2021/07/17 02:41
episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問