ガウスの消去法:C言語
連立方程式をガウスの消去法を用いて解くプログラミングをVisual Studioで作成したいのですが、ビルドがうまくいきません
ビルドをすると、
・リンケージ指定子がグローバル スコープで宣言されていません
・直前のエラーを修復できません。コンパイルを中止します。
と表示されデバックできません。
どなたかご教授願います。
ちなみに、C++ win32コンソールアプリケーションを使用しています。
ソースコード↓
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
#include <stdio.h>
#include <math.h>
#define EPS 1.0e-5
#define N 10
void DATAIN(char name[], int nr, int nc, double ma[]);
void RESULT(char name[], int nr, int nc, double ma[]);
int PIVOT(int *num, int nr, int k, double ma[]);
int GAUSS(int nr, double ma[], double mb[], double mx[]);
int main(void)
{
int nr,nc;
int flag;
double ma[N*N],mb[N],mx[N];
printf("方程式の数 nr=");
scanf("%d",&nr);
nc=nr;
printf("\n配列maのデータ%d*%d=%d",nr,nr,nr*nr);
printf("個を入力");
DATAIN("ma",nr,nc,ma);
printf("\n配列mbのデータ %d 個を",nr);
printf("入力してください");
DATAIN("mb",nr,1,mb);
flag=GAUSS(nr,ma,mb,mx);
if(flag) printf("計算不能");
else RESULT("mx",nr,1,mx);
return (0);
}
void DATAIN(char name[], int nr, int nc, double ma[])
{
int i,j;
printf("\n---入力データ---\n");
for(i=0; i<nr; i++)
{
for(j=0; j<nc; j++)
{
printf(" %s[%d%d] = ",name,i+1,j+1);
scanf("%lf",&ma[nc*i+j]);
}
}
}
void RESULT(char name[], int nr, int nc, double ma[])
{
int i,j;
printf("\n---計算結果---\n");
for(i=0; i<nr; i++)
{
for(j=0; j<nc; j++)
printf(" %s[%d] = %8.5lf",name,i+1,ma[nc*i+j]);
printf("\n");
}
}
int PIVOT(int *num, int nr, int k, double ma[])
{
int i;
double aa,bb;
*num=k; aa=fabs(ma[nr*k+k]);
for(i=k+1; i<nr; i++)
{
if (fabs(ma[nr*i+k])>aa)
{
*num=i; aa=fabs(ma[nr*i+k]);
}
}
if(fabs(aa)<=EPS) return (1);
if(*num==k) return (0);
for(i=k; i<nr; i++)
{
bb=ma[nr*k+i];
ma[nr*k+i]=ma[nr*(*num)+i];
ma[nr*(*num)+i]=bb;
}
return (0);
}
int GAUSS(int nr, double ma[], double mb[], double mx[])
{
int i,j,k;
int num;
double cc;
for(k=0; k<nr-1; k++)
{
if(PIVOT(&num,nr,k,ma)!=0) return (1);
if(num!=k)
{
cc=mb[num]; mb[num]=mb[k]; mb[k]=cc;
}
for(i=k+1; i<nr; i++)
{
cc=ma[nr*i+k]/ma[nr*k+k];
for(j=k+1; j<nr; j++)
ma[nr*i+j]=ma[nr*i+j]-cc*ma[nr*k+j];
mb[i]=mb[i]-cc*mb[k];
}
}
for(k=nr-1; k>=0; k--)
{
if(fabs(ma[nr*k+k])<=EPS) return(1);
cc=0.0;
for(j=k+1; j<nr; j++)
cc+=ma[nr*k+j]*mx[j];
mx[k]=(mb[k]-cc)/ma[nr*k+k];
}
return (0);
}
return 0;
}
お礼
お礼が遅れて大変申し訳ありませんでした。 おかげさまで、正しく逆行列を求めることが できました。 今後も、お世話になることがあれば どうぞよろしくお願いします ありがとうございました。